Java 为什么子类overriding只能比超级类具有较弱的访问权限

Java 为什么子类overriding只能比超级类具有较弱的访问权限,java,oop,overriding,access-specifier,Java,Oop,Overriding,Access Specifier,当涉及过度使用时,只有一条规则与访问说明符相关 "The subclass overridden method cannot have weaker access than super class method" 为什么子类被限制具有更强的访问说明符? 它可能会带来什么样的倒退,我猜在设计层面上会发生一些事情 让我们考虑这个规则不存在,在那种情况下 1:访问权限较弱的父类(如public) 2:具有更强访问能力的儿童班,如私人班 所以,如果任何外部类尝试访问该方法,它仍然可以从子类访问,因为它

当涉及过度使用时,只有一条规则与访问说明符相关

"The subclass overridden method cannot have weaker access than super class method"
为什么子类被限制具有更强的访问说明符? 它可能会带来什么样的倒退,我猜在设计层面上会发生一些事情

让我们考虑这个规则不存在,在那种情况下 1:访问权限较弱的父类(如public) 2:具有更强访问能力的儿童班,如私人班

所以,如果任何外部类尝试访问该方法,它仍然可以从子类访问,因为它将在子类中继承,并可用于对象引用

请澄清

public class A 
{
    public void methOne(int a)
    {
        // something
    }
}

class B extends A
{
    private void methOne(int a)
    {
        // something else
    }
    }

class C
{
     public static void main(String args[])
     {
          new B().methOne(); 
          // in this special case after removing the specifier rule it will execute the method from parent class.
     }
}

您尝试执行的操作无效,因为通过扩展
A
B
的所有实例必须能够像
A
一样工作。例如:

A a = new A();
a.methOne(1);
与之相比:

A a = new B();
a.methOne(1);
在这两种情况下,代码都知道它有一个
A
,并且所有
A
都有一个名为
methOne
的方法。在第二种情况下,它被破坏了,因为您试图将方法设置为私有,但是
A
已经表示它有一个同名的方法可用


它的工作方式正好相反,因为你不会使合同无效。如果该方法在
A
中是私有的,在
B
中是公共的,那么您仍然可以像使用
A
一样使用
B
的实例,除非您知道您正在使用
B

,否则您无法访问该方法,因为通过扩展
A
所有
B
的实例都必须能够像
A
一样工作。例如:

A a = new A();
a.methOne(1);
与之相比:

A a = new B();
a.methOne(1);
在这两种情况下,代码都知道它有一个
A
,并且所有
A
都有一个名为
methOne
的方法。在第二种情况下,它被破坏了,因为您试图将方法设置为私有,但是
A
已经表示它有一个同名的方法可用


它的工作方式正好相反,因为你不会使合同无效。如果该方法在
A
中是私有的,在
B
中是公共的,那么您仍然可以使用
B
的实例,就像它是
A
一样,当您在子类中重新声明父类的方法时,您没有访问该方法的权限,除非您知道您正在使用a
B

当您在子类中重新声明父类的方法时,它是方法重写,简单地说,这意味着您希望子类的对象调用其方法,而不是具有相同名称和名称的父类方法签名。现在在子类中,如果您有一个更严格的访问说明符,比如说,在您的例子中,通过设置private,您可以有效地告诉JVM不要调用该方法,尽管它对子对象是可见的,这会导致混淆,就像您只将父类暴露给外部世界一样,那么在某些类中,如果您可以设置如果传递了这些子对象,那么JVM不应该允许调用这些方法

Q。因此,如果任何外部类尝试访问该方法,它仍然可以从子类访问,因为它将在子类中继承,并可用于对象引用


在上面的例子中,这会使方法私有,从而破坏封装的目的。通过声明一个私有的方法,实际上你是在试图告诉我,让我的父类对应的方法对外部世界不可见,这是不可能的,因为你的父类对你的子类可见。

当你在子类中重新声明父类的方法时,它是方法重写,简单地说就是方法重写您可能希望子类的对象调用其方法,而不是具有相同名称和签名的父类方法。现在在子类中,如果您有一个更严格的访问说明符,比如说,在您的例子中,通过设置private,您可以有效地告诉JVM不要调用该方法,尽管它对子对象是可见的,这会导致混淆,就像您只将父类暴露给外部世界一样,那么在某些类中,如果您可以设置如果传递了这些子对象,那么JVM不应该允许调用这些方法

Q。因此,如果任何外部类尝试访问该方法,它仍然可以从子类访问,因为它将在子类中继承,并可用于对象引用


在上面的例子中,这会使方法私有,从而破坏封装的目的。通过将一个方法声明为私有,您实际上是在试图告诉外界,使我的父类对应的方法对外部世界不可见,这是不可能的,因为您的父类方法对您的子类可见。

让我们假设原始编码者出于某种原因将字段设置为私有,现在你想让所有人都能访问它,你的标题和引文自相矛盾。@Smutje:我不明白你的意思,请详细解释:“为什么子类的访问权限比超级类的要弱”。Quote:“子类重写方法的访问能力不能弱于超类方法”假设原始编码者出于某种原因将字段设置为私有字段,现在您希望允许所有人访问它。您的标题和引号相互矛盾。@Smutje:我没有理解您的意思,请详细说明:“为什么子类的访问权限只能弱于超类”。引用:“子类重写的方法不能弱于超类方法“我知道它是无效的,我写了上面提到的法律不存在,thanx为你的回答,帮助一个洛蒂我知道它无效,我写了上面提到的法律不存在,thanx为你的回答,帮助很大