在 java 中使用向上转换调用“覆盖”私有方法
“overriding” private methods with upcasting call in java
public class PrivateOverride {
private void f() {
System.out.println("PrivateOverride f()");
}
public static void main(String[] args) {
PrivateOverride po = new DerivedWithOutD();
po.d();// PrivateOverride f()
PrivateOverride poD = new DerivedWithD();
poD.d();//Derived f()
}
public void d() {
f();
}
}
class DerivedWithOutD extends PrivateOverride {
public void f() {
System.out.println("Derived f()");
}
}
class DerivedWithD extends PrivateOverride {
public void f() {
System.out.println("Derived f()");
}
public void d() {
f();
}
}
如上代码所示,DerivedWithOutD在不重写d()方法时,调用了属于PrivateOverride的f(),是因为PrivateOverride的f()方法无法重写吗?但是d() 继承自PrivateOverride 应该属于DerivedWithOutD,为什么d() 调用private f()?为什么 DerivedWithD class 似乎会覆盖,并且可以调用 public f()?另外,当我将 PrivateOverride 的 f() 更改为 public 时,它全部打印 Derived f(),这让我很困惑!
私有方法不能被子class重写。如果 sub-classes 声明的方法与父 class 中的私有方法具有相同的签名,则 sub-class 方法不会覆盖 super-class 方法。
调用方法d()
时,如果d()
没有被子class覆盖,执行的方法是PrivateOverride
的d()
.当该方法调用 f()
时,它会看到 PrivateOverride
中定义的私有 f()
方法。由于该方法未被覆盖(因为它不能被覆盖),它调用该方法而不是子 class.
的 f()
方法
如果d()
被覆盖,则执行子classDerivedWithD
的d()
方法。当该方法调用 f()
时,它会调用 DerivedWithD
的 f()
方法。
如果 f()
不再是私有的,子 classes 中的 f()
方法现在会覆盖 super-class 的 f()
方法],因此在这两种情况下都会执行子 class 的 f()
。
public class PrivateOverride {
private void f() {
System.out.println("PrivateOverride f()");
}
public static void main(String[] args) {
PrivateOverride po = new DerivedWithOutD();
po.d();// PrivateOverride f()
PrivateOverride poD = new DerivedWithD();
poD.d();//Derived f()
}
public void d() {
f();
}
}
class DerivedWithOutD extends PrivateOverride {
public void f() {
System.out.println("Derived f()");
}
}
class DerivedWithD extends PrivateOverride {
public void f() {
System.out.println("Derived f()");
}
public void d() {
f();
}
}
如上代码所示,DerivedWithOutD在不重写d()方法时,调用了属于PrivateOverride的f(),是因为PrivateOverride的f()方法无法重写吗?但是d() 继承自PrivateOverride 应该属于DerivedWithOutD,为什么d() 调用private f()?为什么 DerivedWithD class 似乎会覆盖,并且可以调用 public f()?另外,当我将 PrivateOverride 的 f() 更改为 public 时,它全部打印 Derived f(),这让我很困惑!
私有方法不能被子class重写。如果 sub-classes 声明的方法与父 class 中的私有方法具有相同的签名,则 sub-class 方法不会覆盖 super-class 方法。
调用方法d()
时,如果d()
没有被子class覆盖,执行的方法是PrivateOverride
的d()
.当该方法调用 f()
时,它会看到 PrivateOverride
中定义的私有 f()
方法。由于该方法未被覆盖(因为它不能被覆盖),它调用该方法而不是子 class.
f()
方法
如果d()
被覆盖,则执行子classDerivedWithD
的d()
方法。当该方法调用 f()
时,它会调用 DerivedWithD
的 f()
方法。
如果 f()
不再是私有的,子 classes 中的 f()
方法现在会覆盖 super-class 的 f()
方法],因此在这两种情况下都会执行子 class 的 f()
。