【问题标题】:“public” or “protected” methods does not make any difference for a private nested class which does not implement any interface ..?“公共”或“受保护”方法对于不实现任何接口的私有嵌套类没有任何区别..?
【发布时间】:2012-05-19 17:48:27
【问题描述】:

“公共”或“受保护”方法对于不实现任何接口的私有嵌套类没有任何区别..?

如果私有嵌套类没有实现任何接口或从任何类继承,对于其方法的修饰符,“public”或“protected”或没有修饰符似乎没有任何区别。如果编译器只允许它们“私有”,那将更有意义。所以 为什么java允许他们?

class Enclosing {

    private class Inner {
        private void f1() {}
        void f2() {}
        protected void f3() {}
        public void f4() {}
    }

    void test() {
        Inner o= new Inner();
        o.f1();
        o.f2();
        o.f3();
        o.f4();
    }
}

【问题讨论】:

    标签: java inner-classes modifier


    【解决方案1】:

    这是我刚刚尝试过的:

    public class Test {
    
        public void method(){
    
            Innerclass ic = new Innerclass();
            InnerClass2 ic2 = new InnerClass2();
            System.out.println(ic.i);
            System.out.println(ic.j);
            System.out.println(ic.k);
            System.out.println(ic.l);
    
            System.out.println(ic2.i);  // Compile Error
            System.out.println(ic2.j);
            System.out.println(ic2.k);
            System.out.println(ic2.l);
        }
    
        private class Innerclass{
    
            private int i;
            public int j;
            protected int k;
            int l;
    
        };
    
        private class InnerClass2 extends Innerclass{
    
        }
    
    }
    

    如上所述,这有一个错误。

    1. 即使内部类是私有的,内部类的所有成员都可以被封闭/外部类访问,而不管它们的可见性/访问修饰符如何。
    2. 但是,如果一个内部类正在扩展另一个内部类,访问修饰符确实很重要。
    3. 这些是一般继承规则,适用于任何通过继承相关的类。
    4. 因此 java 允许私有内部类中的所有访问修饰符。

    【讨论】:

    • 我的问题是 public/protected/none 方法对不继承的内部类没有影响......
    • 这与您给出的示例没有任何区别。检查我的答案中的示例,它确实有所作为。您的问题是 为什么 java 允许它们?
    • 我不是在谈论私有方法。我关心公共/受保护/包访问修饰符。如果您删除您的私人会员。你能看出 public/protect/package 访问修饰符之间有什么区别吗?
    • 所以你是说如果某些事情根本没有任何后果,那么编译器应该将其标记为错误?我认为警告会更好:)类似于 variable never read local 类型的东西。
    【解决方案2】:

    private 表示只能通过类范围访问。突然间这条规则不适用于嵌套类,这不合逻辑。

    除了private,我没有定义任何其他类型的嵌套类。以及我希望从父类访问的他们的成员,我将它们设置为public

    【讨论】:

    • NO.Public/private 没有区别。嵌套类的私有方法可以被其封闭类和其他嵌套类访问。
    猜你喜欢
    • 2017-12-19
    • 2012-04-10
    • 2010-09-30
    • 1970-01-01
    • 2011-05-20
    • 2023-04-08
    相关资源
    最近更新 更多