2016-10-21 11 views
3

私はメインクラス "M" を持っているとSUB2は静的クラスである2つのインナーSUB1と呼ばれるクラス、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();"とすることができますが、メインではできません。 2. staicクラスsub2はインスタンスを持つことができますが、静的なsub1はできません?

これはJavaの設計ですか?どうして?

答えて

7
  • 非静的な内部クラスは、外部クラスのメンバーとして扱われます。
  • インスタンスを作成するには、外部クラスの参照を使用する必要があります。

ですから、このような何かをしなければならない、だから、

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

は、あなたのケースでは、

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

は "内部クラスは、外部クラスのメンバ変数として扱われます。"これは何を意味するのでしょうか?内部クラスは外部クラスのメンバ変数ではありません。どのようにして彼らはそのように扱われますか? –

+0

私が書いたちょっと混乱した言葉かもしれません。私は彼らが外部クラスのメンバーとして行動すると言います。したがって、外部クラス参照を使用してアクセスする必要があります。私はSCJP、第8章内部クラスのkathie sierra本からこれを学んだ。 –

+0

"非静的な内部クラスは外部クラスのメンバーとして扱われます。"それは当てはまりますが、静的メンバークラスも外部クラスのメンバーです。 JLS: "メンバークラスは、宣言が別のクラスまたはインターフェイス宣言に直接囲まれたクラスです。"内部クラスについて特別なことは、それらが囲むインスタンスを持つことだけです。 –

関連する問題