什么是多态:
多态 就是有两个状态,表面调用的是父类方法,但是执行时是子类中的方法。
// double price = 9;
Mammal mammal = new Whale();
父类类型的变量 = 其子类创建的对象 称为对象上转型
new Whale() 称为上转型对象
在Mammal父类中,有一个属性和方法:
public class Mammal {
public int weight = 100;
public void move() {
System.out.println("正在游动");
}
}
在Whale子类中
public class Whale extends Mammal{
public String weight = "1000";
public int age=6;
@Override
public void move() {
System.out.println("正在用鳍游动");
}
public void breath() {
System.out.println("正在呼吸");
}
}
分析mammal.move();
这就是一个多态,表面调用的是父类的方法;但是因为mammal是存子类创建对象(new Whale();)的地址,所以执行时执行的是子类中的方法。
于是就有编译时类型和运行时类型。
存在多态的条件;
①编译时类型和运行时类型不相同②调用的方法必须是重写的
例如
@Override
public void move() {
System.out.println("正在用鳍游动");
}
对象上转型不能调用子类新增方法和新增属性,例如
public int age=6;
public void breath() {
System.out.println("正在呼吸");
}
如果调用mammal.age; 或 mammal. breath(); 就会显示错误
但是如果要调用子类中新增的方法和属性:
就用下转型:
// int price = (int) 9.0;
Whale whale = (Whale) mammal;
下转型的要求:必须先有上转型对象
注意:
1)只要是上转型对象调用属性就是父类
上转型 属性没有多态,方法才有多态。
Mammal mammal = new Whale();
System.out.println(mammal.weight);
输出结果为100,这个是父类中的属性的结果。
2)在多态前提下,父类中,被子类重写的方法,没必要再有方法体。所以就换为 抽象方法
public class Mammal {
public int weight = 100;
public abstract void move() {
}
}
多态—>>父类中有了抽象方法—>>>有了抽象方法就是抽象类—>>>一个方法中全部是抽象方法 就是接口