首先,幻想一下你一个有女朋友。你女朋友想看鹦鹉跑。
然后你就给她造了个鹦鹉出来,让它会跑。鹦鹉声音还好听,所以给了它haoting
属性。
public class Yinwu extends Bird{
private String haoting;
public void run(){
System.out.println("Yinwu run");
}
}
之后笑嘻嘻的给她看
public class nvpengyou {
public void look(Dujuan dujuan){
}
}
·····
看了一段时间之后,你女朋友腻了,想看杜鹃跑。
然后你又给她造了个杜鹃出来,让她会跑。杜鹃还会跳舞,所以你给了它tiaowu
属性。
public class Dujuan extends Bird{
private String tiaowu;
public void run(){
System.out.println("Dujuan run");
}
}
把look()
方法的参数改为Yinwu
public class nvpengyou {
public void look(Yinwu yinwu){
}
}
或者重载look
方法
public class nvpengyou {
public void look(Dujuan dujuan){
}
public void look(Yinwu yinwu){
}
}
又笑嘻嘻的让她看
…
又过了一段时间之后,你女朋友又看腻了,她又想看其他的鸟了…
然后你说:还有完没完了,骂骂咧咧的又去改代码了。。
如果你的女朋友又腻了呢?你还得去新建一个类,然后改look()
方法的参数或则再重载一个’look’吗?
深爱女朋友的你就寻思找一种简便一点的方法…
所以…
你先建了一个Bird
类(父类)。因为它们都会跑。
public class Bird {
public void run(){
System.out.println("Bird run");
}
}
然后造了Dujuan和鹦鹉
public class Dujuan extends Bird{
private String haokan;
public void run(){
System.out.println("Dujuan run");
}
}
public class Yinwu extends Bird{
private String haoting;
public void run(){
System.out.println("Yinwu run");
}
}
女朋友想看杜鹃
public class nvpengyou {
public void look(Bird bird){
bird = new Dujuan();
Dujuan dujuan = (Dujuan) bird;//还想有它跳舞属性
dujuan.tiaowu;
}
}
女朋友想看鹦鹉
public class nvpengyou {
public void look(Bird bird){
bird = new Yinwu();
Yinwu yinwu = (Yinwu) bird;//还想有它的好听属性
yinwu.haoting
}
}
女朋友还想看…
现在理解多态的好处了吧,从此跟女朋友过上了性福生活!
注意:
我们不用纠结为什么Java可以采用向下造型(父类向下造型为子类,然后得到子类对象,从而获取子类的属性)
Yinwu yinwu = (Yinwu) bird
因为这本身就是Java语法规定的。既然是规定,你管它干嘛?
或则
向上造型
Yinwu yinwu = new Yinwu();
Bird bird = (Bird)yinwu;
(你管它干嘛?,用就得了呗)