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
一样,当您在子类中重新声明父类的方法时,您没有访问该方法的权限,除非您知道您正在使用aB
当您在子类中重新声明父类的方法时,它是方法重写,简单地说,这意味着您希望子类的对象调用其方法,而不是具有相同名称和名称的父类方法签名。现在在子类中,如果您有一个更严格的访问说明符,比如说,在您的例子中,通过设置private,您可以有效地告诉JVM不要调用该方法,尽管它对子对象是可见的,这会导致混淆,就像您只将父类暴露给外部世界一样,那么在某些类中,如果您可以设置如果传递了这些子对象,那么JVM不应该允许调用这些方法
Q。因此,如果任何外部类尝试访问该方法,它仍然可以从子类访问,因为它将在子类中继承,并可用于对象引用
在上面的例子中,这会使方法私有,从而破坏封装的目的。通过声明一个私有的方法,实际上你是在试图告诉我,让我的父类对应的方法对外部世界不可见,这是不可能的,因为你的父类对你的子类可见。当你在子类中重新声明父类的方法时,它是方法重写,简单地说就是方法重写您可能希望子类的对象调用其方法,而不是具有相同名称和签名的父类方法。现在在子类中,如果您有一个更严格的访问说明符,比如说,在您的例子中,通过设置private,您可以有效地告诉JVM不要调用该方法,尽管它对子对象是可见的,这会导致混淆,就像您只将父类暴露给外部世界一样,那么在某些类中,如果您可以设置如果传递了这些子对象,那么JVM不应该允许调用这些方法
Q。因此,如果任何外部类尝试访问该方法,它仍然可以从子类访问,因为它将在子类中继承,并可用于对象引用
在上面的例子中,这会使方法私有,从而破坏封装的目的。通过将一个方法声明为私有,您实际上是在试图告诉外界,使我的父类对应的方法对外部世界不可见,这是不可能的,因为您的父类方法对您的子类可见。让我们假设原始编码者出于某种原因将字段设置为私有,现在你想让所有人都能访问它,你的标题和引文自相矛盾。@Smutje:我不明白你的意思,请详细解释:“为什么子类的访问权限比超级类的要弱”。Quote:“子类重写方法的访问能力不能弱于超类方法”假设原始编码者出于某种原因将字段设置为私有字段,现在您希望允许所有人访问它。您的标题和引号相互矛盾。@Smutje:我没有理解您的意思,请详细说明:“为什么子类的访问权限只能弱于超类”。引用:“子类重写的方法不能弱于超类方法“我知道它是无效的,我写了上面提到的法律不存在,thanx为你的回答,帮助一个洛蒂我知道它无效,我写了上面提到的法律不存在,thanx为你的回答,帮助很大