簡體   English   中英

為什么在Java中定義內部(非靜態嵌套)類時使用訪問說明符?

[英]Why use access specifiers when defining inner (non-static nested) classes 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
    }
}

除了Deep內部的名為StaticInner的靜態類StaticInner ,所有其他嵌套類都需要訪問封閉的類Deep 換句話說,不能在Deep之外訪問它們(這是我的理解)。 我見過程序員在嵌套內部類之前指定說明符。 重點是什么? 如果在封閉類之外根本無法訪問(非靜態)內部類,為什么要指定說明符( publicprivateprotected )? 為什么Java甚至支持內部類的訪問說明符?

您可以像這樣實例化公共非靜態內部類:

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
     }
}

如果hellowworld2是私有的,則不可能做到這一點。 因此,這並不是完全沒有意義的,您可能會遇到一些需要在外部類外部實例化並且不關心外部類引用的情況。

 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
        }
    }

它們無效,因為您無法正確訪問它

請使用正確的簽名訪問內部類

編輯如果您真的想使用private Inner Class ,則可以通過反射來實現,但不建議這樣做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM