覆盖,简单来说就是在子类中把父类的某个实例方法复制过来(不能是static或者private的方法)以实现子类自己特有的方法。需要注意几点:
- 形参的类型、个数、顺序要与父类一致;
- 子类的访问控制符可见性大于等于父类访问控制符的可见性,如父类是默认访问控制符,则子类可以是public、protected。
- 子类不能比父类抛出更多的异常,如父类throws IOException ,则子类不能throws Exception。
- 返回值类型分几种情况:
-
-
- 父类返回值是void,子类也是void;
- 如果是基本数据类型或者包装类则要与父类完全相同,比如父类返回值类型是 int型,则子类也必须是 int型。父类返回值类型是 Integer,则子类也要是Integer;
- 如果是其他类型的话,子类的返回值类型可以是父类返回值类型的子类(包括本身),比如父类返回值类型是Object,子类返回值类型可以是Object或者String。
-
方法体可以重写,也可以继承父类方法体。需要继承就在子类的方法体内使用super。比如父类有一个方法为:
//父类方法 public void sayHello(String name) { System.out.println("Hello! " + name) }
子类需要继承父类方法的话可以这样写:
1 @Override //@override注解可以显式地指出这是一个覆盖方法,另外可以让编译器帮自己检查是否正确地覆盖了父类中的方法。当然也可以不用写。 2 public void sayHello(String name) { 3 //继承父类方法(也可以写在子类方法的下面) 4 super.sayHello(name); 5 //子类自己的方法 6 System.out.println(name + ", Hello!"); 7 }
因为Java中形参是没有默认值的,所以子类覆盖方法形参的个数需要与父类相同,在python中形参的个数是可以与父类中不同的,当然前提是其他形参都得有默认值??