2016-10-21 122 views
3

我有一個主類別 「m」 和2個內部類稱爲SUB1,SUB2,其中SUB2是靜態類:爲什麼java不允許創建內部類的實例?

public class m 
{ 
    String n="n"; 
    static String s="s"; 
    public class sub1 
    { 
    public void fn(){System.out.println(n);} 
    //static public void fs(){System.out.println(s);} 
    } 
    static class sub2 
    { 
    //public void fn(){System.out.println(n);} 
    static public void fs(){System.out.println(s);} 
    } 
    public void f() 
    { 
    sub1 s1=new sub1();//OK, no error 
    sub2 s2=new sub2();//OK 
    } 

    public static void main(String[] args) 
    { 
    m obj=new m(); 
    sub1 s1=new sub1();//Error 
    s1.fn(); 
    //s1.fs(); 
    sub2 s2=new sub2();//OK 
    //s2.fn(); 
    s2.fs(); 
    } 
} 

我使用的OpenJDK編譯它linux下,它報告錯誤

$ java -version 
openjdk version "1.8.0_91" 
OpenJDK Runtime Environment (build 1.8.0_91-8u91-b14-3ubuntu1~16.04.1-b14) 
OpenJDK 64-Bit Server VM (build 25.91-b14, mixed mode) 

$ javac m.java 
m.java:24: Error: Cannot reference non-static variable this in a static context. 
    sub1 s1=new sub1();//Error 
      ^
1 Errors 

這對我來說很奇怪: 1.在mf()成員函數中,我們可以「sub1 s1 = new sub1();」,但在main中,我們不能 2. staic class sub2可以有實例,靜態sub1 cann't?

這是Java的設計嗎?爲什麼?

回答

7
  • 非靜態內部類被視爲外部類的成員。
  • 要創建它們的實例,您需要使用外部類的引用。

所以,你必須做這樣的事情,

OuterClass outer = new OuterClass(); 
InnerClass inner = outer.new InnerClass(); 

所以,你的情況,

m obj = new m(); 
sub1 s1 = obj.new Sub1(); 
+0

「內部類作爲外部類的成員變量進行處理。」這是什麼意思?內部類不是外部類的成員變量。他們以什麼方式「被對待」? –

+0

也許有點混亂的話我寫了。我的意思是說,它們充當外部類的成員,因此需要使用外部類引用來訪問它們。我已經從kathie sierra的書SCJP,第八章內部課程學習了這個。 –

+0

「非靜態內部類被視爲外部類的成員。」這是真的,但靜態成員類也*外部類的成員。 JLS:「成員類是一個類,其聲明直接包含在另一個類或接口聲明中。」內部類唯一特別的是它們有一個封閉的實例。 –

相關問題