方法重写的来源:
子类用”extends“关键字继承父类的所有成员(包括private修饰的成员,即使不能访问),其中被继承的方法可被修改并覆盖原有方法,这就叫做方法的重写(重定义),方法重写只出现在具有继承关系的子类中。
方法重写格式:
- 子类中重写方法的方法名、参数(参数个数和参数类型)必须与原方法相同
- 子类中重写方法的返回类型必须与原方法的返回类型相同或是其子类
- 子类中重写方法的访问权限必须与原方法的访问权限相同或更宽。
注:格式2是jdk1.5及其后版本添加的,低版本不能修改返回类型
例子
定义父类
package test;
public class BaseClass {
protected BaseClass print() {
System.out.println("我是父类");
BaseClass baseClass = new BaseClass();
return baseClass;
}
}
父类中print方法的访问权限为protected,返回类型为BaseClass,方法名为print,没有参数
定义子类
package test;
public class DerivedClass extends BaseClass {
@Override
public DerivedClass print() {
System.out.println("我是子类");
DerivedClass derivedClass = new DerivedClass();
return derivedClass;
}
}
子类中print方法的访问权限为public,返回类型为DerivedClass ,方法名为print,同样没有参数
定义包含main()方法的类
package test;
public class Main {
public static void main(String[] args) {
BaseClass baseClass = new DerivedClass();
baseClass.print();
}
}
语句” BaseClass baseClass = new DerivedClass();“定义了一个指向子类对象的父类引用(多态),方法的输出如下:
可以看到,输出结果为”我是子类“,即语句”baseClass.print();“调用了子类中的print()方法,该方法是对DerivedClass 中print方法的重写。
注:DerivedClass 中print方法继承自父类BaseClass 的print方法。
注意比较例子中的print方法是否符合方法重写格式,以加深理解。
注意区分方法重写和方法重载:
方法重载格式:
- 方法名相同
- 方法参数不同,参数不同包括参数个数或参数类型不同
- 返回类型可以相同也可以不相同,即重载与返回类型无关
方法重写出现在继承关系中。
方法重载一般出现在同一个类中,也可以出现在继承关系中
参考:
AbsoluteJava5ed2012, p439, " Overriding a Method Definition "