面向对象(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)向下转型的注意事项:
要求必须是存在继承关系的