[英]Java calling Super constructor confusion
class Yfk {
public static void main(String[] args) {
System.out.println(new YfkC().x);
}
}
abstract class YfkA {
int x = 3;
YfkA() { x++; }
}
class YfkB extends YfkA {}
class YfkC extends YfkB {}
最終結果是4。我不清楚擴展過程。 在主函數中,我們創建一個對象YfkC並調用Yfkc.x.
我的理解是,由於沒有方法並且在類yfkc中進行了歸檔,因此我們在yfkb中找到,然后在yfkc中找到。 此時,YfkC是否會自動轉換為YfkA? 等於System.out.println(new YfkA().x);
因此我們將得到x = 4;
我對從YfkC
到YfkA
的過程感到困惑。
new YfkC().x
這在內部調用子類的構造函數。 因此x的值增加並打印為4。
YfkC() -> YfkB() -> YfkA() { x++;};
每個類的默認構造函數都在調用super();
。 在執行超類的默認構造函數之前,將其自身調用。
如果您想了解構造函數鏈,則將其作為系統發布,並查看調用鏈。
public class Yfk {
public static void main(String[] args) {
System.out.println(new YfkC().x);
}
}
abstract class YfkA {
int x = 3;
YfkA() {
System.out.println("YfkA");
x++; }
}
class YfkB extends YfkA {
public YfkB() {
System.out.println("YfkB");
}
}
class YfkC extends YfkB {
public YfkC() {
System.out.println("YfkC");
}
}
輸出:
f
f
f
4
當您調用任何Child構造函數時。 當前類有一個到直接父類構造函數的鏈調用。 調用一直持續到Object類構造函數被調用為止,因為大多數父類可能是超類。
這是構造函數在繼承中的行為示例
public class ParentClass {
public ParentClass() {
System.out.println("Parent default constructor invoked");
}
public ParentClass(int a) {
System.out.println("Parent argumented constructor invoked");
}
public static void main(String[] args) {
SubSubClass sub = new SubSubClass();
}
}
class SubClass extends ParentClass {
public SubClass() {// not calling any super
System.out.println("Child default constructor invoked");
}
public SubClass(int b) {
super(b);
System.out.println("Child default constructor invoked");
}
}
class SubSubClass extends SubClass {
public SubSubClass() {// not calling any super
System.out.println("Sub Child default constructor invoked");
}
public SubSubClass(int b) {
super(b);
System.out.println("Sub Child default constructor invoked");
}
}
OUTPUT:
Parent default constructor invoked
Child default constructor invoked
Sub Child default constructor invoked
我寫了一篇有關該主題的文章,希望能消除您的疑問。
每當實例化一個子類時,它的父構造函數都會在鏈中依次調用。
在您的層次結構中,您具有:
YfkC
YfkB
YfkA
Object
...並且在他們的每個構造函數中,都對super()
了隱式調用。
因此, new YfkC
調用YfkB
的構造函數,后者又調用抽象類的YfkA
的構造函數,從而導致x
遞增。
如果再次執行new YfkC().x
, new YfkC().x
得到5,因為每次更新YfkA
,您都將調用該構造函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.