1.继承条件下的构造方法调用
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(); } }
运行结果:
先调用父类的构造函数,后调用子类的构造函数,因为子类继承的父类所以,调用子类的构造函数时父类已经存在,所以时先调用父类的构造函数初始化父类,后调用子类的构造函数。
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调用父类构造函数,而且super必须是子类的第一行代码。
思考:构造函数用于初始化,如果基类没有初始化是无法进行任何操作的,所以必须在第一行代码就进行初始化。
2.“方法覆盖(override)”的要点
class Fuigai { public void coutFuigai() { System.out.println("fulei"); } } class Son extends Fuigai{ public void coutFuigai() { super.coutFuigai(); System.out.println("zilei"); } } public class Test { public static void main(String[] args) { Fuigai a=new Fuigai(); Son b=new Son(); b.coutFuigai(); a.coutFuigai(); } }
运行结果:
同名时Java会覆盖前一个方法的内容。
3.动手动脑3
class Parent{ public int myValue=100; public void printValue() { System.out.println("Parent.printValue(),myValue="+myValue); } } class Child extends Parent{ public int myValue=200; public void printValue() { System.out.println("Child.printValue(),myValue="+myValue); } } public class ParentChildTest { public static void main(String[] args) { Parent parent=new Parent(); parent.printValue(); Child child=new Child(); child.printValue(); parent=child; parent.printValue(); parent.myValue++; parent.printValue(); ((Child)parent).myValue++; parent.printValue(); } }
运行结果
第一条输出父类的myValue;
第二条输出子类的myValue;
第三条子类的对象child赋给parent,最后调用对象parent相当调用child;
第四条修改parent的myValue,但对象child已经赋给了parent,所以最后调用对象parent输出的还是child的myValue的值;
第五条修改child的myValue,并最终同第四条一样,输出child的myValue的值。