2016-08-04 22 views
0

Betrachten Sie das folgende Snippet:Warum verwenden Sie Zugriffs-Spezifizierer beim Definieren von inneren (nicht-statischen geschachtelten) Klassen in Java?

class Deep { 

    static class StaticInner { 

    } 

    class InnerClass { 

    } 

    public class InnerClass2 { 

    } 

    private class InnerClass3 { 

    } 

    protected class InnerClass4 { 

    } 
} 

public class Test { 

    public static void main(String args[]) { 
     Deep.StaticInner sc = new Deep.StaticInner(); // valid 
     Deep.InnerClass ic = new Deep.InnerClass(); // invalid 
     Deep.InnerClass2 ic2 = new Deep.InnerClass2(); // invlaid 
     Deep.InnerClass3 ic3 = new Deep.InnerClass3(); // invalid 
     Deep.InnerClass4 ic4 = new Deep.InnerClass4(); // invalid 
    } 
} 

Mit Ausnahme der statischen Klasse in Tief namens StaticInner, alle anderen verschachtelten Klassen erfordern die umgebenden Klasse Deep, zugegriffen werden kann. Mit anderen Worten, sie können nicht außerhalb von Deep zugegriffen werden (das ist mein Verständnis). Ich habe Programmierer gesehen, die Spezifizierer vor verschachtelten inneren Klassen spezifizieren. Was ist der Punkt? Wenn (nicht statische) innere Klassen überhaupt nicht außerhalb der einschließenden Klasse zugänglich sind, warum werden Spezifizierer (public, private, & protected) angegeben? Warum unterstützt Java sogar Zugriffsspezifizierer für innere Klassen?

+0

Es geht darum, den Zugriff und die Belichtung zu beschränken. Zum Beispiel ist 'private class InnerClass3' nicht zugänglich, selbst wenn Sie eine Deep-Instanz erstellen. – c0der

+0

'Deep.InnerClass ic = neu Deep.InnerClass(); // ungültig, weil 'InnerClass' nicht statisch ist – emotionlessbananas

Antwort

2

Sie können öffentliche, nicht statische innere Klasse wie folgt instanziiert:

public class HelloWorld{ 

    public class HellowWorld2{ 
     public HellowWorld2(){ 
      System.out.println("Hellow World2"); 
     } 
    } 

    public static void main(String []args){ 
     System.out.println("Hello World"); 
     new HelloWorld().new HellowWorld2(); //The instantiation 
    } 
} 

Wenn hellowworld2 privat war Sie es nicht getan haben könnte. Es ist also nicht völlig sinnlos, Sie könnten ein Szenario haben, in dem Sie außerhalb der äußeren Klasse instanziieren möchten und sich nicht um die äußere Klassenreferenz kümmern.

1
public class Deep { 
    static class StaticInner { 

    } 

    class InnerClass { 

    } 

    public class InnerClass2 { 

    } 

    private class InnerClass3 { 

    } 

    protected class InnerClass4 { 
     Deep.InnerClass3 object = new Deep().new InnerClass3(); // valid 
    } 
} 

`` `` `` `

public class Test { 
     public static void main(String args[]) { 
      Deep deep = new Deep(); 
      Deep.StaticInner sc = new Deep.StaticInner(); // valid 
      Deep.InnerClass ic = deep.new InnerClass(); // valid when in same package 
      Deep.InnerClass2 ic2 = deep.new InnerClass2(); // vlaid 
      // Deep.InnerClass3 ic3 = new Deep.InnerClass3(); // invalid because InnerClass3 is private 

      Deep.InnerClass4 ic4 = deep.new InnerClass4(); // valid 
     } 
    } 

Sie werden immer ungültig, weil Sie es nicht zugreifen, richtig

bitte rechts Signatur verwenden, um innere Klassen zugreifen

EDIT Wenn Sie wirklich private Inner Class verwenden möchten, können Sie es über Reflectio tun n aber es ist nicht empfehlenswert.