1.子类继承父类不是不仅仅是克隆(clone),复制一次就万事大吉了,以后父类里接口发生变化,子类也要随着变化的。父类能干的事,子类都能干,但是反之不成立。问题是,子类继承父类时,在内存上是如何改变的?
2.如果子类只继承父类,而不对父类里的接口的实现进行任何改变,那么子类其实和父类并无差别,应该没哪个二货吃饱了撑得没事这么干吧。那么我们有两种方式扩展父类(跟继承的关键字extends对上了):(1)在子类里添加新的函数接口,可能会由于父类不能满足我们处理问题了,需要添加新的接口帮助处理;(2)重写父类里函数接口,让它做我们想做的事情。
3.java的动态绑定,这个网址的作者写的非常好,http://www.cnblogs.com/ericdream/archive/2012/01/07/2315697.html。就是子类重写父类的方法,所有的子类的句柄都是父类,但是在调用编译器会根据具体情况决定调用哪个子类的方法,并且动态绑定的只能是方法,属性不能动态绑定。
例子:
Shape是父类,Circle,Square,Triangle都是继承Shape的子类。
package test;
class Shape{
void name(){
System.out.println("这是父类Shape: "+this.getClass());
}
}
class Circle extends Shape{
void name (){
System.out.println("这是子类Circle: "+this.getClass());
}
}
class Triangle extends Shape{
void name (){
System.out.println("这是子类Triangle: "+this.getClass());
}
}
class Square extends Shape{
void name (){
System.out.println("这是子类Square: "+this.getClass());
}
}
public class Topople {
public static void main(String args[]){
Shape c = new Circle();
Shape s = new Square();
Shape t = new Triangle();
c.name();
s.name();
t.name();
}
}
//输出是
/*
这是子类Circle: class test.Circle
这是子类Square: class test.Square
这是子类Triangle: class test.Triangle
*/
还有父类的句柄指向的是真正的子类的地址空间