2010-10-30 15 views
10

Realmente no entiendo por qué el método getMyClass2 a continuación no puede ser estático, ¿por qué no es válido el código de Java?Método estático que devuelve la clase interna

public class MyClass 
{ 
    private class MyClass2 
    { 
     public String s1 = ""; 
     public String s2 = ""; 
    } 

    private MyClass2 myClass2; 

    private static MyClass2 getMyClass2() 
    { 
     MyClass2 myClass2 = new MyClass2(); 
     return myClass2; 
    } 

    public MyClass() 
    { 
     myClass2 = getMyClass2(); 
    } 
} 

Respuesta

13

Hay que decir que la clase interna es estático porque no estático está ligada a la instancia para que no pueda ser devuelto a partir método estático

public class MyClass 
{ 
    private static class MyClass2 
    { 
     public String s1 = ""; 
     public String s2 = ""; 
    } 

    private MyClass2 myClass2; 

    private static MyClass2 getMyClass2() 
    { 
     MyClass2 myClass2 = new MyClass2(); 
     return myClass2; 
    } 

    public MyClass() 
    { 
     myClass2 = getMyClass2(); 
    } 
} 
+0

1 para mostrar la clase interna estática – Flexo

+1

¿Hay una razón por la cual las clases internas no son estáticas por defecto? – AOO

+0

@AOO No creo que haya mucho uso para ellos – Flexo

2

Las instancias de la clase (no estáticos) interiores están siempre asociado con una instancia de la clase en la que están contenidos. El método estático se invocará sin referencia a una instancia específica de MyClass, por lo tanto, si creara una instancia de MyClass2, no habría ninguna instancia de MyClass para que se asocie.

+1

No siempre están asociados con la instancia, solo cuando no están estáticos – Gaim

+0

Gracias, aclaró eso en mi texto. – Flexo

+1

@Gaim: las clases internas nunca son estáticas. Se los llamará clases anidadas. – BalusC

0

Sí,

porque el 99% de las veces usted no quiere que ellos estática; D

A "anidado" clase estática no es más que una clase de "nivel superior" que se define en el interior de otra clase. Si la clase estática MyClass2 en el ejemplo anterior fuera pública, simplemente podría decir MyClass.MyClass2() nueva; En el caso de una "clase interna" normal, debería decir eso a un objeto, no a la clase MyClass: MyClass some = new MyClass() y luego algo como new some.MyClass2() (Olvidé la sintaxis exacta).

Saludos

Cuestiones relacionadas