观察以下代码:
class Car extends Vehicle { public static void main (String[] args) { new Car(). run(); } private final void run() { System. out. println ("Car"); } } class Vehicle { private final void run() { System. out. println("Vehicle"); } }
class Car extends Vehicle { public static void main (String[] args) { new Car(). run(); } private final void run() { System. out. println ("Car"); } } class Vehicle { private final void run() { System. out. println("Vehicle"); } }
Car
Vehicle
Compiler error at line 3
Compiler error at line 5
Exception thrown at runtime
final不能被子类覆盖,但是基类的private方法,只有非private方法才能被覆盖。子类虽然继承了基类的所有内容,但是private和构造器等对子类是不可见的,不能直接访问,但是可以调用基类的非parivate方法从而访问基类的private方法,也会引起很多问题。 class Shape { private Shape wf; protected Shape() { wf = this; } private int length() { return 0; } private int width() { return 0; } public int getArea() { return wf.length()*wf.width(); } } public class OverridingShape extends Shape { public int length() { return 10; } //@Override 不是覆盖,基类该方法是private,子类不可见 public int width() { return 10; } public static void main(String[] args) { Shape s=new OverridingShape(); System.out.println(s.getArea()); //结果是0而不是100 调用的是父类的方法,然后访问的是父类的private方法 } }
首先明白final修饰的方法是不能被重写的,然后private修饰的父类方法子类虽然继承了,但是是无法访问的,所以这里访问的仍然是子类
的方法
首先final声明的方法是不能被覆盖的,但是这里并不错误,因为方法是private的,也就是子类没有继承父类的run方法,因此子类的run方法跟父类的run方法无关,并不是覆盖。new Car().run()也是调用子类的run方法。