重写
在子类中创建与父类中名称、参数列表一致,返回类型一致或为父类方法返回类型的子类的方法,叫做方法重写(override),也叫覆盖
则在子类调用该方法时仅执行子类的方法
public class Main{
public static void main(String[] args) {
B b = new B();
b.method(10)
}
}
class A {
public void method(int num) {
System.out.println("A类的method方法被调用" + num);
}
}
class B extends A {
public void method(int a) {
System.out.println("B类的method方法被调用" + a);
}
}
输出
B类的method方法被调用10
如果不删去子类的method方法,但想要调用父类的method方法,应该怎么办?
可以使用super(),在子类写一个方法,将super.method写在里面
例如改动子类的method方法为:
class B extends A {
public void method(int a) {
super.method(a);
}
}
输出
A类的method方法被调用10
注意:子类重写方法不能缩小父类方法的访问权限。
public class A{
protected void method() {
}
}
clsaa B{
private void method() {
}
}
以上写法是错误的
父类中method方法的修饰符为protected,则子类B的method方法不能为private和default。
注意:子类方法的返回类型和父类方法返回类型一样,或者是父类返回类型的子类。
class A{
}
class B extends A{
public B method() {
return new B();
}
}
class C extends B{
public A method() {
return new B();
}
}
以上写法是错误的
B类的method方法返回类型是B类对象,C类重写的method方法返回类型是A类对象,B类是A类的子类。
重写 VS 重载
位置关系 | 方法名 | 返回类型 | 参数列表 | 修饰符 | |
---|---|---|---|---|---|
重写override | 父类方法与子类方法 | 相同 | 相同或子类型 | 相同 | 相同或子类型 |
重载overload | 同一类的两个方法 | 相同 | 相同或不同 | 不同 | 相同或不同 |