簡體   English   中英

靜態類成員在Java中是靜態的嗎?

[英]Are static class members static in Java?

在下面的代碼,是bshow內在靜態?

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.

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