1.
package cs4; 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."); } public Parent(String string) { super("孙子们好!"); System.out.println("Parent Created.String:"+string); } } class Child extends Parent { public Child() { // super("儿子们好!"); System.out.println("Child Created"); // super("儿子们好!"); } } public class TestInherits { public static void main(String args[]) { Child c = new Child(); } }
当调用超类时,如果代码不是第一行,则会报错,原因是先有基类,再生成子类,其次构造方法的作用是对象的初始化,所以必须先初始化基类,才能初始化子类。
所以得到结论,在子类的构造方法调用超类时,调用语句必须放在子类构造方法类的第一行
2.
package cs4; class A{ } public class ExplorationJDKSource { public static void main(String[] args) { System.out.println(new A()); } }
直接输出类的对象时,由于我没有覆盖toString这个方法,所以继承object里面的方法,所以输出结果是
类名+@+随机字符
3.在子类中,若要调用父类中被覆盖的方法,可以使用super关键字
package cs4; public class Fruit { public String toString() { return "Fruit toString."; } public String FathertoString() { return super.toString(); } public static void main(String args[]) { Fruit f=new Fruit(); System.out.println("f="+f); // System.out.println("f="+f.toString()); System.out.println(f.FathertoString()); } }