【问题标题】:Re-writing a private method in Java makes no difference to code output. Why? [duplicate]在 Java 中重写私有方法对代码输出没有影响。为什么? [复制]
【发布时间】:2014-09-07 15:24:44
【问题描述】:

我在 Java 中测试了以下代码,以了解当我重写私有方法的实现时会发生什么。

/* package whatever; // don't place package name! */

import java.util.*;
import java.lang.*;
import java.io.*;

/* Name of the class has to be "Main" only if the class is public. */

class Superclass {

    public void runDo() {
        this.doSomething();
    }

    private void doSomething() {
        System.out.println("from Superclass");
    }
}

class Subclass extends Superclass {

    private void doSomething() {
        System.out.println("from Subclass");
    }

}

class Runner {

    public static void main(String[] args) {

        Superclass superSuper = new Superclass();
        Superclass superSub = new Subclass();
        Subclass subSub = new Subclass();

        superSuper.runDo();
        superSub.runDo();
        subSub.runDo();
    }
}

上述样本的输出是

来自超类

来自超类

来自超类

虽然我期待像

来自超类

来自子类

来自子类

有人可以解释一下这种行为以及为什么它有意义吗?

【问题讨论】:

    标签: java oop inheritance


    【解决方案1】:

    不能覆盖私有方法。对于您想要的行为,您必须将其声明为默认、受保护或公开。

    我建议阅读access modifiers 上的 Java 文档

    【讨论】:

      【解决方案2】:

      它不起作用,因为您无法覆盖 private 方法。

      您实际上并没有覆盖您的方法。在Superclass 中,您将doSomething() 渲染为private,因此它在子类中不可见(也不能覆盖)。

      尝试将访问修饰符设置为protectedpublicdefault

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-02-17
        • 2012-02-18
        • 1970-01-01
        • 1970-01-01
        • 2013-01-18
        • 2019-09-03
        • 1970-01-01
        相关资源
        最近更新 更多