多态
多态
面向对象的三大特性:封装、继承、多态。多态指允许不同类的对象对同一消息做出相应,即同一消息可以根据发送对象的不同而采用多种不同的行为方式(发送消息即函数调用)。多态采用动态绑定,是指在执行期间(而非编译期)判断所引用对象的实际类型,根据实际的类型调用其相应的方法。多态需要满足三大条件:
1、要有继承;
2、要有重写;
3、父类引用指向子类对象。
Java中多态的实现方式有两种,一种是对象方法的多态,即方法的重载与重写;一种是对象类型的多态。在Java中对象类型的多态分为向上转型和向下转型,向上转型是程序自己完成的,向下转型必须明确指出要转型的子类类型,这是强制性的。这里重点介绍对象的多态。
向上转型
通过向上转型,父类对象可调用子类重写的方法,但是不能调用子类的新增的方法,否则在编译时会出错。示例:
public class Test {
public static void main(String[] args){
A a = new B(); //父类引用指向子类对象
a.f(); //可访问子类重写父类的f()方法
// a.f1(); //错误,不可访问子类特有的新增的方法
}
}
class A{
public void f(){
System.out.println("父类");
}
}
class B extends A{
public void f(){
System.out.println("子类");
}
public void f1(){
System.out.println("子类新增方法");
}
}
向下转型
向下转型是指把父类类型转换为子类类型。在进行对象的向下转型之前,必须先发生对象的向上转型。为避免向下转型时出现错误,可通过instanceof关键字判断父类对象是否可转换为子类对象。示例:
A a = new B();
B b = (B) a; //正确
b.f();
b.f1();