java - 无法降低从父级继承的方法的可见性

标签 java

<分区>

我遇到了这个编译器错误:

You cannot reduce the visibility of a inherited method.

我有以下代码

class Parent {      
    public void func() {
        System.out.println("in Parent");
    }
}

public class TestClass extends Parent {    
    public static void main(String args[]) {
        parent obj=new TestClass();
        obj.addTest();
    } 

    private void func() {
        System.out.println("in child");         
    }
}

这里父类有 func() 方法,它是公共(public)的,被私有(private)的子类 TestClass 覆盖。现在编译器抛出我无法降低可见性的错误。从技术上讲,每当我创建一个 TestClass 的对象并分配给类型父对象时,由于 func() 方法被覆盖,TestClass 的 func() 将被调用总是,那为什么我们要注意能见度呢?这个错误背后的原因是什么?有人能给我解释清楚吗?

最佳答案

这是因为子类对void func()方法有private的可见性,而父类(super class)有public的可见性。

如果您的代码被允许编译,那么如果您这样做,它会在运行时爆炸:

parent p = new TestClass();
p.func(); // boom - func is public in parent, but TestClass's impl is private, so no access would be allowed

要“修复”这个问题,请将子类的func 方法设为public:

public class TestClass extends parent {
    ...
    public void func() { // give it public visibility
        System.out.println("in child");         
    }
}


请使用标准的命名约定;在这种情况下,“类应该以大写字母开头” - 即 Parent 而不是 parent

关于java - 无法降低从父级继承的方法的可见性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9035052/

相关文章:

java - JSF2 Richfaces 4.1.0 Ajax 局部渲染树

java - 无法调整 GridBagLayout 中 JTextField 和 JScrollPane 的大小

java - return 语句的极其奇怪的行为 : Java

Java,BorderLayout.CENTER,获取JPanel的宽高

java - 警报对话框立即消失

java - Spring data mongodb - 需要 'cursor' 选项

java - 用Java为adb编写包装程序

java - 与java应用程序的接口(interface)DLL,如何?

java - 如何减少 Gecko 驱动程序日志的详细程度?

java - 仅接受用户对 ArrayList 的唯一输入