父类引用指向子类对象,这个概念可能在刚开始乍一看的话会觉得很陌生。其实这个我们经常用到,只不过平常我们没有上升到一个学术的角度去分析他。举一个小小的例子。Animal animal = new Cat();在这一句代码中我们发现声明了一个父类变量 animal,可是实际上在内存分析中可以得出它指向的其实是Cat类的一个子类对象。
那么,这个父类引用指向子类对象有什么好处呢?它的好处可以用几个关键词来概括:多态、动态链接、向上转型。其实说穿了就是它的使用真正将面向对象的思想发挥到了极致,是真正意义上实现了面向接口编程。
可能你看到什么向上转型、动态链接这里可能会说他两又是什么鬼?其实,刚开始我也没有明白,总认为明明实例化的一个子类,应该叫做向下转型,怎么就成了向上转型了呢?还是拿我刚才的那个例子:Animal animal=newCat();其实可以从“=”入手,这一句可以翻译成:实例化的一只猫是动物,也就是子类Cat转型成了父类Animal了。所以所谓的向上转型就是子类转型成为父类。
而这个所谓的动态链接那就更好理解了。当父类中的一个方法只有在父类中定义而在子类中没有重写的情况下,才可以被父类类型的引用调用;对于父类中定义的方法,如果子类中重写了该方法,那么父类类型的引用将会调用子类中的这个方法,这就是动态连接。个人建议,这一块最好是从编译执行内存的变化去分析。
可能理论上说的再丰富都不如一个好的例子来的实在。因此在这里贴上个人的实践小例子。
class Animal{
public String name;
Animal(String name){
this.name=name;
}
public void enjoy(){
System.out.println("叫声……");
}
}
class Dog extends Animal{
private String furcolor;
Dog(String name,String furcolor){
super(name);
this.furcolor=furcolor;
}
public void enjoy(){
System.out.println(name+furcolor+"狗叫声");
}
}
class Cat extends Animal{
private String eyecolor;
Cat(String name,String eyecolor){
super(name);
this.eyecolor=eyecolor;
}
public void enjoy(){
System.out.println(name+eyecolor+"猫叫声");
}
}
class Lady{
private String name;
private Animal pet;
Lady(String name,Animal pet){
this.name=name;
this.pet=pet;
}
public void mypetenjoy(){
pet.enjoy();
}
}
public class TestDuotai{
public static void main(String[] args){
Cat cat =new Cat("招财","蓝色");
Dog dog=new Dog("进宝","大黄");
Lady lady1=new Lady("2015",cat);
Lady lady2=new Lady("2016",dog);
lady1.mypetenjoy();
lady2.mypetenjoy();
}
}
总结:在实现这个小例子的时候自己还是挺开心的,例子虽然体积较小,但是其中包含的学问却是无限大的。自己在学习这一块的时候,突然就想起这一块的内容其实不就跟那个工厂模式还有代理模式就不谋而合了呀。在java之前我一边抱怨自己的代码实践能力弱,一边还看了视频之后不怎么去实现例子。仔细想来,任何的果都是自己曾经种下的因。与其在那里漫无休止的抱怨,还不如闭嘴做点实事。因为,慢慢积累,一切都是水到渠成的。