2012-07-27 20 views
5

Eventuali duplicati:
Why cant we have static method in an inner class?Perché una classe interna non statica non può avere membri statici (campi e metodi)?

So che la creazione di un oggetto interno di classe non-statico richiede un oggetto esterno classe e l'oggetto interno di classe non statica creato ha automaticamente un riferimento nascosto all'oggetto della classe esterna. Ma perché una classe interna non statica non può avere membri statici? Il progettista Java deve solo disabilitare l'accesso di campi non statici di classe esterna all'interno di un metodo statico della classe interna, avrebbe più senso, non?

Se non ha senso avere membri statici in una classe interna, perché la classe interna può ereditare membri statici ereditando una classe che ha membri statici?

Ho letto anche questo post. Come è menzionato:

classi interne possono ereditare i membri statici che non sono in fase di compilazione costanti anche se non li possono dichiarare. Le classi nidificate che non sono classi interne possono dichiarare membri statici liberamente, in conformità con con le solite regole del linguaggio di programmazione Java.

E 'una convenzione?

Ecco il mio codice:

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

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

risposta

6

Tecnicamente non non so di alcuna ragione per cui la lingua limita l'uso di elementi statici per le classi interne. Una classe interna non statica può essere emulata utilizzando una classe normale che accetta l'istanza (in precedenza) che include come argomento per il costruttore. Naturalmente ci sono molte piccole differenze quando si tratta di regole di visibilità e di visibilità.

Presumo che sia stata una decisione di progettazione del linguaggio, soprattutto perché la statica nelle classi interne non statiche è di accesso confuso e non intuitivo (Outer.Inner.StaticMember).

-1

Non v'è alcun punto di fornire un metodo statico all'interno di una classe interna non statica. È possibile utilizzare invece un metodo non statico all'interno della classe esterna?

+0

"nessun punto" non è una risposta e inoltre non affronta il problema dei dati dei membri oltre ai metodi. – RichieHH

7

1. Un object di un Non-static inner class è associato ad un instance/object della sua Outer Class (cioè classe racchiude).

2. L'intero corpo di unNon-static inner class non è all'interno di un ambito statico, e quindi si non possono avere membri statici in là.

3.Instance variables e methods nel non-static inner class sono rispetto a un'istanza della classe contenitrice, quindi è correlata a un oggetto, statico non sarà vero per loro (cioè classe interna),

4. Quando creiamo un Instance di non staticiinner class, abbiamo Need un Object of Outer enclosing class. Lo internonon-static class ha un riferimento implicito outer enclosing class.

Esempio:

Outer o = new Outer(); 
Outer.Inner i = o.new Inner(); 
Problemi correlati