2009-09-10 75 views
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(); 
    } 
} 
+0

你试过了吗?发生了什么?我没有尝试过,但我怀疑你的内部公开课实际上是公开的,但它应该起作用。 – 2009-09-10 17:10:44

+0

答案实际上与内部类没有任何关系,它是一个基本的语法错误。 – skaffman 2009-09-10 17:11:41

+0

我错过了Ex7Inner2的问题。我正在等待Eclipse启动。 – 2009-09-10 17:19:03

回答

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

现在我觉得这是一个愚蠢的问题..我怎么能写这样的代码? – 2009-09-10 17:43:09

+0

哈哈,我经常发现自己也在问自己的代码。不要让它让你失望 - 你并不孤单! – 2009-09-10 17:51:52

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引用,因为您正在定义内部类不需要存在外部类的实例。

0

但在Ex7Inner2类中没有方法。 用'i1.bar();'创建方法''内部调用,编译好

0

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

这样说

Ex7Inner1 i1 = Ex7.this.new Ex7Inner1() 

从更多信息,请参见Java Tutorial

相关问题