2008-12-04 14 views
6

Perdón por el título incorrecto, pero no se me ocurrió una mejor.Dos preguntas sobre clases internas en Java (clase A {clase B {}})

estoy teniendo una clase A y de clase B, que es una especie de subclase de A, así:?

(¿Existe en realidad un nombre correcto porque no es "subclase" reservados para la herencia?)

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 
    } 
} 

de B se puede acceder a todas las propiedades de a, por lo tanto, tanto, ai y bi, regresan 0. Ahora, me pregunto si se trata de alguna manera posible para recuperar el objeto original de tipo a a cabo de b, ya que b contiene todo lo que a contiene? El simple casting aparentemente no funciona.

segunda:

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."); 
     } 
    } 
} 

Usted podría, alternativamente, también me dan algunos buenos recursos sobre este tema, ya que he estado demasiado estúpidos para encontrar uno bueno hasta ahora.

Gracias de antemano. :)

+0

El nombre correcto es clase interna, creo. – tvanfosson

+0

Creo que este es un duplicado de esta pregunta (http://stackoverflow.com/questions/309737/how-to-refer-to-the-outer-class-in-another-instance-of-a-non- static-inner-class) –

+0

Gracias Dan, esto me ayudó mucho!:) – balu

Respuesta

20

No parece ser una manera de acceder a la clase externa desde fuera. Pero se puede hacer así:

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 será la instancia de la outerclass asociado a la instancia de una clase interna.

+0

Creo que B b = ... está mal. No se puede declarar una referencia de tipo B sin utilizar AAB b = ... Sería mejor ... – OscarRyz

+0

sí, yo también lo pensé –

+0

Haría la declaración 'final A outer = A.this;' para estar en el lado seguro –

2

[Editar:. Mi respuesta es apropiado para programadores de C#, pero no puede garantizar que su aplicables a Java]

B es una clase interna, no una subclase de A. Además, B hace no mantenga una instancia de a, por lo que su código como es no puede devolver cualquier instancia de A.

es necesario reestructurar sus clases de la siguiente manera:

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

Ahora su clase B tiene un campo 'Padres 'que devuelve a su padre Puede utilizar estas clases de la siguiente manera (esto es sintaxis de C#, porque no sé si Java tiene una sintaxis diferente para crear instancias de clases internas):

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

Por supuesto, la creación de la clase B de esta manera parece poco Gracioso: técnicamente, puedes pasar a cualquier padre. Probablemente sería mejor volver a escribir la clase A con un método que devuelve un B:

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; 
} 
+0

De hecho, contiene una instancia de A. Vea también: http://stackoverflow.com/questions/309737/how-to-refer-to-the-outer-class-in-another-instance-of-a Sin embargo, gracias por su respuesta. La forma en que describes es ciertamente otra solución. – balu

+1

Parece que la "clase interna" se refiere a un concepto diferente al de Java (aproximadamente lo que Java llamaría "clase anidada"). –

7

Puede acceder a ella con la sintaxis ParentClass.this desde dentro de la clase interna.

p. Ej.

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

esto parecía funcionar para mí

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); 
    } 
} 
Cuestiones relacionadas