格式: 父类名称 对象名 = new 子类名称();
访问成员方法: 编译看左边,运行看右边
public class Fu{
public void method(){
System.out.println("父类多态");
}
}
public class Zi extends Fu{
@Override
public void method(){
System.out.println("子类多态");
}
public void methodZi(){
System.out.println("子类多态Zi");
}
}
public class test{
public static void main(String[] args){
Fu obj = new Zi();
obj.method(); //编译看左(等号左边),Fu里有method方法,且子类覆盖重写,所以输出“子类多态”
obj.methodZi(); //编译看左(等号左边),Fu里没有method方法,编译报错
}
}
多态中的向上转型: 格式:父类名称 对象名 = new 子类名称();(就是多态写法) 含义:右侧创建一个对象,把它当作父类来看待。 注意:向上转型一定是安全的。(因为从小范围转向大范围) 弊端:对象一旦向上转型为父类,那么就无法调用子类原本特有的内容。
多态中的向下转型: 格式:子类名称 对象名 = (子类名称)父类对象; 含义:将父类对象【还原】为本来的子类对象
Animal animal = new Cat(); //本来是猫,向上转型成为动物 Cat cat = (Cat) animal; //本来是猫,已经被当成动物了,还原回来成为猫 弊端:若对象创建时本来不是猫,现在非要向下转型成为猫,就会报错(ClassCastException)
public class test {
public static void main(String[] args) {
Animal animal = new Cat() ;
Cat cat = (Cat) animal; //正确
Dog dog = (Dog) animal; //错误
}
}
弊端解决方案(instanceof)
public class test {
public static void main(String[] args) {
Animal animal = new Cat();
animal.eat();
if(animal instanceof Cat){
Cat cat = (Cat) animal;
cat.catchMouse();
}
if(animal instanceof Dog){
Dog dog = (Dog) animal;
dog.watchHouse();
}
}
}