多态的前提
/*
多态是同一个行为具有多种不同表现形式。
多态的前提:
1.继承/实现关系
2.有方法重写
3.父类引用指向子类对象(接口指向实现类对象)
*/
public class Test {
public static void main(String[] args) {
//父类引用指向子类对象
Printer p1 = new ColorPrinter();
p1.print();
Printer p2 = new BlackPrinter();
p2.print();
}
}
多态的访问特点和运行过程
/*
编译期间
由java文件变成class文件的过程
运行期间
运行代码的过程
多态下方法的访问特点:编译时看左边,运行时看右边
多态下变量的访问特点:编译时看左边,运行时也看左边(变量没有多态性)
多态的缺点:
在多态下,无法访问子类特有的成员。
*/
public class Test01 {
public static void main(String[] args) {
Animal a1 = new Dog();
System.out.println(a1.name); //编译时看左边,运行时也看左边(变量没有多态性)
a1.run(); //编译时看左边,运行时看右边
}
}
缺点
通过多态的父类引用无法访问子类所特有的成员和方法
代码
/*
多态的缺点:
在多态下,无法访问子类特有的成员。
解决办法:
使用强制类型转换
Animal a = new Dog();
Dog dog = (Dog) a;
解决类型转换异常:使用 instanceof 判断类型
*/
public class Test02 {
public static void main(String[] args) {
//自动类型转换(向上转型)
Animal a = new Dog();
//强制类型转换(向下转型)
//可能有类型转换异常 ClassCastException
//在强转前,做类型的判断
/*
对象名 instanceof 类名
判断 对象 是否 属于类,是返回true,否则返回false
*/
if(a instanceof Dog){
Dog dog = (Dog) a; //强转
dog.lookHome();
}else {
System.out.println("当前类型不是Dog");
}
}
}
优点
方法的参数是父类类型,调用方法时就可以传入任意的子类对象
可以提高方法的通用性和灵活性