我正在阅读“用Java思考”并且有疑问。在“重用类”一节的“最终和私有”一节中,它说私有方法不能被覆盖。但是,我在机器上试了一下。它实际上可以被覆盖。
这是代码
class Amphibian {
private void print() { System.out.println("in Amphibian"); }
}
public class Frog extends Amphibian {
public void print( System.out.println("in Frog"); }
public static void main(String[] args) {
Frog f = new Frog();
f.print();
}
}
答案 0 :(得分:12)
您没有覆盖它,您只是使用具有相同名称的新方法隐藏它。
如果您没有创建新的print()
方法,那么您的Frog
课程就没有。
答案 1 :(得分:4)
为了说明覆盖和隐藏之间的区别,请考虑以下事项:
class Amphibian {
private void print() { System.out.println("in Amphibian"); }
public void callPrint() {
/*
* This will DIRECTLY call Amphibian.print(), regardless of whether the
* current object is an instance of Amphibian or Frog, and whether the
* latter hides the method or not.
*/
print(); // this call is bound early
}
}
class Frog extends Amphibian {
public void print() { System.out.println("in Frog"); }
public static void main(String[] args) {
Frog f = new Frog();
f.callPrint(); // => in Amphibian
// this call is bound late
f.print(); // => in Frog
}
}
不会调用“覆盖”(即隐藏)方法,父类中的方法会调用。这意味着它不是真正的覆盖。
答案 2 :(得分:0)
您只需在private
中编写subclass
方法,但不会被覆盖。但它仍然遵循用于覆盖的访问修饰符规则
如果access modifier
方法是私有的,superclass
方法中的subclass's
(默认,受保护,公共)更宽,则编译器会显示错误。它遵循覆盖规则,但实际上不会覆盖。