【问题标题】:Java allow to run private method? Can someone explain why? [duplicate]Java允许运行私有方法吗?有人可以解释为什么吗? [复制]
【发布时间】:2019-07-06 01:43:18
【问题描述】:

有人问我他是否可以运行私有基本功能。我告诉他,这当然是不可能的(除了重选技巧)。 但这是什么鬼:

public class MyClass {
    public static void main(String args[]) {

        A a = new B();
        a.doSomething();

        B b = new B();
        b.doSomethingMore();
    }

   static class A {
        private void doSomething(){
            System.out.println("something");
        }
    }

    static class B extends A{
        public void doSomethingMore(){
            ((A)this).doSomething();
        }
    }
}

【问题讨论】:

  • 代码到底有什么不清楚的地方?
  • 你的方法是 MyClass 类的私有方法。可以从MyClass中的任何代码调用。
  • 你的内部类 A 和 B 在同一个范围内。如果从 MyClass 中删除 B,可见性将被隐藏,并且您无法调用私有方法。
  • 如果这是重复的,我不会感到惊讶,但我不会称它为 this marked question 的重复(当然也不是 this PHP question!)。

标签: java


【解决方案1】:

AB 都是MyClass 的成员,因此他们可以访问MyClass 的所有私有功能,以及彼此的私有功能; MyClass 可以访问他们所有的私人功能。更多内容请关注Java nested classes tutorial

现在,如果他们不是嵌套类,那么MyClass 自然就无法访问他们的私有功能,他们也无法访问彼此的私有功能特征。例如,这不会编译:

public class MyClass {
    public static void main(String args[]) {
        A a = new B();
        a.doSomething();            // error: doSomething() has private access in A

        B b = new B();
        b.doSomethingMore();
    }
}

class A {
    private void doSomething(){
        System.out.println("something");
    }
}

class B extends A{
    public void doSomethingMore(){
        ((A)this).doSomething();    // error: doSomething() has private access in A
    }
}

【讨论】:

  • 我可以理解 MyClass 可以访问他的孩子,但是 B 可以访问 A 的 doSomething 完全没有意义。谢谢你的回答。
  • @Zixav - 我明白你为什么会这么想。 :-) 但是嵌套类的重点,它们背后的设计理念,是它们真的是它们所在的类的一部分。所以所有是私有的东西在他们之间共享。 (但坦率地说,我可以看到设计决策是两种方式。这就是 24 多年前的方式...... :-))
猜你喜欢
  • 2019-10-28
  • 1970-01-01
  • 2011-04-05
  • 2022-01-22
  • 2019-12-06
  • 2017-10-03
  • 1970-01-01
  • 2019-02-24
  • 1970-01-01
相关资源
最近更新 更多