如何使用另一个内部类方法的内部类实例?

时间:2009-09-10 17:05:10

标签: java inner-classes

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 个答案:

答案 0 :(得分: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将成为标识符。

答案 1 :(得分:0)

这里有些不妥之处;

  • 你的内心需要呼唤 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 - &gt; parentEx7 - &gt; child inner1。

如果你使内部类是静态的,你就可以废除Ex7引用,因为你定义了内部类不需要外部类的实例存在。

答案 2 :(得分:0)

但是Ex7Inner2类中没有方法。 使用'i1.bar();'创建方法在里面打电话,它编译好了

答案 3 :(得分:0)

Ex7Inner1需要引用Ex7才能实例化。来自Ex7Inner2的引用为Ex7.this

如此说

Ex7Inner1 i1 = Ex7.this.new Ex7Inner1()

从更多信息中查看Java Tutorial