面向对象(12-2):多态的向下转型

面向对象(12-2):多态的向下转型

存在多态的前提(缺一不可):
    1、要有继承的关系
    2、子类要重写父类中的方法
    3、要有父类的引用指向子类对象

多态的弊端:
    多态创建对象无法使用子类特有的方法

案例1:

class Father1{
    public void fun(){
        System.out.println("这是父类中的fun方法");
    }
}

class Son1 extends Father1{
    public void fun(){
        System.out.println("这是子类中的fun方法");
    }

    public void show(){
        System.out.println("这是子类中特有的show方法");
    }
}

public class PolymorphicDemo1 {
    public static void main(String[] args) {
        //多态创建子类对象
        Father1 x = new Son1();
        x.fun();//编译看左,运行看右,打印的是子类中的fun方法

        //需求:想要在多态创建对象中调用子类中特有的方法,咋办
		//f.show();直接调用会报错,不可取
    }
}

多态中的向下转型

1、案例1中,在多态创建对象中,用对象名直接调取子类中特有的方法是不可取的,会报错

如果就想在多态创建的对象中使用子类的特有的方法,该怎么做?

有什么方法?
    方法1、创建对应的子类并调用方法
        可以,但是不推荐,很多时候会占用堆内存空间
    方法2、java提供了一个技术给我们使用:向下转型(把父类的引用强制转换成子类的引用)
        	格式:
        		子类类名 变量名 = (子类类名)父类的引用

案例1改进:

class Father1{
    public void fun(){
        System.out.println("这是父类中的fun方法");
    }
}

class Son1 extends Father1{
    public void fun(){
        System.out.println("这是子类中的fun方法");
    }

    public void show(){
        System.out.println("这是子类中特有的show方法");
    }
}

public class PolymorphicDemo1 {
    public static void main(String[] args) {
        //多态创建子类对象
        Father1 x = new Son1();
        x.fun();//编译看左,运行看右,打印的是子类中的fun方法
        //向下转型:子类类名 变量名 = (子类类名)父类的引用
        //变量名随便起,x是父亲的引用,也就是多态创建对象时的对象名
        Son1 y = (Son1)x;
        y.show();
    }
}
            执行结果如下:
                        这是子类中的fun方法
                        这是子类中特有是show方法

                        Process finished with exit code 0

2、前面提到向下转型,和向下转型对应的是向上转型

(1)向上转型:就是多态创建对象的写法:Father1  x = new  Son1();

(2)向下转型:Son01  y  =  (Son01)x;

(3)类似于基本数据类型之间的强转:
    int a = 10;
    byte b = (byte)a;
    
(4)向下转型的注意事项:
            	要求必须是存在继承关系的
posted @ 2021-12-12 00:05  阿伟宝座  阅读(60)  评论(0)    收藏  举报