[英]Are static class members static in Java?
在下面的代碼,是b
和show
內在靜態?
public class A {
public static class B {
private int b = 0;
public void show() {
System.out.println(b);
}
}
}
不,它們不是static
。 您需要創建B
的實例才能訪問它們。
代碼示例中的static
關鍵字意味着可以在沒有A實例的情況下創建B實例。
如果B
不是靜態的:
A
的實例。 A
使用new B()
或使用類似於new A().new B()
語法。 B
方法可以引用A.this
(對A
實例的隱式引用)。 B
方法可以引用A.this.someField
(使用A.this.someField
式引用)。 B
可以調用實例(非靜態)方法A
。 但是,由於B
是靜態的:
A
實例的引用-您不需要A
即可創建B
new AB()
創建實例(或僅從類A
內的new B()
創建實例) B
方法不能引用A.this
。 B
方法無法訪問A中的字段(除非作為參數傳遞)。 B
不能調用實例(非靜態)方法A
。 它們不是靜態的。 它們是B中的實例字段。
這意味着您需要有一個B實例來獲取/設置它們。
B在A中是靜態的,但不會使B的那些字段靜態。
您可以創建許多B實例,而無需任何引用A。
因此,B是A中的靜態類,但對於B的實例字段則並非如此。
static關鍵字有兩個含義,實際上是完全不同的,可能會造成混淆。
變量/方法上的靜態意味着它存在於類級別,而不是實例級別。 這意味着無論您創建多少個類實例,該變量/方法都只有一個副本。
內部類上的static雖然只是意味着該類不依賴於其外部類。 在您的示例中,您可以創建一個new B()
而不使用A
如果您在類上沒有static關鍵字,則無法創建new B()
除非它在A
的實例內。
B是A的靜態內部類。需要實例化B。
A.B innerObject = new A.B();
innerObject.show();
static
標識符在這里有一個特定的目的,很多人沒有立即掌握。 我將采用您的代碼並對其進行一些更改。
public class A {
private int a;
public A(int a) {
this.a = a;
}
public class B {
public void show() {
System.out.println(a);
}
}
}
現在, B
類發生了什么? 因為B
是非靜態類,所以它可以訪問類A
其他非靜態成員。 從本質上講,它聲明每個A
類對象都有自己的B
類對象風格,甚至認為它們在功能上是相同的。 如果B
是靜態類,我們可以得到相同的行為:
public class A {
private int a;
public A(int a) {
this.a = a;
}
public int getA() { return a; }
public static class B {
public void show(A a) {
System.out.println(a.getA());
}
}
}
在這里,這意味着B
對象的風格不會根據創建它的A
對象而改變。 B
類是靜態的,因此它無法訪問創建它的A
類對象的非靜態成員,並且必須從要與之交互的任何A
對象中顯式訪問那些成員。
在先前的實現中, B
對象將無縫訪問創建它的A
對象的字段和非靜態方法。
這是兩種不同的行為,通常很清楚地表明哪種行為符合您的目標。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.