内部类可以访问基类中的私有final方法,但为什么呢?

时间:2014-07-10 13:24:29

标签: java private inner-classes final override

为什么java的创建者允许这种情况?我确信必须有一些理由。我的下面的代码允许 Lion Cheetah 那样顽皮地运行。

public class animal {
    class carnivores {
       private final void runAsFastAsCheetah() {
           System.out.println("Ran as fast as Cheetah");
        }
    }
    public class Lion extends carnivores {
       public void runAsFastAsLion() {
           System.out.println("Ran as fast as Lion.");
           super.runAsFastAsCheetah();
        }
    }
    public static void main(String[] args) {
        animal animal = new animal();
        Lion lion = animal.new Lion();
        //lion.runAsFastAsCheetah(); //Not allowed but//
        lion.runAsFastAsLion();
    }
}
编辑:对于那些认真对待狮子和猎豹的人,我修改了代码。

public class foo {
    class A {
        private final void myMethod() {
            System.out.println("in private final myMethod()");
        }
    }
    public class B extends A {
        public void myMethod() {
            System.out.println("in B's myMethod()");
            super.myMethod();
        }
    }
    public static void main(String[] args) {
        foo foo = new foo();
        B b = foo.new B();
        b.myMethod();
    }
}

2 个答案:

答案 0 :(得分:2)

具有相同外部类的所有类都可以访问同一外部的任何其他类的private个成员。添加嵌套类时添加了此功能。恕我直言,这是因为这些成员被编译在一起,它使嵌套类更有用。

注意:JVM不支持此功能,因此编译器会添加访问器方法,这些方法显示为access$100之类的堆栈跟踪。这些是由编译器添加的,以允许访问类之间的私有成员。


访问修饰符仅检查一个级别。如果A可以访问B和B并访问C,那么A可以访问任何B允许它访问的可能是C。

这样做的原因是避免使私人无意义。如果private成员只能由可以访问它的类访问,则意味着它只能由同一类中的main调用。这将使其在任何其他类中无用。

答案 1 :(得分:1)

来自Java Language Specification

  

引用类型的成员(类,接口,字段或方法),或   类型的构造函数,仅在类型为时才可访问   可访问且声明成员或构造函数允许访问:

     
      
  • ...
  •   
  • 否则,将成员或构造函数声明为private,并且当且仅当它发生在主体内时才允许访问   顶级类(第7.6节),包含成员或的声明   构造
  •   

换句话说,在顶级课程中,privateprotected不再适用。

至于为什么,如果您认为该类中的所有内容都可以被该类访问,那么它也包括任何内部类中的所有内容!