类型
- 编译时多态:方法重载;在Java中方法名和参数列表称为方法的签名,子类中若有和父类签名相同的方法则会覆盖
- 运行时多态:JAVA运行时系统根据调用该方法的实例的类型来决定选择调用哪个方法则被称为运行时多态。(我们平时说得多的是运行时多态,所以多态主要也是指运行时多态)
注:另一种观点认为不要把函数重载理解为多态。
运行时多态存在的三个必要条件
要有继承(包括接口的实现)
要有重写(子类重写父类的方法)
父类引用指向子类对象
例子
public class Test {
static public void main(String [] args){
A b = new B();
b.sayHello();
b.funForB();
//如果就想用b调用funForB怎么做
}
}
class A{
public void sayHello(){
System.out.println("Hi Im A");
}
}
class B extends A{
public void sayHello(){
System.out.println("Hi Im B");
}
public void funForB(){
System.out.println("function for B");
}
}
理解
当使用多态方式调用方法时,首先检查父类中是否有该方法,==如果没有,则编译错误==;
如果有,再去检查子类中是否存在同名方法,若存在则调用子类的同名方法,否则调用当前类的方法。
注意:static方法、final方法、private方法和构造器属于特殊情况,如果调用这些方法则编译器可以准确的知道应该调用哪个方法,这种方式叫做静态绑定。
static方法只能继承,不能重写Override,如果子类中定义了同名同形式的静态方法,它对父类方法只起到隐藏的作用。调用的时候用谁的引用,则调用谁的版本。
final方法不能被重写