2012-07-27 12 views
5

Duplicar posible:
Why cant we have static method in an inner class?¿Por qué una clase interna no estática no puede tener miembros estáticos (campos y métodos)?

Sé que la creación de un objeto de la clase interna no estática requiere un objeto de clase exterior y el objeto de la clase interna no estático creado automáticamente tiene una referencia oculta al objeto de la clase externa. Pero ¿por qué una clase interna no estática puede tener miembros estáticos? El diseñador de Java solo tiene que rechazar el acceso de campos de clases externas no estáticas dentro de un método estático de la clase interna, tendría más sentido, ¿no?

Si no tiene sentido tener miembros estáticos en una clase interna, ¿por qué la clase interna puede heredar miembros estáticos al heredar una clase que tiene miembros estáticos?

He leído esto post también. Como se menciona:

Las clases internas pueden heredar los miembros estáticos que no son en tiempo de compilación constantes a pesar de que no pueden declarar ellos. Las clases anidadas que no son clases internas pueden declarar miembros estáticos libremente, de acuerdo con con las reglas habituales del lenguaje de programación Java.

¿Es una convención?

Aquí está mi código:

public class OuterClass { 

    private int outerClassField; 

    public void doSomethingOuterClass() { 
     outerClassField = 1; 
    } 

    public static void doSomethingStaticOuterClass() { 
     // outerClassField = 2; // Error: Because static method cannot access an specific object's field 
    } 

    public class InnerClass extends ClassWithStaticField { 

     // Error: Why a non-static inner class cannot have static fields ? 
     // public static int innerClassStaticField = 1; 

     public void doSomethingInnerClass() { 
      outerClassField = 3; 
      staticField = 1; 
     } 

     // Error: Why a non-static inner class cannot have static methods ? 
     // public static void doSomethingStaticInnerClass() { 
     // outerClassField = 4; 
     // } 
    } 

    public static void main(final String[] args) { 
     // If it does not make sense to have static members in an inner class, why inner class can inherit statis members by inheriting a class who has static 
     // members? 
     OuterClass.InnerClass.staticField = 1; 
     OuterClass.InnerClass.staticMethod(); 
    } 
} 

class ClassWithStaticField { 
    public static int staticField; 

    public static void staticMethod() { 
    }; 
} 
+0

Ver también: http://stackoverflow.com/questions/2482327/why-can-we-have-static-final-members-but-cant-have-static-method-in-an-inner-cla – Autar

Respuesta

6

Técnicamente no sé de ninguna razón por la lengua restringe el uso de elementos estáticos de clases internas. Se puede emular una clase interna no estática mediante el uso de una clase normal que toma la instancia (anterior) adjunta como argumento para el constructor. Por supuesto, existen muchas pequeñas diferencias en lo que respecta a las reglas de visibilidad y los ámbitos de visibilidad.

Supongo que fue una decisión de diseño del lenguaje, principalmente porque las estáticas en las clases internas no estáticas son confusas y no tienen acceso intuitivo (Outer.Inner.StaticMember).

-1

No hay punto de proporcionar un método estático dentro de una clase interna no estática. ¿Podría usar un método no estático dentro de la clase externa en su lugar?

+0

"no point" no es una respuesta y tampoco aborda el problema de los datos de los miembros además de los métodos. – RichieHH

7

1. Un object de un Non-static inner class se asocia con un instance/object de su (es decir, clase envolvente) Outer Class.

2. Todo el cuerpo de un Non-static inner class es no dentro de un alcance estática, y por lo tanto no puede tener miembros estáticos en ese país.

3.Instance variables y methods en el non-static inner class son relativa a una instancia de la clase envolvente, por lo que se relaciona con un objeto, estático no será verdad para ellos (es decir, clase interna),

4. Cuando creamos un Instance de no estáticoinner class, que necesitamos un Object of Outer enclosing class. innernon-static class tiene la referencia implícita él outer enclosing class.

Ej:

Outer o = new Outer(); 
Outer.Inner i = o.new Inner(); 
Cuestiones relacionadas