重载和重写体现了Java的多态。
重载(overload)就是在同一个类中,方法名称相同,参数列表中的参数类型或个数不相同。
重写(override)发生在父子两个类中,方法名,参数列表完全相同,子类重写了父类方法。
重载 | 重写 |
---|---|
发生在同一个类中。相同方法名,参数列表中参数的种类及数量不同。 | 有继承关系,发生在父子类中 |
属于静态绑定 | 属于动态绑定 |
发生在编译期 | 发生在运行期 |
适用于所有方法 | final、static、private修饰的不能重写 |
public class Test {
Parent p = new Child();
System.out.println(p.name);
p.echo();
// p.echoAgain(); compile error
p.say();
Parent pp = new Parent();
pp.say();
}
class Parent {
public String name = "parent";
public void echo() {
System.out.println("parent echo.");
}
public static void say() {
System.out.println("parent say");
}
}
class Child extends Parent {
public String name = "child";
public void echo() {
System.out.println("child echo.");
}
public void echoAgain() {
System.out.println("child again...");
}
public static void say() {
System.out.println("parent say");
}
}
output:
parent
child echo.
parent say
parent say
上述例子说明:
- 父类的引用指向子类,只能调用重写了父类的方法,如果子类中有父类中没有声明的方法,则默认是擦除的。
- 父类引用指向子类的实例,调用方法由子类实例决定,调用的成员属性由父类决定。因为动态绑定只对方法生效,属性属于静态绑定内容,也就是编译期间决定的。
- 如果父类中是private、static、final修饰的方法,则不会发生动态绑定,因为这些方法是不能被继承(重写)的,这些方法的绑定是发生在编译期间,也就是静态绑定。