![](/img/trans.png)
[英]Can someone explain to me construction of this code that uses stream();
[英]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.type
和super.type
都是同一件事,已被設置為“ c”,並且“ c”被鍵入兩次。
您創建了兩個類,其中Feline
是超類,而Cougar
是子類。 當Cougar
擴展Feline
, Cougar
繼承了Feline
type
變量。
現在, Feline
具有默認的構造函數,其中會打印feline
字符串。 Cougar
還具有默認構造函數。 按照這一行new Cougar().go();
在main
方法中,您正在創建一個Cougar
的新對象,該對象將調用默認構造函數,並隱式地調用super()
來調用Feline
類的構造函數。
現在, new Cougar().go()
方法將類型設置為"c"
,這意味着將變量的值更改為super.type
和this.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.