public class Ex7 {
private int fld;
private void meth(int val) {
fld = val;
System.out.println(" meth() -> fld = " + fld);
}
public class Ex7Inner1 {
void operateOnFld() {
fld = 12;
}
void operateOnMeth() {
meth(10);
}
public void bar() {
System.out.println(" bar() ");
}
}
class Ex7Inner2 {
Ex7Inner1 i1 = new Ex7Inner1();
// how to call i1.bar() ??
i1.bar();
}
}
4 に答える
あなたの問題はi1.bar()
、関数内で呼び出す必要があることです。例えば
class Ex7Inner2 {
Ex7Inner1 i1 = new Ex7Inner1(); // this is now a field of the Ex7Inner2 class
public void callBar() {
i1.bar(); // this will work
}
}
将来、質問にエラーを含めると、人々がより役立つことがわかるかもしれません. コードを自分のやり方でコンパイルしようとすると、次のようなエラーが発生します
Ex7.java:26: <identifier> expected
i1.bar();
^
1 error
これは、メソッドの外側で (最初に持っていたように) できる唯一のことは、変数を宣言することだからです。したがって、「宣言している変数の名前」を意味する「識別子」を期待していました。だからもしあなたが言っていたら
String s;
その後s
、識別子でした。
ここでいくつか問題があります。
- inner2 は関数内で i1 を呼び出す必要があります
- inner1 static を宣言しなかったため、それを囲む Ex7 のインスタンスが存在する必要があります。
したがって、次のようなことができます。
public class Ex7 {
private Ex7Inner1 i1;
public class Ex7Inner1 {
public void bar() {
System.out.println( " bar() " );
}
}
class Ex7Inner2 {
// how to call i1.bar() ??
public Ex7Inner2() {
Ex7.this.i1.bar();
}
}
}
Ex7 の i1 にアクセスします。
Ex7 インスタンスには inner1 と inner2 が含まれ、inner2 内からの参照は inner2-->parentEx7 -->child inner1 です。
内部クラスを静的にすると、Ex7 参照を廃止できます。これは、内部クラスが外部クラスのインスタンスを存在させる必要がないことを定義しているためです。
Ex7Inner2 クラスにはメソッドがありません。「i1.bar();」でメソッドを作成 内部で呼び出すと、正常にコンパイルされます
Ex7Inner1
Ex7
インスタンス化するには参照が必要です。Ex7Inner2
その参照からですEx7.this
。
このように言う
Ex7Inner1 i1 = Ex7.this.new Ex7Inner1()
詳細については、Java チュートリアルを参照してください。