1
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

4 回答 4

8

您的问题是您需要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将是标识符。

于 2009-09-10T17:09:20.960 回答
0

这里有一些问题;

  • 你的 inner2 需要在函数内部调用 i1
  • 因为你没有声明 inner1 静态它需要一个封闭的 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 引用,因为您正在定义内部类不需要存在外部类的实例。

于 2009-09-10T17:11:57.767 回答
0

但是 Ex7Inner2 类中没有方法。使用 'i1.bar();' 创建方法 在里面调用它就可以编译了

于 2009-09-10T17:12:21.760 回答
0

Ex7Inner1需要引用Ex7才能实例化。从Ex7Inner2那个参考是Ex7.this.

这样说

Ex7Inner1 i1 = Ex7.this.new Ex7Inner1()

从更多信息中查看Java 教程。

于 2009-09-10T17:19:26.140 回答