java核心技术卷一p148
尽管在Manager类(子类)中没有显式地定义getName 和 getHireDay等方法,但属于Manager类的对象却可以使用它们,这是因为Manager类自动的继承了超类Employee中的这些方法
又认为
同样,从超类继承了name, salary, hireday,这三个域。这样一来,每个Manager类都包含了四个域(一个子类自己声明的bonus域)
因为误解书义,我在实际使用中存在一些疑惑,即子类构造器中通过关键字super调用的父类构造器,那么实例化的域究竟是属于超类的还是子类的?因为这个问题一直模棱两可,犯了很多错。
package inheritanceTest;
public class InheritanceTest {
public static void main(String[] args) {
ChildClass kid = new ChildClass("kid");
FatherClass[] superclass = new FatherClass[3];
superclass[0] = kid;
superclass[1] = new FatherClass("father");
superclass[2] = new FatherClass("father");
//superclass[0].setX(10);
//error
kid.setX(10);
//ok
System.out.println("kid name is " +kid.getName() + " and superclass[0]=kid, its class is " + superclass[0].getClass());
//kid can call the father_class method getName()
// superclass[0] class is ChildClass (by getClass())
for(FatherClass e : superclass)
System.out.println("name is : " + e.getName() + "; class is :" + e.getClass());
System.out.println("We call name by child class :" + kid.getOwnName());
// ok, and print "child class own name"
}
}
package inheritanceTest;
public class FatherClass
{
private String name;
public FatherClass(String name)
{
this.name = name;
}
public String getName()
{
return name;
}
}
package inheritanceTest;
public class ChildClass extends FatherClass {
private int x;
public String name = "child class own name" ;
public ChildClass(String name) {
super(name);
x = 0;
}
public String getName()
{
return super.getName();
}
public void setX(int x) {
this.x = x;
}
public String getOwnName()
{
return name;
}
}
小结
父类数组father[0] = child 子类,不会报错 ; Father[0].getClass() = class child 子类;
但是Father[0].childmeth 子类方法会报错。
super调用了父类构造器,实际上是完成了父类域的实例化。