簡體   English   中英

有人可以解釋一下這個小代碼嗎?

[英]Can someone explain me this little code?

class Feline {
    public String type = "f";

    public Feline() {
        System.out.println("feline");
    }
}

public class Cougar extends Feline {

    public Cougar() {
        System.out.println("cougar");
    }

    void go() {
        type = "c";
        System.out.println(this.type + super.type);
    }

    public static void main(String[] args) {
        new Cougar().go();
    }
}

在控制台的輸出中,我得到以下信息:

feline
cougar
cc

我不確定為什么要創建Cougar對象並且cougar類的構造函數沒有對feline類構造函數進行超級調用,為什么會得到此輸出,我也不明白為什么在調用該類時會得到“ CC” go()方法。 抱歉,這是一個非常基本的問題,但我會感謝您的幫助。

Java對象是由內而外構造的:當您說new Cougar() ,首先為該對象分配了空間,然后通過調用Feline構造函數在該空間中構造了Feline對象,最后運行了Cougar構造函數。

您可以通過super(..)調用顯式調用它來指定運行哪個 Cougar構造函數。 如果有多個,並且您想通過指定參數來選擇一個,則該功能特別有用。 但是,如果您不調用一個,編譯器將插入super()調用。

至於'cc',當type = "c"; 遇到,沒有定義名為“ type”的局部變量。 這意味着它是一個成員變量,因此編譯器將其解釋為this.type = "c"; 但是只有一個成員稱為“類型”,而這個成員在Cougar中。 因此this.typesuper.type都是同一件事,已被設置為“ c”,並且“ c”被鍵入兩次。

您創建了兩個類,其中Feline是超類,而Cougar是子類。 Cougar擴展FelineCougar繼承了Feline type變量。

現在, Feline具有默認的構造函數,其中會打印feline字符串。 Cougar還具有默認構造函數。 按照這一行new Cougar().go(); main方法中,您正在創建一個Cougar的新對象,該對象將調用默認構造函數,並隱式地調用super()來調用Feline類的構造函數。

現在, new Cougar().go()方法將類型設置為"c" ,這意味着將變量的值更改為super.typethis.type是同一副本。 因此,當您調用此方法時,它的打印方式如下:

貓科動物

美洲獅

抄送

在main()中,當您創建對象new Cougar()時,將調用構造函數public Cougar(),從而依次調用父構造函數public Feline()

因此,首先在控制台上顯示Feline()的feline ,然后在控制台上顯示Cougar()的cougar

在Java中,這通常稱為“ Instance Control flow

然后,由於go()方法,cc在輸出中顯示,因為此運算符和超級運算符的“ type”變量都指向“ c”。

因此,輸出為:
貓科動物//因為在實例控制流中首先調用了父構造函數。
cougar //因為在父構造函數之后調用了子構造函數。
cc //因為此實例和超級實例的類型變量都指向“ c”對象。

創建子對象時。 它會自動調用父級構造函數,因為父級需要為子級初始化。

因此,當子類構造函數被調用時,它會自動調用父默認/非參數構造函數。即o / p feline cougar

.go()更改this.type和super.type的值,並且表示相同的值。 因為類型變量是可見性是公共的,所以它也可以在子類中訪問,並且在子類中沒有類型為變量名的變量。

因此,完整的o / p為

貓美洲獅cc

根據您的代碼:有一個稱為“貓科動物”的父類和一個名為“ Cougar”的子類。 當它執行時,它首先轉到父/父類(Feline)構造函數並打印:feline。

然后,它執行子類(Cougar)的構造函數並打印:cougar。

之后,它執行main方法; 在您的主要方法中,您引用的是另一個稱為“ go”的方法,然后在“ go”方法中執行代碼:

在其中,它將名為“ type”的變量的值覆蓋為:“ C”。

因此,當您要打印類型的值時,

this.type = C和super.type = C(由於覆蓋)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM