Java面向对象-多态性

一、多态性

  • 多态性的体现:
 - 方法的重载和重写
 - 对象的多态性
  • 对象的多态性:
  • 向上转型:程序会自动完成
    父类 父类对象 = 子类实例
  • 向下转型:强制类型转换
    子类 子类对象 = (子类)父类实例
代码一  : 向上转型

class A2{
    public void tell1() {
        System.out.println("A2---tell1");
    }
    public void tell2() {
        System.out.println("A2---tell2");

    }
}
class B2 extends A2{
    public void tell1() {
        System.out.println("B2---tell1");
    }
    public void tell3() {
        System.out.println("B2--tell3");
    }
}
public class Demo22 {
    public static void main(String[] args) {
        //向上转型
        B2 b = new B2();
        A2 a=b;
        a.tell1();//tell1是重写的,调用的是重写之后的方法
        a.tell2();
    }
}

结果:
B2---tell1
A2---tell2

代码二 : 向下转型

class A2{
    public void tell1() {
        System.out.println("A2---tell1");
    }
    public void tell2() {
        System.out.println("A2---tell2");

    }
}
class B2 extends A2{
    public void tell1() {
        System.out.println("B2---tell1");
    }
    public void tell3() {
        System.out.println("B2--tell3");
    }
}
public class Demo22 {
    public static void main(String[] args) {
        //向下转型
        A2 a2 = new B2();
        B2 b2 = (B2)a2;
        b2.tell1();
        b2.tell2();
        b2.tell3();
    }
}

结果:
B2---tell1
A2---tell2
B2--tell3

代码三  : 类型转换失败

class A2{
    public void tell1() {
        System.out.println("A2---tell1");
    }
    public void tell2() {
        System.out.println("A2---tell2");

    }
}
class B2 extends A2{
    public void tell1() {
        System.out.println("B2---tell1");
    }
    public void tell3() {
        System.out.println("B2--tell3");
    }
}
public class Demo22 {
    public static void main(String[] args) {
        //向下转型
        A2 a2 = new A2(); //将B2改成A2,报错 - 类型转换失败
        B2 b2 = (B2)a2;
        b2.tell1();
        b2.tell2();
        b2.tell3();
    }
}

结果:
Exception in thread "main" java.lang.ClassCastException: cn.sec.ch02.A2 cannot be cast to cn.sec.ch02.B2
    at cn.sec.ch02.Demo22.main(Demo22.java:35)

二、多态性应用

代码

class A3{
    public void tell1(){
        System.out.println("A3---tell1");
    }
}
class B3 extends A3{
    public void tell2(){
        System.out.println("B3--tell2");
    }
}
class C3 extends A3{
    public void tell3() {
        System.out.println("C3--tell3");
    }
}
class D3 extends A3{
    
}
public class Demo23 {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        say(new B3());
        say(new C3());
        say(new D3());
    }
    /**
     * 此方法无论传B3还是C3都要调用到tell1的执行
     */
    public static void say(A3 a) {
        a.tell1();
    }

}
结果:
A3---tell1
A3---tell1
A3---tell1

三、instanceof关键字

在Java中可以使用instanceof关键字判断一个对象到底是不是一个类的实例。

代码
class A4{
    public void tell1() {
        System.out.println("A4---tell1");
    }
    public void tell2() {
        System.out.println("A4---tell2");

    }
}
class B4 extends A4{
    public void tell1() {
        System.out.println("B4---tell1");
    }
    public void tell3() {
        System.out.println("B4--tell3");
    }
}
public class Demo24 {
    public static void main(String[] args) {
        A4 a4  = new A4();
        System.out.println(a4 instanceof A4);
        System.out.println(a4 instanceof B4);
        
        A4 a = new B4(); //向上转型
        System.out.println(a instanceof A4);
        System.out.println(a instanceof B4);
    }
}

结果:
true
false
true
true

你可能感兴趣的:(Java面向对象-多态性)