我正在学习Java,并尝试了解private
,protected
和public
修饰符如何影响绑定。
我写了这段代码:
public class A {
public void a() {
System.out.println("a in A.");
b();
}
private void b() {
System.out.println("b in A.");
}
public static void main(String[] args) {
B obj = new B();
obj.a();
}
}
class B extends A {
public void b() {
System.out.println("b in B.");
}
}
输出结果为:
a in A.
b in A.
仍然,B
拥有自己的b
方法,obj
是B
的实例。为什么输出不是以下?
a in A.
b in B.
但是,如果我将b
中的A
方法更改为以下内容:
public void b() {
System.out.println("b in A.");
}
输出变为预期:
a in A.
b in B.
那么,为什么b
在private
中使用A
关键字声明时,它的行为与虚函数不同?
答案 0 :(得分:1)
因为私有方法(和字段)在类之外是不可见的,包括子类。因此私有方法不是外部接口的一部分,不能被覆盖。
B类声明一个具有相同签名的同名方法并不重要。私有方法对B完全不可见,因此它可能具有不同的名称。这两种方法完全没有关系。
当您创建方法public
(或protected
)时,它将成为类API的一部分,并且可以被覆盖。
这是一个很好的做法(并且IDE会自动为您执行此操作)来注释您认为使用@Override
覆盖某些内容的所有方法。然后编译器会告诉你它是否没有(你会在这个例子中得到编译错误),所以这有助于捕捉拼写错误,不匹配的签名和东西。
答案 1 :(得分:1)
这是因为根据JLS,
私有类成员或构造函数只能在包含成员或构造函数声明的顶级类(第7.6节)的主体内访问。它不是由子类继承的。
所以上面回答你的问题。 但如果案件是针对受保护或公开的,那么这是有效的:
class Ex{
protected void a()
{
}
}
class Child extends Ex{
@Override
public void a()
{
}
}
`