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.

8voto

VeKe Punkte 8993

Zielgruppe: Lernende, die noch keine Erfahrung mit Java und/oder verschachtelten Klassen haben

Verschachtelte Klassen können entweder sein:
1. Statische verschachtelte Klassen.
2. Nicht statische verschachtelte Klassen. (auch bekannt als Innere Klassen ) =>Bitte merken Sie sich das

1. innere Klassen
Beispiel:

class OuterClass  {
/*  some code here...*/
     class InnerClass  {  }
/*  some code here...*/
}

Innere Klassen sind Teilmengen von verschachtelten Klassen:

  • innere Klasse ist eine besondere Art von verschachtelter Klasse
  • innere Klassen sind Teilmengen von verschachtelten Klassen
  • Man kann sagen, dass ein innere Klasse ist ebenfalls eine verschachtelte Klasse, aber Sie können NICHT sagen, dass eine verschachtelte Klasse auch eine innere Klasse ist .

Spezialität der Inneren Klasse:

  • Instanz einer inneren Klasse hat Zugang zu allen der Mitglieder der äußeren Klasse, auch derjenigen, die als "privat" gekennzeichnet sind

2.Statische verschachtelte Klassen:
Beispiel:

class EnclosingClass {
  static class Nested {
    void someMethod() { System.out.println("hello SO"); }
  }
}

Fall 1: Instanziierung einer statischen verschachtelten Klasse aus einer nicht-einschließenden Klasse

class NonEnclosingClass {

  public static void main(String[] args) {
    /*instantiate the Nested class that is a static
      member of the EnclosingClass class:
    */

    EnclosingClass.Nested n = new EnclosingClass.Nested(); 
    n.someMethod();  //prints out "hello"
  }
}

Fall 2: Instanziierung einer statischen verschachtelten Klasse aus einer umschließenden Klasse

class EnclosingClass {

  static class Nested {
    void anotherMethod() { System.out.println("hi again"); } 
  }

  public static void main(String[] args) {
    //access enclosed class:

    Nested n = new Nested(); 
    n.anotherMethod();  //prints out "hi again"
  }

}

Spezialität der statischen Klassen:

  • Eine statische innere Klasse hätte nur Zugriff auf die statischen Mitglieder der äußeren Klasse und keinen Zugriff auf nicht-statische Mitglieder.

Schlussfolgerung:
Frage: Was ist der Hauptunterschied zwischen einer inneren Klasse und einer statischen verschachtelten Klasse in Java?
Antwort: gehen Sie einfach die Besonderheiten jeder der oben genannten Klassen durch.

8voto

Wouter Coekaerts Punkte 8775

Geschachtelte Klasse ist ein sehr allgemeiner Begriff: Jede Klasse, die nicht zur obersten Ebene gehört, ist eine geschachtelte Klasse. Eine innere Klasse ist eine nicht-statische verschachtelte Klasse. Joseph Darcy schrieb eine sehr schöne Erklärung über Verschachtelte, innere, Mitglieds- und Top-Level-Klassen .

6voto

roottraveller Punkte 7134

Innere Klasse y verschachtelte statische Klasse in Java sind beides Klassen, die innerhalb einer anderen Klasse deklariert werden, in Java bekannt als Top-Level-Klasse. Wenn Sie in der Java-Terminologie eine verschachtelte Klasse als statisch deklarieren, wird sie in Java als verschachtelte statische Klasse bezeichnet, während nicht statische verschachtelte Klassen einfach als innere Klasse bezeichnet werden.

Was ist eine innere Klasse in Java?

Jede Klasse, die nicht auf oberster Ebene oder innerhalb einer anderen Klasse deklariert ist, ist als verschachtelte Klasse bekannt und von diesen verschachtelten Klassen sind Klassen, die als nicht statisch deklariert sind, als innere Klasse in Java bekannt. Es gibt drei Arten von inneren Klassen in Java:

1) Lokale innere Klasse - wird innerhalb eines Codeblocks oder einer Methode deklariert.
2) Anonyme innere Klasse - ist eine Klasse, die keinen Referenznamen hat und an der gleichen Stelle initialisiert wird, an der sie erstellt wird.
3) Mitglied innere Klasse - wird als nicht statisches Mitglied der äußeren Klasse deklariert.

public class InnerClassTest {
    public static void main(String args[]) {      
        //creating local inner class inside method i.e. main() 
        class Local {
            public void name() {
                System.out.println("Example of Local class in Java");

            }
        }      
        //creating instance of local inner class
        Local local = new Local();
        local.name(); //calling method from local inner class

        //Creating anonymous inner class in Java for implementing thread
        Thread anonymous = new Thread(){
            @Override
            public void run(){
                System.out.println("Anonymous class example in java");
            }
        };
        anonymous.start();

        //example of creating instance of inner class
        InnerClassTest test = new InnerClassTest();
        InnerClassTest.Inner inner = test.new Inner();
        inner.name(); //calling method of inner class
    }

     //Creating Inner class in Java
    private class Inner{
        public void name(){
            System.out.println("Inner class example in java");
        }
    }
}

Was ist eine verschachtelte statische Klasse in Java?

Eine verschachtelte statische Klasse ist eine andere Klasse, die innerhalb einer Klasse als Mitglied deklariert und statisch gemacht wird. Eine verschachtelte statische Klasse wird auch als Mitglied der äußeren Klasse deklariert und kann wie jedes andere Mitglied privat, öffentlich oder geschützt sein. Einer der Hauptvorteile der verschachtelten statischen Klasse gegenüber der inneren Klasse ist, dass die Instanz der verschachtelten statischen Klasse nicht mit einer umschließenden Instanz der äußeren Klasse verbunden ist. Sie benötigen auch keine Instanz der Klasse Outer, um eine Instanz einer verschachtelten statischen Klasse in Java zu erstellen .

1) Es kann auf statische Datenmitglieder der äußeren Klasse einschließlich privat.
2) Statische verschachtelte Klasse kann nicht auf nicht-statisches (Instanz-)Datenmitglied o Methode .

public class NestedStaticExample {
    public static void main(String args[]){  
        StaticNested nested = new StaticNested();
        nested.name();
    }  
    //static nested class in java
    private static class StaticNested{
        public void name(){
            System.out.println("static nested class example in java");
        }
    }
}

Ref: Innere Klasse und verschachtelte statische Klasse in Java mit Beispiel

5voto

yoAlex5 Punkte 20661

Ein Diagramm

enter image description here

Der Hauptunterschied zwischen static nested y non-static nested Klassen ist, dass static nested hat nicht einen Zugriff auf nicht-statische äußere Klassenmitglieder

4voto

hqt Punkte 28296

Ich denke, die Leute hier sollten beachten, dass Poster: Static Nest Class nur die erste innere Klasse. Zum Beispiel:

 public static class A {} //ERROR

 public class A {
     public class B {
         public static class C {} //ERROR
     }
 }

 public class A {
     public static class B {} //COMPILE !!!

 }

Zusammenfassend lässt sich also sagen, dass eine statische Klasse nicht davon abhängt, welche Klasse sie enthält. Also, sie können nicht in normalen Klasse. (weil normale Klassen eine Instanz benötigen).

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