多态:
多态意味着父类的变量可以指向子类对象。
(1)同一个对象在不同时刻体现出来的不同状态。
(2)多态的前提:
A:有继承或者实现关系。
B:有方法重写。
C:有父类或者父接口引用指向子类对象。
多态的分类:
a:具体类多态
class Fu {}
class Zi extends Fu {}
Fu f = new Zi();
b:抽象类多态
abstract class Fu {}
class Zi extends Fu {}
Fu f = new Zi();
c:接口多态
interface Fu {}
class Zi implements Fu {}
Fu f = new Zi();
(3)多态中的成员访问特点
A:成员变量
编译看左边,运行看左边
B:构造方法
子类的构造都会默认访问父类构造
C:成员方法
编译看左边,运行看右边
D:静态方法
编译看左边,运行看左边
因为成员方法有重写。
(4)多态的好处:
A:提高代码的维护性(继承体现)
B:提高代码的扩展性(多态体现)
(5)多态的弊端:
父不能使用子的特有功能。
现象:
子可以当作父使用,父不能当作子使用。
(6)多态中的转型
A:向上转型
从子到父
B:向下转型
从父到子
(7)多态的前提
1、必须有关系:继承,实现。
2、通常都有重写操作。
多态问题的理解:
class 老王 {
public int age = 40;
public void teach() {
System.out.println("讲解Java");
}
}
class 小王 extends 老王 {
public int age = 20;
public void teach() {
System.out.println("讲解网络安全");
}
public void playGame() {
System.out.println("英雄联盟");
}
}
//Java培训特别火,很多人来请老王去讲课,这一天老王有事出去了
//但是这是人来请,就剩小王在家,价格还挺高。小王 一想,我是不是可以考虑去呢?
//然后就穿上老王的衣服,带上老王的眼睛,粘上老王的胡子。就开始装老王
//向上转型
老王 k王 = new 小王();
//到人家那里去了
System.out.println(k王.age); //40
k王.teach(); //讲解网络安全
//k王.playGame(); //这是小王才能做的
//讲完了,下班回家了
//脱下老王的装备,换上自己的装备
//向下转型
小王 k =(小王) k老王;
System.out.println(k.age); //20
k.teach(); //讲解网络安全
k.playGame(); //英雄联盟
再如:
/*
描述毕老师和毕姥爷,
毕老师拥有讲课和看电影功能
毕姥爷拥有讲课和钓鱼功能
*/
class 毕姥爷{
void 讲课(){
System.out.println("政治");
}
void 钓鱼(){
System.out.println("钓鱼");
}
}
//毕老师继承了毕姥爷,就有拥有了毕姥爷的讲课和钓鱼的功能,
//但毕老师和毕姥爷的讲课内容不一样,因此毕老师要覆盖毕姥爷的讲课功能
class 毕老师 extends 毕姥爷{
void 讲课(){
System.out.println("Java");
}
void 看电影(){
System.out.println("看电影");
}
}
public class Test {
public static void main(String[] args) {
//多态形式
毕姥爷 a = new 毕老师(); //向上转型
// 这里表象是毕姥爷,其实真正讲课的仍然是毕老师,因此调用的
//也是毕老师的讲课功能
a.讲课();
// 这里表象是毕姥爷,但对象其实是毕老师,而毕老师继承了毕姥
//爷,即毕老师也具体钓鱼功能
a.钓鱼();
// 当要调用毕老师特有的看电影功能时,就必须进行类型转换
毕老师 b = (毕老师)a; //向下转型
b.看电影();
}
}
总结:转型过程中,至始至终只有毕老师对象做着类型转换,父类对象是无法转成子类
对象的。