2008-12-04 124 views
6

对不起,我想不出一个更好的标题。关于Java中内部类的两个问题(class A {class B {}})

我有一个A类和B类这是怎样的一个子类A的,就像这样:?

(有没有真正为它的正确名字是不是“子类”保留继承?)

class A { 
    int i = 0; 
    class B { 
     int j = 1; 
    } 
} 

class Test { 
    public static void main() { 
     A a = new A(); 
     B b = a.new B(); 
     A c = ??? b ??? // get "a" back 
    } 
} 

从B A的每个属性都可以访问,因此两者ai和bi,返回0。现在,我想知道它是否在某种程度上可以检索A型出的原始对象b,因为b包含a包含的所有内容?简单的铸造显然没有办法。

第二个:

class A { 

    void print() { 
     System.out.println("This is class A."); 
    } 

    class B { 
     void print() { 
      // <--- How to access print() of class A (like this.A.print() or smth)? 
      System.out.println("This is class B."); 
     } 
    } 
} 

你可以备选地也为我提供了一些很好的资源就这个话题,因为我已经太傻找到一个好为止。

在此先感谢。 :)

+0

正确名称的内部类,我相信工作。 – tvanfosson 2008-12-04 00:35:33

+0

我相信这是这个问题的重复(http://stackoverflow.com/questions/309737/how-to-refer-to-the-outer-class-in-another-instance-of-a-non-静态内部类) – 2008-12-04 00:38:27

+0

谢谢丹,这帮了我很多!:) – balu 2008-12-04 00:49:35

回答

20

似乎没有被从外部访问外部类的方法。但是你可以做这样的:

class A { 
    int i = 0; 
    class B { 
     final A outer = A.this; 
     int j = 1; 
    } 
} 

class Test { 
    public static void main() { 
     A a = new A(); 
     A.B b = a.new B(); 
     A c = b.outer // get "a" back 
    } 
} 

ClassName.this将与一个内部类的实例相关联的的在OuterClass的实例。

2

[编辑:我的回答是适用于C#程序员,但我不能保证其适用于Java的]

B是一个内部类,而不是A.另外的子类,B不未持有的实例,让你的代码不能返回A.

您需要调整您的类如下的任何实例:

class A 
{ 
    public class B 
    { 
     public A Parent; 
     public B(A parent) 
     { 
      this.Parent = parent; 
     } 
    } 
} 

现在您的B级有场“家长'返回它的父项。可以按如下方式使用这些类(这是C#语法,因为我不知道Java有实例内部类不同的语法):

public static void Main(String[] args) 
{ 
    A parent = new A(); 
    A.B child = new A.B(child); 
    A backToParent = child.Parent; 
} 

当然,用这种方法创建您的B级似乎没有有趣的是:从技术上讲,你可以通过任何父母。它可能会更好用,它返回一个B中的方法来重写你的A类:

class A 
{   
    public class B 
    { 
     public A Parent; 
     public B(A parent) 
     { 
      this.Parent = parent; 
     } 
    } 

    public B getChild() 
    { 
     return new B(this); 
    } 
} 

public static void Main(String[] args) 
{ 
    A parent = new A(); 
    A.B child = A.getChild(); 
    A backToParent = child.Parent; 
} 
7

您可以在内部类中使用ParentClass.this语法来访问它。

例如

public class Outter 
{ 
    class Inner { 
     public Outter getOutter() 
     { 
      return Outter.this; 
     } 
    } 

    public Inner getInner(){ 
     return new Inner(); 
    } 
} 

class Runner{ 
    public static void main(String[] args){ 
     Outter out = new Outter(); 
     Outter.Inner inner = out.getInner(); 

     System.out.println(inner.getOutter().toString()); 
    } 
} 
1

这似乎为我

class A { 
    int i = 0; 
    class B { 
     int j = 1; 
    } 
} 

class Test { 
    public static void main() { 
     A a = new A(); 
     A.B b = a.new B(); 
     A c = (A)b.getClass().getDeclaredField("this$0").get(b); 
    } 
}