【问题标题】:Why can we not override private members of a super class in a sub class?为什么我们不能在子类中覆盖超类的私有成员?
【发布时间】:2020-10-30 07:13:21
【问题描述】:

子类不是继承了父类的所有成员,为什么不能覆盖父类的私有成员变量呢?假设子类有自己的私有成员版本并且能够在 Java 中覆盖它会不会很安全?

【问题讨论】:

  • 如果变量是私有的,这意味着它们只在定义它们的类中可见
  • @Josep 但子类不会继承它们仍然拥有它们作为它自己的成员吗?
  • 子类不继承私有成员。
  • 如果您希望父类的属性可以在子类中访问,您可以在这些属性之前使用 protected 关键字
  • “私人”的意思是“不是别人的事”。就其他人而言,私人成员不存在,班级可以随时更改组织。

标签: java


【解决方案1】:

假设子类有自己的私有成员版本并且能够在 Java 中覆盖,这不安全吗?

没有

想想写一个库,而不仅仅是为你当前的项目编写代码。

可以继承您的类以添加更多功能,但您的库的用户不应更改您的行为。

一个简单的例子是AtomicInteger Java 类,它有private volatile int value; 字段。 现在,如果您可以仅在继承该类的情况下访问该成员,则意味着您可以更改失去所有 AtomicInteger 线程安全的值。

我敢肯定,如果你查看java.util 包你会发现很多类似的案例, 其中某些字段是并且必须在内部管理并且只能从方法访问

【讨论】:

    【解决方案2】:

    您从其他信息中得到了一些提示,但这里有一个示例。想象两个类,Foo 和 Bar。 Bar 继承自 Foo。下面是每个的简单实现:

    public class Foo {
        private void myPrivateMethod() { System.out.printf("myPrivateMethod()\n"); }
        public void myPublicMethod() { System.out.printf("myPublicMethod()\n"); }
    }
    
    public class Bar extends Foo {
        public void barPublicMethod() {
            System.out.printf("This is barPublicMethod()!\n");
    
            myPublicMethod();
            myPrivateMethod();
        }
    
        public static void main(String[] args) {
            System.out.printf("This is main!\n");
    
            Bar bar = new Bar();
            bar.barPublicMethod();
        }
    }
    

    如果你尝试编译这段代码,你会得到这个错误:

    $ javac Foo.java Bar.java && java Bar
    Bar.java:6: error: cannot find symbol
            myPrivateMethod();
            ^
      symbol:   method myPrivateMethod()
      location: class Bar
    1 error
    

    如果您删除对 myPrivateMethod() 的调用,它会起作用。这就是私有方法的本质。

    Bar 对 Foo 的私有方法一无所知。没有。这意味着您不能覆盖它们,因为 Bar 甚至不知道它们存在。这就是私有的意思。

    Bar 不能用 Foo 的私有方法做一件事。没有。如果希望 Bar 能够覆盖它们,则需要将 Foo 中的定义更改为 protected 或 public。

    【讨论】:

      【解决方案3】:

      子类不继承 java 中的私有成员。子类对父类一无所知

      【讨论】:

        猜你喜欢
        • 2012-02-21
        • 2011-07-09
        • 2013-03-10
        • 2015-12-11
        • 2019-05-12
        • 2013-07-07
        • 1970-01-01
        • 2015-03-20
        • 1970-01-01
        相关资源
        最近更新 更多