【问题标题】:Can private methods be hidden? [duplicate]可以隐藏私有方法吗? [复制]
【发布时间】:2020-10-26 20:59:32
【问题描述】:

我在网上阅读了几个关于是否可以覆盖私有方法的相互冲突的资料。 那么这个例子到底发生了什么?方法移动被隐藏了吗?

class Animal {
   private void move() {
      System.out.println("Animals can move");
   }
}

class Dog extends Animal {
   public void move() {
      System.out.println("Dogs can walk and run");
   }
}

public class TestDog {
   public static void main(String args[]) {
      Dog b = new Dog();   // Dog reference and Dog object
      b.move();   // runs the method in Dog class
   }
}

https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html 说它在技术上不是压倒一切的,所以这叫什么,会不会有任何意外的行为?

【问题讨论】:

  • Animal reference but Dog object 但它似乎是Dog 参考
  • @NitinBisht 错字,已修复,谢谢
  • @Ivar 不,我问的是隐藏而不是覆盖
  • @Goldname 那么隐藏是什么意思?是不是很隐蔽?您是否设法以某种方式将“动物可以移动”带到您的控制台?
  • @Ivar 在这个意义上隐藏stackoverflow.com/questions/10594052/…

标签: java inheritance access-modifiers


【解决方案1】:

你必须这样写你的测试..

public class TestDog {
   public static void main(String args[]) {
      Animal b = new Dog();   // Animal reference but Dog object
      b.move();   // runs the method in Dog class
   }
}

然后,你得到:

/TestDog.java:16: error: move() has private access in Animal
      b.move();   // runs the method in Dog class
       ^
1 error

您的测试用例只是在Dog 中调用move(),它不会被覆盖。

【讨论】:

    【解决方案2】:

    你所做的并不是压倒一切的。如果您想确认这一点,只需在 Dog 类中将 @Override 放在 public void move() 之前,您将看到编译错误。

    注意:private 方法始终隐藏在类中。没有办法让它在课堂之外访问。

    【讨论】:

    • 对,我问的是隐藏而不是覆盖
    • 在 Animal 中将 move() 的访问权限更改为 public 之前,这将无济于事
    • @AlexRudenko - 我没听懂你。
    • @ArvindKumarAvinash 我的评论与您的​​初始版本有关。
    • @AlexRudenko - 更新没有改变任何意义。我只是添加了and you will see compilation error. 以使其更清楚,但含义保持不变。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-20
    • 2014-04-17
    • 1970-01-01
    • 2011-07-02
    • 1970-01-01
    相关资源
    最近更新 更多