2071 Stimmen

Java innere Klasse und statische verschachtelte Klasse

Was ist der Hauptunterschied zwischen einer inneren Klasse und einer statischen verschachtelten Klasse in Java? Spielt der Entwurf/die Implementierung eine Rolle bei der Wahl einer dieser beiden Klassen?

99 Stimmen

Die Antwort von Joshua Bloch ist in Leistungsfähiges Java lesen item 22 : Favor static member classes over non static

24 Stimmen

Für das Protokoll, es ist Punkt 24 in der 3. Auflage des gleichen Buches.

0voto

Jonathan Cole Punkte 161

Statische verschachtelte Klassen greifen auf PRIVATE statische Variablen auf Klassenebene der Klasse zu, in der sie definiert sind. Dies kann aus architektonischer Sicht von großer Bedeutung sein (z. B. das Service Locator-Muster, das verschachtelte statische Hilfsklassen in Diensten verwendet) und kann OP helfen zu verstehen, warum sie zusammen mit inneren Klassen existieren.

-1voto

DigitalRoss Punkte 138823

Der Unterschied besteht darin, dass eine verschachtelte Klassendeklaration, die auch statisch ist, außerhalb der umschließenden Klasse instanziiert werden kann.

Wenn Sie eine verschachtelte Klassendeklaration haben, die no statisch, auch bekannt als innere Klasse lässt Java die Instanziierung nicht zu, außer über die umschließende Klasse. Das aus der inneren Klasse erstellte Objekt ist mit dem aus der äußeren Klasse erstellten Objekt verknüpft, so dass die innere Klasse auf die Felder der äußeren Klasse verweisen kann.

Wenn es sich jedoch um eine statische Klasse handelt, existiert die Verknüpfung nicht, es kann nicht auf die äußeren Felder zugegriffen werden (außer über eine gewöhnliche Referenz wie bei jedem anderen Objekt) und Sie können daher die verschachtelte Klasse selbst instanziieren.

-2voto

Ashish Sharma Punkte 445

Ich habe verschiedene mögliche korrekte und fehlerhafte Szenarien illustriert, die in Java-Code auftreten können.

    class Outter1 {

        String OutStr;

        Outter1(String str) {
            OutStr = str;
        }

        public void NonStaticMethod(String st)  {

            String temp1 = "ashish";
            final String  tempFinal1 = "ashish"; 

            //  below static attribute not permitted
            // static String tempStatic1 = "static";    

            //  below static with final attribute not permitted         
            // static final String  tempStatic1 = "ashish";  

            // synchronized keyword is not permitted below          
            class localInnerNonStatic1 {            

                synchronized    public void innerMethod(String str11) {
                    str11 = temp1 +" sharma";
                    System.out.println("innerMethod ===> "+str11);
                }

                /* 
        //  static method with final not permitted
          public static void innerStaticMethod(String str11) { 

                    str11 = temp1 +" india";
                    System.out.println("innerMethod ===> "+str11);
                }*/
            }

            // static class not permitted below
            //  static class localInnerStatic1 {   }                            

        }

        public static  void StaticMethod(String st)     {

            String temp1 = "ashish";
            final String  tempFinal1 = "ashish"; 

            // static attribute not permitted below
            //static String tempStatic1 = "static";     

            //  static with final attribute not permitted below
            // static final String  tempStatic1 = "ashish";                         

            class localInnerNonStatic1 {
                public void innerMethod(String str11) {
                    str11 = temp1 +" sharma";
                    System.out.println("innerMethod ===> "+str11);
                }

                /*
    // static method with final not permitted
    public static void innerStaticMethod(String str11) {  
                    str11 = temp1 +" india";
                    System.out.println("innerMethod ===> "+str11);
                }*/
            }

            // static class not permitted below
            //  static class localInnerStatic1 {   }    

        }

        // synchronized keyword is not permitted
        static  class inner1 {          

            static String  temp1 = "ashish";
            String  tempNonStatic = "ashish";
            // class localInner1 {

            public void innerMethod(String str11) {
                str11 = temp1 +" sharma";
                str11 = str11+ tempNonStatic +" sharma";
                System.out.println("innerMethod ===> "+str11);
            }

            public static void innerStaticMethod(String str11) {
                //  error in below step
                str11 = temp1 +" india";    
                //str11 = str11+ tempNonStatic +" sharma";
                System.out.println("innerMethod ===> "+str11);
            }
            //}
        }

        //synchronized keyword is not permitted below
        class innerNonStatic1 {             

//This is important we have to keep final with static modifier in non
// static innerclass below
            static final String  temp1 = "ashish";  
            String  tempNonStatic = "ashish";
            // class localInner1 {

            synchronized    public void innerMethod(String str11) {
                tempNonStatic = tempNonStatic +" ...";
                str11 = temp1 +" sharma";
                str11 = str11+ tempNonStatic +" sharma";
                System.out.println("innerMethod ===> "+str11);
            }

            /*
            //  error in below step
            public static void innerStaticMethod(String str11) {   
                            //  error in below step
                            // str11 = tempNonStatic +" india";                     
                            str11 = temp1 +" india";
                            System.out.println("innerMethod ===> "+str11);
                        }*/
                    //}
                }
    }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X