【问题标题】:inner class have access to private final methods in base class but why?内部类可以访问基类中的私有最终方法,但为什么呢?
【发布时间】:2014-08-31 21:35:18
【问题描述】:

为什么java的创造者允许这种情况?我相信这一定是有原因的。我下面的代码可以让 LionCheetah 一样调皮地跑。

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();
    }
}

【问题讨论】:

  • 嗯..你觉得怎么样? private 这个词是什么意思? :)
  • 这里唯一的问题是为什么所有食肉动物都能像猎豹一样跑得快。
  • 看,这只是一个例子。赦免。但这是一个有效的问题。
  • 需要编辑。它的 private final 不是 static final
  • @chrylis 已经完成了。

标签: java private inner-classes final overriding


【解决方案1】:

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

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


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

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

【讨论】:

  • 如果carnivoresLion这两个类不是内部类,那么Lion将无法访问runAsFastAsCheetah()
  • @JamieCockburn 完全正确。他们只允许在内部阶级的情况下,我试图问,为什么。
  • @JamieCockburn 不要将内部类和嵌套类混为一谈。
  • @chrylis 我如何将这两个想法混为一谈?我没有在任何地方提到“嵌套类”这个词吗?
  • @SandeepPareek 我想念这个问题。同一个外部类的成员可以相互访问,因为它们被编译为单元。我想你的左手不需要保护你的右手。
【解决方案2】:

来自Java Language Specification

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

  • ...
  • 否则,成员或构造函数被声明为私有,并且当且仅当它发生在 包含成员声明的顶级类(第 7.6 节)或 构造函数。

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

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

【讨论】:

    猜你喜欢
    • 2012-03-20
    • 2019-05-12
    • 2013-07-29
    • 1970-01-01
    • 2021-06-29
    • 1970-01-01
    • 2016-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多