簡體   English   中英

Java中的變量陰影,多種情況靜態/非靜態

[英]Variable shadowing in Java, multiple cases static/non static

我最近一直在學習 Java 課程,我們正在處理程序輸出、編譯錯誤等。我自己嘗試過不同的代碼,我實驗中的一件事讓我感到困惑:首先,主要方法如下所示:

public static void main(String[] args){
     A a = new A();
     B b = new B();
     A ab = new B();

     System.out.println(a.a + " " + b.a + " " + ab.a);

}

現在我嘗試了這些不同的版本:

//1
public class A {
  public static int a = 1;
   public A() {
    a = 11;
   }
}
public class B extends A {
  public static int a = 2;
   public B(){ a = 22;}
}
//------------
//2
public class A {
  public int a = 1;
   public A() {
    a = 11;
   }
}
public class B extends A {
  public static int a = 2;
   public B(){ a = 22;}
}
//--------------
//3
public class A {
  public static int a = 1;
   public A() {
    a = 11;
   }
}
public class B extends A {
   public B(){ a = 22;}
}
//-----------
//4
public class A {
  public int a = 1;
   public A() {
    a = 11;
   }
}
public class B extends A {
   public B(){ a = 22;}
}

輸出如下:

  1. 11 22 11

  2. 11 22 11

3:11 22 22

  1. 22 22 22

雖然我可以理解輸出 1 和 2,但輸出 3 和 4 對我來說真的很困惑。

對於3:B中的a = 22 ,改變了A對象ab的a的值,因為在B中沒有再次聲明int a?

對於 4:如果 A 中的int a不是靜態的,並且a是類型 A 的對象,那么為什么 aa 具有 ba 的值? 當我將int a 設置為非靜態時,4 中發生了什么?

提前致謝!

重要提示:案例 4 的答案是 11 22 22

情況 3:當 A ab = B() 執行 B 的構造函數時,在 A 中設置靜態變量 a 使其值為 22。

情況4:類A和B都有實例字段(a)(實際上類B從類A繼承了這個屬性)並且在構造時首先執行類A的構造函數然后執行類B的構造函數所以當我們有A時= B() 類 A 的第一個構造函數將變量 a 設置為 11 然后類 B 的構造函數將其設置為 22 子類中的靜態字段不要覆蓋父類中的靜態字段,如果您訪問靜態結果不取決於對象本身的類型,而是取決於您用來訪問該對象的引用類型,因此當您編寫 A a = B() 時,如果 A 和 B 都具有靜態字段 a,則aa 的結果是類 A 中的 a 而不是類 B 中的 a,因為這里用來訪問對象的引用類型是 A,而對象類型本身是 B。

暫無
暫無

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

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