簡體   English   中英

Java調用超級構造函數的困惑

[英]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; 我對從YfkCYfkA的過程感到困惑。

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

我寫了一篇有關該主題的文章,希望能消除您的疑問。

構造函數繼承(ovveriding)以及Java中限制構造函數繼承的原因

每當實例化一個子類時,它的父構造函數都會在鏈中依次調用。

在您的層次結構中,您具有:

  • YfkC
  • YfkB
  • 抽象YfkA
  • Object

...並且在他們的每個構造函數中,都對super()了隱式調用。

因此, new YfkC調用YfkB的構造函數,后者又調用抽象類的YfkA的構造函數,從而導致x遞增。

如果再次執行new YfkC().xnew YfkC().x得到5,因為每次更新YfkA ,您都將調用該構造函數。

暫無
暫無

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

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