1.繼承中,當new出子類,父類的構造器會先被調用,接着才是子類。

Execise5

package reuse;

public class Exercise05 extends A {
    private B b = new B();
    public static void main(String[] args) {
        new Exercise05(); //output A B
    }
}

class A{
    A(){
        System.out.println("A");
    }
}

class B{
    B(){
        System.out.println("B");
    }
}

2.如果父類是有參的,那麼調用父類的構造器時需要使用super(variable)。

Exercise8

package reuse;


class X{
    X(int i){
        System.out.println("X");
    }
}

public class Exercise08 extends X{
    Exercise08(int j){
        super(1);
        System.out.println("with arg");
    }
    Exercise08(){
        super(2);
        System.out.println("with no arg");
    }
    public static void main(String[] args) {
        new Exercise08(1);
        new Exercise08();
    }
}

Exercise9

public class Exercise09 extends Root {
    Exercise09(){
        System.out.println("Exercise09");
        Component1 c1 = new Component1();
        Component2 c2 = new Component2();
        Component3 c3 = new Component3();
    }
    public static void main(String[] args) {
        new Exercise09();
    }
}

class Component1{
    Component1(){
        System.out.println("Component1");
    }
}

class Component2{
    Component2(){
        System.out.println("Component2");
    }
}

class Component3{
    Component3(){
        System.out.println("Component3");
    }
}

class Root{
    Root(){
        System.out.println("Root");
        Component1 c1 = new Component1();
        Component2 c2 = new Component2();
        Component3 c3 = new Component3();
    }
}

3.清除對象的順序應該與創建對象的順序相反。

4.在java中,如果父類有多個重載的方法,在子類中重新定義這個方法相當於繼承了這些重載方法,並不會消失。

可以使用@override來檢查是否重寫正確。

package c05;

public class Exercise13 extends A{
    @Override void g(String a) { 
        System.out.println("g(String)");
    }
    public static void main(String[] args) {
        Exercise13 e = new Exercise13();
        e.g(1);
        e.g('c');
        e.g(1.0f);
        e.g("a"); //output:The method g(String) of type Exercise13 must override or implement a supertype method
    }
}

class A{
    void g(int i) {
        System.out.println("g(i)");
    }
        
    void g(char i) {
        System.out.println("g(j)");
    }
    void g(float i) {
        System.out.println("g(k)");
    }
}

5.protected方法僅包內的繼承子類可用。

package c05;

public class Exercise15 extends G {
    public void change(int set) {
        set(set);
    }
    public String toString() {
        return super.toString();
    }
    public static void main(String[] args) {
        Exercise15 e = new Exercise15();
        System.out.println(e);
        e.change(1);
        System.out.println(e);
    }
}

class G{
    private int i;
    protected void set(int j) {
        i = j;
    }
    public G() {
        System.out.println("A");
    }
    public String toString() {
        return "A set to" + i;
    }
}

6.upcasting 

Exercise16

package c05;

public class Frog extends Amphibian{
    public static void main(String[] args) {
        Frog a = new Frog();
        Amphibian.jump(a);
    }
}

class Amphibian{
    static void jump(Amphibian a) {
        System.out.println("Amphibian works");
    }
}

7.fina 關鍵字。對基本數據類型來説,final相當於常數。final static相當於這一片存儲空間無法被改變。引用前加static説明此引用無法指向另一個對象。如果final的數據在數據成員區域未初始化,則在構造器裏必須執行初始化。也能為參數列表賦值為final,同樣的,賦值為final的參數就不能改變了。
8.final和private,overriding只有在方法時是父類的接口的時候才會發生。如果方法時private,那麼此方法不屬於類的接口,只是隱藏在類中的代碼。如果你在子類中“override”這個方法(實際並沒有),你只是新建了一個同名的方法。

9.final類,即無法繼承。

10.首先,載入class文件,其次由父類開始一級一級往下初始化static。接着創造對象,所有基本數據都被初始化,所有對象句柄初始化為null,基類的構造器啓動,實例變量按照語句順序執行,最後就是剩餘的部分執行。