簡體   English   中英

何時在java中使用“static”的這些變體

[英]when to use these variations of “static” in java

有人可以解釋以下案例之間的區別以及我們在哪里使用每個案例? 謝謝大家

class A{
  static public void methodA()
}

static class B{
  static public void methodB()
}

static class C{
  public void methodC()
}

編輯:大家好,謝謝你的回答。 我也許還不夠清楚。 我知道除非它們是內部類,否則不能將類B和C聲明為靜態。 我在你的答案中,請假設他們是內部階級。 我想知道何時將它們聲明為靜態,甚至何時聲明它們的方法是靜態的。 我知道非靜態類中的靜態方法意味着您可以從任何地方調用它,並且通常執行非特定於對象的常規操作。 但是你為什么要聲明靜態類呢? 在重新閱讀我的編輯並接受最具說明性的答案后,我會再次檢查您的答案

static修飾符用於聲明靜態字段或類變量

它們與類相關聯,而不是與任何對象相關聯。 該類的每個實例共享一個類變量,該變量位於內存中的一個固定位置。 任何對象都可以更改類變量的值,但也可以在不創建類實例的情況下操作類變量。

來源: “了解實例和類成員”

另請注意,Java支持靜態變量和方法。 所以,通過這個,你的第一個類將正確編譯,而其他兩個將失敗。

舉個例子:

class A{
    public static int STATIC_VALUE = 1; // is a valid static variable

    public static void method1(){ 
        //is a valid static method
    }

    /**
    * Is a valid static inner class
    */
    static class innerClassB{

    }
}

但是你為什么要聲明靜態類呢?

關於為什么人們可能想要這樣做的原因有很多。 例如,從這個Java教程

靜態嵌套類與其外部類(和其他類)的實例成員交互,就像任何其他頂級類一樣。 實際上,靜態嵌套類在行為上是一個頂級類,它已嵌套在另一個頂級類中以方便打包。

一個很好的例子是static class Entry<K,V> implements Map.Entry<K,V>在像HashMap類這樣的地方使用的static class Entry<K,V> implements Map.Entry<K,V>

Entry類的存在與HashMap如何存儲/檢索存儲為其內容的鍵/值對的功能密切相關。 正如您所看到的,Entry類僅為HashMap實現提供功能,即使它的行為等同於頂級類。 因此將它打包為HashMap定義本身的一部分是有意義的。

您可以在LinkedList實現中找到與private static class Entry<E>類似的用法。

我能想到的另一個原因是白盒測試方法 由於內部靜態類可以訪問外部類的私有和受保護的靜態變量/方法,因此您可以很好地使用它來測試外部類的內部狀態。 有些人可能認為這很臟,但有時它可能有用

在我看來,靜態內部類主要是為了方便,通常基於您的設計原則。

A類將具有靜態類級方法。 它會與任何類實例無關

B類和C類是非法的,你不能將類定義為靜態。

編輯:就像HFoE所說的那樣,如果他們是內部階級,B或C會起作用。 在這種情況下,他們將無法訪問外部類的實例屬性。

static基本上有兩種用途。

  • 類上的static只能用於嵌套類; 即在其他類中聲明的命名類。 這意味着嵌套類的實例沒有封閉外部類的父實例。

  • 方法上的static意味着該方法不適用於包含類的實例; 即方法的主體不能參考this


這意味着您的BC聲明在寫入時無效,因為它們未在外部類中聲明。

(另一個答案是頂級類是隱式靜態的。從某種意義上說,這是正確的,但另一種看待它的方式是static對頂級類來說毫無意義。無論哪種方式,Java語言都不允許你聲明作為static的頂級類。這是編譯錯誤。)

所有外層類都是靜態的,但是你不能為它們提到靜態保留字,所以B和C作為外層類是非法的。

但所有情況都是有效的內部類。 在這種情況下,A是成員內部類,但B和C是靜態內部類(相當於普通類)。

A和B包含靜態方法,但C不包含。

暫無
暫無

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

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