1.动手实验:继承条件下的构造方法调用
运行 TestInherits.java 示例,观察输出,注意总结父类与子类之间构造方法的调用关系修改Parent构造方法的代码,
显式调用GrandParent的另一个构造函数,注意这句调用代码是否是第一句,影响重大!
代码:
class Grandparent {
public Grandparent() { System.out.println("GrandParent Created.");
}
public Grandparent(String string) {
System.out.println("GrandParent Created.String:" + string);
}
}
class Parent extends Grandparent {
public Parent() {
//super("Hello.Grandparent.");
System.out.println("Parent Created");
//super("Hello.Grandparent.");
}
}
class Child extends Parent {
public Child() {
System.out.println("Child Created");
}
}
public class TestInherits {
public static void main(String args[]) {
Child c = new Child();
}
}
结论:
通过 super 调用基类构造方法,必须是子类构造方法中的第一个语句。
必须在第一句,因为此句为显式调用父类构造器,子类构造方法运行之前必须调用父类构造方法
为什么子类的构造方法在运行之前,必须调用父类的构造方法?能不能反过来?为什么不能反过来?
原因:构造函数的主要作用是创建对象时,初始化对象。在Java的继承体系中,父类必须先于子类进行初始化,正所谓的有父才有子。不能
反过来,反过来就违反了逻辑。所以子类必须保证父类进行初始化。例如:1.若父类没有默认的构造器,则必须在子类的构造器中显式调
用父类的构造器super()。2.若未显式调用,那么所有的子类构造器都会调用父类的默认构造器。
2.请自行编写代码测试以下特性(动手动脑):
在子类中,若要调用父类中被覆盖的方法,可以使用super关键字。
源代码:
package 方法覆盖super;
//在子类中调用父类中被覆盖的方法使用super关键字。
//LangLangBai,2016.11.11
public class Superlei {
public static void main(String []args)
{
Son s=new Son();
s.show(1,2);
}
}
class Person
{
void show(int a,int b)
{System.out.println("父类a+b和为:"+(a+b));}
}
class Son extends Person
{
void show(int a,int b)
{
super.show(a,b+1);
System.out.println("子类a+b和为:"+(a+b));
}
}
截图: