继承
常用来解决的问题:
- 代码重复
- 加强父类
但这篇文章不讲怎么写继承,具体讲的什么我也不是很清楚
假设我创建了一个Animal
的父类,又接着创建一个Dog
的子类;
在main
方法这样创建一个名为a的Animal
型的dog
的对象
Animal a = new Dog();
//父类型引用指向子类型对象(其中也涉及“向下转型”)
在JVM的堆栈图如下:
只能在继承的条件下,才能使堆,栈类型不一样
编译过程
会进行静态绑定:
目的:确保其能运行。
以该例为例:
在Animal
与Dog
都写了一个eat()
的方法,但在Dog
中进行了重写(override)。在main
中调用:a1.eat();
在编译过程时会识别父类中是否存在eat()
的方法,如果没有在编译过程就过不去。
那么发现子类中的特有的方法就无法执行:在创建的时候就进行了自动类型转换(向下/ 转型),牺牲了子类特有的方法;
当然有方法解决,只需在调用子类特殊方法前将a
进行强制类型转换(向上转型)a = (Dog)a;
,在这样操作后依旧能执行父类中特有的方法!
运行过程
会进行动态绑定:
a
执行的方法取决于该方法有没有在子类中出现:
如果子类中有该方法就会执行子类中的方法会执行子类中的方法
如果子类中没有该方法就会执行父类的方法