1.当子类对象调用重写后的方法时,调用的是子类重写后的方法
我们写一个实例帮助理解
我们写一个父类:
public class Mammal {
public void move() {
System.out.println("正在游动、、、、");
}
}
子类:
public class Whale extends Mammal {
public void move() {
System.out.println("正在移动、、、、");
}
}
再写一个类
public class Earth {
public static void main(String[] args) {
Whale whale = new Whale();
whale.move();
}
}
结果是:
正在移动、、、、
2.自动类型转换:
我们在学C语言的时候,都见过这样的代码:
double price = 9;
这是不出错的,那么为什么他不出错呢?因为9是int类型,int类型的范围小于double类型,所以他不会出错。就好像一瓶350ml的水杯里的水一定能放在500ml水杯里面而且永远不会溢出一样。
那么与此相类似的是下面的代码:
Mammal mammal = new Whale();
这里的Mammal就好像double,都是什么类型的意思。
mammal 就是 price,一个变量。
new Whale()就相当于9。
本来new Whale()是一个Whale类型的对象,但是它的范围没有Mammal类型大。所以将一个小类型的值放在大类型下面是可以的。
父类类型的变量指向其子类创建的对象
这叫做对象上转型 new Whale()称为上转型对象
3.两个状态:
表面调用的是父类的方法;
但是执行时由于mammal存的是子类创建的对象的地址,
所以执行时执行的是子类中的方法
我们看一个实例:
public class Earth {
public static void main(String[] args) {
Mammal mammal = new Whale();
mammal.move();
}
}
结果是:
正在移动、、、、
由于mammal是Mammal类型,所以我们看着好像是调用的父类Mammal中的方法,
实际上,mammal中存的是new Whale()的地址,所以mammal.move就是new Whale().move
由此,执行的是子类Whale中的方法。
4.
(1)如果编译时类型和运行时类型相同,则一定不会出现多态;√
(2)如果编译时类型与运行时类型不相同,则一定出现多态x
举例:
(1)
Whale whale= new Whale();
5.上转型对象不能调用子类新增的方法 和新增加的属性
在子类中增加
public void breath() {
System.out.println("正在呼吸、、、、");
}
在Erath中调用breath方法,我们发现,出错了。
事实上:上转型对象不能调用子类新增的方法 和新增加的属性 。
6.在上转型对象中如何实现调用子类新增的方法 和新增加的属性?
使用对象下转型
下转型的前提是先出现上转型对象
如:
Mammal mammal = new Mammal();
Whale whale = (Whale)mammal;
这就不叫对象下转型,因为下转型的前提是先出现上转型对象。这里没有上转型对象。
7.在多态的前提下,父类中被子类重写的方法没有必要有方法体,所以这个方法被称为抽象方法。
如果一个类里面有抽象方法,那么这个类被称为抽象类。
如果一个抽象类里面都是抽象方法,那么这个类被称为接口。
多态包括:
- 抽象类
- 接口