当前位置: 首页 > 面试题库 >

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

訾晋
2023-03-14
问题内容

我收到此编译器错误:

您不能降低继承方法的可见性。

我有以下代码

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()公开的方法,并由TestClass私有的子类覆盖。现在,编译器抛出了我无法降低可见度的错误。从技术上讲,每当我创建一个TestClass分配给类型父对象的对象时,由于该func()方法被覆盖,因此将始终调用TestClass的func(),那么为什么还要注意可见性呢?这个错误背后的原因是什么?有人可以清楚地解释我吗?


问题答案:

这是因为子类有知名度privatevoid func()方法,但是超有知名度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子类中方法的可见性? 我需要创建几乎与class相同的类,除了不能做某些可以做的事情。 作为一个懒惰的程序员,我试图继承,只是为了迎接无法降低方法可视性的错误。h!.. 现在是供应商提供的API,我的意图是封装此API,以便更易于使用。 我想知道解决此问题的最佳实践是什么? 问题答案: 两种选择: 如果您需要与保持相同的接口(以便客户端代码可以使用这

  • 问题内容: 我有一个类结构,我希望可以从直接从基类派生的类访问基类中的某些方法,但不能从派生类派生的类访问这些方法。根据Java语言规范,可以在继承的方法上覆盖访问规范,以使它们更公开,但不更私有。例如,这是我需要做的要旨,但是是非法的: 有什么办法可以做到这一点? 编辑以解释我为什么要这样做: 在这种情况下,类结构是数据处理和导入结构。它读入并解析充满表格数据的文本文件,然后将它们存储在数据库中

  • 我想知道如何获取一个方法的返回值,并在直接跟随它的另一个方法中使用它。例如,假设我这样做了: 在这里,我想使用乘法方法中的4作为一个值,然后使用加法方法将我给它的任何值加到乘法结果4上。 注意:我知道我可以做到: 但是我想知道如何使用这种格式。 我想完成的是: 当我运行它时,输出将是 9,因为 2 * 2 = 4 5 = 9。请向我解释一下:)

  • 本文向大家介绍C#继承方法,包括了C#继承方法的使用技巧和注意事项,需要的朋友参考一下 示例 有几种方法可以继承            

  • 嘿,我正在尝试调用子类方法(ChildClass扩展了超类()) 它没有看到ChildClass方法,我只能调用SuperClass()中的方法,我知道这可能是一个愚蠢的问题,但无论如何干杯

  • 问题内容: 当您在子类中重写某个方法时降低了其可见性时,为什么编译器会给出错误消息? 问题答案: 因为子类的每个实例仍然需要是基类的有效实例(请参见Liskov替换原理)。 如果子类突然失去了基类的一个属性(例如,一个公共方法),那么它将不再是基类的有效替代品。