課後作業4
阿新 • • 發佈:2018-11-07
1.繼承條件下的構造方法呼叫
class Grandparent { public Grandparent() { System.out.println("GrandParent Created."); } public Grandparent(String string) { System.out.println("GrandParent Created.String:" + string); } } class Parent extendsGrandparent { 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的值。