[英]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;}
}
輸出如下:
11 22 11
11 22 11
3:11 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.