2017-10-05 54 views
-2

擴展抽象外部類的靜態內部類我今天看到的這個模式,它混淆了我很多:在Java

abstract class A { 
    // does something 

    static class B extends A { 
     // does something as well 
    } 
} 

兩個奇怪的事情,我發現它:

  • 靜態類可以被初始化使用new A.B()
  • 靜態類在應用程序中並不是唯一的(因此,不是真正的靜態),因爲每個初始化都會創建一個新對象。

對於爲什麼要使用這種模式,我仍然感到不安。在這種情況下,static class是否意味着您可以靜態訪問它的構造函數,而不需要創建A的實例,但實際上它不是以任何方式在應用程序中是唯一的?

編輯:

OK,所以我覺得我的靜態類的理解從C#來了。我現在清楚Java類的靜態。但什麼時候你會使用這樣的模式(其中內部靜態類擴展外部抽象的一個)和爲什麼

+0

https://docs.oracle.com/javase/tutorial/java/javaOO/n ested.html – 2017-10-05 18:38:08

+2

「靜態類在應用程序中不是唯一的(因此,不是真正的靜態類),因爲每個初始化都會創建一個新對象。」 - 這不會爲類本身製作更多的副本,而這不是「靜態類」在Java中意味着什麼。也許你正在考慮C#。 – user2357112

回答

1

靜態類不能訪問外部類的方法和變量,它們的關鍵字類型意味着它是一個分離的類。

class Out { 
    int i; void x(){} 
    static class In() { 
     i++; x(); // not valid instructions 
    } 
    class In2() { 
     i++; x(); // valid instructions 
    } 
} 

實例化一個靜態內部類,你只需創建它的對象:

Out o = new Out(); 
    Out.In2 obj = new o.In2(); 

Out.In obj = new Out.In(); 

非靜態需要外部類的一個實例以實例化(如果在Out的內部實例化In2這是隱含的)