【问题标题】:Overriding private method覆盖私有方法
【发布时间】:2014-05-28 00:02:46
【问题描述】:
我们不能覆盖私有方法,那么为什么下面的代码没有给出错误。相反,它会产生输出。
class A {
private void fun() {
System.out.println("ths is a private method");
}
}
class B extends A {
void fun() {
System.out.println("ths is wrng");
}
}
class C {
public static void main(String args[]) {
B ob = new B();
ob.fun();
}
}
【问题讨论】:
标签:
java
private
overriding
【解决方案1】:
private 方法不会被继承。在您的main 方法中,您正在对B 类型的变量调用fun() 方法。 B 类型的 fun() 方法似乎是可访问的,假设您的类 B 和类 C 在同一个包中。
你这样做了吗
A ob = new B();
ob.fun();
那么你会得到你的编译错误。
B#fun() 与A#fun() 完全无关。
【解决方案2】:
两者是完全不同的方法,彼此无关。由于私有方法不是继承的,因此这里没有覆盖的概念。
【解决方案3】:
方法fun() 没有在B 类中被覆盖,因为它从未从类A 继承。
您在代码中调用的是B 类的方法,与A 类和A#fun() 方法无关。
要检查这一点,请添加 @Override 注释,您将收到编译时错误。
// Compilation error.
Class B extends A{
@Override
void fun(){
System.out.println("ths is wrng");
}
}
现在这段代码将无法编译。
【解决方案4】:
首先,私有方法不会在子类中继承。如果你仍然尝试编写一个与父类同名的方法,java编译器会将子类中的方法视为一个全新的方法,不会抛出任何异常。就像子类中的新方法遮蔽了父类中的私有方法一样。