2010-03-04 93 views
22

我想找到爲什麼類不能被創建爲靜態?像:爲什麼不能將Java類聲明爲靜態?

public static class Qwert{ 

    public static void main(String args[]){ 

     int x = 12; 
     while(x<12){ 
      x--; 
     } 
     System.out.println(" the X value is : "+ x); 
    } 
} 

回答

53

在Java中,static關鍵字通常標誌的方法或場爲現有的每一個類的實例不是一次,而是一次過。一個類無論如何都存在一次,所有的類都是這樣的「靜態」,所有的對象都是類的實例。

static確實有類,這是完全不同的含義:一般的內部類的實例可以訪問一個外部類實例,它的綁的成員,但是,如果內部類是static,它不有這樣一個引用,並且可以在沒有外部類的實例的情況下被實例化。也許你看到了某個地方,然後試圖將它用在頂級課程上,而這並沒有意義。

或者你也許看到過像C#這樣的其他語言,它的語法非常像Java。

(有一次,我無法弄清楚爲什麼外部類實例沒有被垃圾回收 - 這是因爲我在其他地方保持對其內部類實例的引用,而內部類不是因此,默認情況下,我現在創建內部類static)。

+3

非常有特色。默認情況下,內部類不是靜態的,也就是說每個具有嵌套類的類的每個實例都獲得自己的嵌套類的副本。這就是如何在類中引用「this」的原因,以及爲什麼不能聲明靜態方法或字段,因爲外部類的每個實例都有自己的副本,所以沒有任何意義。 「靜態」嵌套類(根據定義是一個真正的「內部」類)意味着只有一個類的副本,這更像是一個普通的類。 我一直認爲這些嵌套類的語義是絕望的錯綜複雜。 – 2010-03-04 04:55:27

+0

另外,我還關注了每個實例存在一次的非靜態方法的真相,但實際上它們並非從內存的角度出發。我只是在提出一個概念上的觀點。 – 2010-03-04 05:09:29

+0

@jeff,根據該類的對象實例化,靜態聲明的內部類和非靜態類之間有什麼區別?有沒有,你只能從靜態內部類實例化一個對象,並且可以從非靜態內部類實例化多個對象?是嗎? – ultrajohn 2010-03-04 05:11:14

9

要防止實例化特定類,您應該添加一個私有構造函數。這會阻止「任何其他」類無法創建Qwert類型的對象。

例如:

public static class Qwert{ 


     private Qwert() {} 

     public static void main(String args[]){ 

      int x = 12; 
      while(x<12){ 
       x--; 
      } 
      System.out.println(" the X value is : "+ x); 
     } 
    } 
+0

良好的見解,這可能是他想要做的事情來想想它。 – 2010-03-04 05:01:11

1

爲了防止任何類從創建的Qwert一個實例,或者通過繼承或使用reflection,您做出的構造放置一個毒丸失敗:

public class Qwert { 

    private Qwert() throws IllegalAccessException { 
     throw new IllegalAccessException("Utility class!"); 
    } 

    public static class Yuiop { 
     public Yuiop() throws IllegalAccessException { 
      // generates a synthetic accessor method to super() 
     } 
    } 

    public static void main(String args[]) { 
     new Yuiop(); 
    } 
} 
1

它的因爲當我們使用靜態關鍵字爲一個組件,該組件成爲一個級別的組件,它的內存是由它的類採取。

1

我們應該定義成員靜態這

  1. 應該是共同的類的所有對象。
  2. 應該屬於該類並且可以按類名訪問。
  3. 不應該需要類的對象來訪問它們。

現在假設我們將外部類定義爲靜態,並假設我們允許這樣做。這是否會爲開發人員提供任何目的或提供任何優勢,否則這會給開發人員和語言創建者帶來模糊性和複雜性?

讓我們來檢查一下,將外部類定義爲靜態將用於我們在上面定義或不定義的目的?

  1. 每個類對於它的所有對象都已經是通用的,並且不需要使其對所有對象都是靜態的。
  2. 我們需要一個類名來訪問它的靜態成員,因爲這些成員是類的一部分,而外部類是包的一部分,我們可以直接通過編寫package_name.class_name(類似於class_name.static_field_name)來訪問類,So再次沒有必要做默認情況下已經存在的內容。
  3. 我們不需要任何對象來訪問類,如果它是可見的,我們可以簡單地寫入package_name.class_name來訪問它。根據定義,類是其對象的藍圖,我們創建一個類來創建對象(異常將始終存在於例如java.lang.Math中),同樣不需要將外部類定義爲靜態。

從以上幾點,我們可以說Java的創作者也不允許外部類是靜態的,因爲沒有必要,使其靜態的。允許將外部類靜態化只會增加複雜性,模糊性和重複性。閱讀更多信息Why An Outer Java Class Can’t Be Static

相關問題