java - 为什么Java不限制子类的可见性大于父类

标签 java polymorphism package public overriding

为什么在Java中可以创建一个可见性低于父类的子类。

package 1
public class Class1 {

    public Class1 hello(){
        Class1 c= new Class2();
        return c;
    }   
}


class Class2 extends Class1 {

     public Class1 hello() {
        System.out.println("In overriden method");
            return null;
    }    
}

假设Class1和Class2都在同一个包中,Class2的可见性是包私有(private)的。

package 2
public class Major {
    public static  void main(String[] args) {
        Class1 ob = new Class1();
        ob.hello().hello();
    }
}

您会注意到,由于运行时多态性,将打印“In overriden method”。

在运行时,当 Class2 位于具有包私有(private)可见性的不同包中时,如何从 main() 访问 Class2hello() 方法?

Class2 不应被访问,因此 Class2 中的 hello() 方法也不应被访问。

最佳答案

protected 关键字(某种程度上类似于 package private)是一种保护代码不被外部使用的方法,这正是您的示例中发生的情况。您没有直接使用 Class2,而是使用 Class1,这授予您间接使用 protected Class2 的权利。

这是一个责任原则。 public Class1 负责授予外部包使用protected Class2 的权限。但这种责任也意味着 Class1 的开发人员必须知道为什么以及如何他授予您该权利。

扩展Class1这一事实在您的示例中没有任何实际意义,您的困惑可能来自于此。您无法从包外部实例化 Class2,但 Class1 可以。

关于java - 为什么Java不限制子类的可见性大于父类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34232738/

相关文章:

Java 为什么我不能在函数式接口(interface)中使用多重继承

python - 如何在 Python 中加载子目录下的所有模块?

java - 如何维护一组经常变化的共享库的应用程序?

java - 向上转型;为什么我得到输出 11

java - 让 IntelliJ 解析同一项目中模块的依赖关系

c++ - 函数不参与继承中的重载决策

android - 更改包名称的简单方法

r - 使用 multiarch 在开发过程中快速安装包

java - 如何访问user.home目录中的属性文件?

java - 是否可以通过配置覆盖 persistence.xml 属性?