多态
多态是指一个程序中相同的名字代表不同的含义的情况
两种不同的多态
(1)编译时多态(overload重载)
多个同名的方法,但是方法的参数不同
p.sayhello();
p.sayhello("hello world");
(2)运行时多态
覆盖(override)
子类对父类方法进行覆盖
虚方法调用(动态绑定)
调用时,程序会正确的调用子类对象的方法
public class TestVirtualInvoke {
public static void main(String args[]){
Triangle triangle = new Triangle();
Circle circle = new Circle();
Dostuff(triangle); //根据传入对象的不同,能自动检查出是哪个draw函数
Dostuff(circle);
}
static void Dostuff(Shape s){
s.draw();
}
}
class Shape{
void draw(){
System.out.println("形状");
}
}
class Triangle extends Shape{
void draw(){
System.out.println("三角形");
}
}
class Circle extends Shape{
void draw(){
System.out.println("圆形");
}
}
所有的非final方法会自动地进行动态绑定
三种非虚方法
1
static的方法,以声明的类型为准,与实例方法无关
2
private方法子类看不见,也不会被虚化
3
final方法子类不能覆盖,不存在虚化问题