首先复习一下重写
Mammal.java(父类):
public class Mammal{
public void move(){
System.out.println("正在游动.....")
}
}//父类中定义的move方法。
Whale.jvav(子类):
public class Whale extends Mammal{
@override
public void move(){
System.out.println("用尾巴游动......")
}//子类中重写move方法。
}
Earth.jvav
public class Earth{
public static void main(String[ ]args{
Whale whale = new Whale();
whale.move;//此时输出结果是用尾巴游动......(使用重写后的move方法)。
}
}
进入正题:
首先int a = 9;
可以替换为double a = 9;
//自动类型转换,因为double比int更大;与之相似:由于Whale是Mammal的子类,所以可以将Whale whale = new Whale();
替换为 Mammal mammal = new Whale();
此时上图所述Earth.java虽然调用是父类Mammal的move方法,但是运行结果是:用尾巴游动…。
注意事项:
⚫Mammal mammal = new Whale();
是对象上转型,new Whale()
:是上转型对象。
⚫有两个状态①:表面上是调用父类的方法
②:实际上由于Mammal中存在子类创建的对象,所以在执行时执行的子类的move方法。
//如果编译时类型和运行时类型相同,则一定不会出现多态;√
//如果编译时类型与运行时类型不相同,则一定出现多态;x
public void breath() {
System.out.println("用鼻子呼吸......");
}
mammal.breath();//此时无法调用子类中的方法、属性。所以会报错。
如果必须使用子类中新增的属性和方法,可以通过以下方法:
和int price = (int)9.0;
类似。通过Whale whale = (Whale)mammal;
实现对象下转型。
这样就可以调用子类新增的方法和新增的属性。
注意事项:
⚪下转型的前提是先出现上转型对象。
Mammal mammal = new Mammal();
Whale whale = (Whale)mammal;
此类情况就不能有对象下转型,因为没有上转型对象。
⚪ 在多态的前提下,父类中被子类重写的方法没有必要有方法体。
父类可以写做:
public abstract class (){
public void abstrsct move(){
}
}
⚪趁热打铁了解接口:如果一个class中,都是被重写的方法,那么这个class可以是一个接口。