【知识点】
(1)类的继承(Inheritance of Class)
从其他类派生而来的次生类(Subclass)称为子类(Children Class)、派生类(Derived Class)、扩展类(Extended Class),派生出子类的那个类称为超类(Superclass),也称为基类(Base Class)、父类(Parent Class)。
Object类没有超类,除Object类外,Java语言中所有类有且只有一个直接超类,这种情形称为单继承(Single Inheritance)。
没有显式声明超类的类都隐式地继承了Object类。类可以派生出子类,子类又可以派生出自己的子类……,如此构成了继承链,沿继承链从派生类向超类连续回溯,最终都可以追溯到Object类,因此,在Java语言中,Object类是所有类的根类,Object类定义在java.lang包中。
(2)构造方法(Constructor)
构造方法形式上与类的方法成员相似,用于创建类的实例对象,负责将类加载到可运行的内存空间中。
构造方法特征是方法名与类名相同,并且没有返回类型。
一个类可以不定义构造方法,也可以定义一个或多个构造方法。如果类没有显式定义构造方法,Java编译器会自动隐式地为这个类提供无参数的默认构造方法。当类中存在多个构造方法时,编译器按照构造方法参数列表中参数个数和类型区分不同的构造方法,需要多个构造方法的目的是为了可以创建不同初始状态的实例,体现了面向对象程序设计中对象多态性特点。
子类调用超类的构造方法时,无论是显式调用还是隐式调用,实际上都会沿着继承链回溯到Object的构造方法,然后,从根类开始沿继承链下溯,并逐层调用继承链上各层构造方法,创建继承链上所有类的实例。
(3)使用super关键词访问超类成员
子类要访问超类中被覆写的方法,不能直接使用方法名,因为子类中存在与超类中同名的方法,会造成歧义。Java语言中使用super关键词引用超类中被覆写的方法(Method)或隐藏字段(Hidden Field)。
假设存在超类:
publicclass Superclass {
public void printMethod() {
System.out.println("Printed inSuperclass.");
}
}
它的子类为:
publicclass Subclass extends Superclass {
// overrides printMethod in Superclass
public void printMethod() {
super.printMethod();
System.out.println("Printed inSubclass");
}
public static void main(String[] args) {
Subclass s = new Subclass();
s.printMethod();
}
}
子类中printMethod()方法覆写了超类的printMethod()方法,为了在子类中调用超类的printMethod()方法,使用了super关键词引用超类对象:
super.printMethod();
使用super调用超类构造方法有两种形式,即:
(a)调用超类无参构造方法
super()
(b)调用超类有参构造方法
super(超类构造方法的参数列表)
特别要注意的是:如果子类构造方法没有显式调用超类构造方法,Java编译器会自动调用超类的无参构造方法,此时,如果超类中没有无参构造方法,将会造成编译错误。
【例题】
Given:
class Atom {
Atom() {System.out.print("atom "); }
}
class Rock extends Atom {
Rock(Stringtype) { System.out.print(type); }
}
public class Mountain extends Rock {
Mountain(){
super("granite");
newRock("granite ");
}
publicstatic void main(String[] a) { new Mountain(); }
}
What is the result?
A. Compilation fails.
B. atom granite
C. granite granite
D. atom granite granite
E. An exception is thrown at runtime.
F. atom granite atom granite
【Answer】 F
【例题辨析】
Mountain类中main()方法调用本类构造方法Mountain()实例化本类,按照继承关系链,Mountain()方法中super(“granite”)调用了超类的Rock对应的有参构造方法Rock(String type),而Rock(String type)方法中没有显式调用超类Atom的构造方法,意味着将默认自动调用Atom的无参构造方法,而Atom类确实存在无参构造方法Atom(),因此继承链上构造方法链是完整的,编译可以通过。
沿继承链追溯到基类Atom后,从基类开始按回溯时逆向逐层调用继承链上各个构造方法,即:Atom() -> Rock(String type),运行结果显示atom granite;
Mountain()方法在调用super("granite ")后又执行new Rock("granite ")语句,也就是调用Rock(String type)构造方法,再次回溯到Atom(),同样,从基类开始向下调用继承链上各个构造方法,运行结果显示:atom granite。
综上所述,本例完整运行结果:atom granite atom granite,应该选择F。