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の設計ですか?どうして?
は "内部クラスは、外部クラスのメンバ変数として扱われます。"これは何を意味するのでしょうか?内部クラスは外部クラスのメンバ変数ではありません。どのようにして彼らはそのように扱われますか? –
私が書いたちょっと混乱した言葉かもしれません。私は彼らが外部クラスのメンバーとして行動すると言います。したがって、外部クラス参照を使用してアクセスする必要があります。私はSCJP、第8章内部クラスのkathie sierra本からこれを学んだ。 –
"非静的な内部クラスは外部クラスのメンバーとして扱われます。"それは当てはまりますが、静的メンバークラスも外部クラスのメンバーです。 JLS: "メンバークラスは、宣言が別のクラスまたはインターフェイス宣言に直接囲まれたクラスです。"内部クラスについて特別なことは、それらが囲むインスタンスを持つことだけです。 –