abstract class Message{
abstract void send();
}
class TextMsg extends Message{
public void send(){ //文本消息}
}
class CustomMsg extends Message{
public void send(){ //自定义消息}
}
public class Main{
public static void main(String[] args){
Main m = new Main();
// Message t = new TextMsg(); 父类的引用指向了子类
m.send(new TextMsg());
// Message c= new CustomMsg();
m.send(new CustomMsg());
}
// TextMsg、CustomMsg
public void send(Message people){
people.send();
}
}
父类(抽象类,接口)的引用(指向了/ 接收了)子类对象。
不同子类可以对同一消息作出响应。(覆盖,重写)
前提是 类与类之间必须存在关系(继承,实现)。
弊端:只能调用父类已有的方法,不能预先使用子类中定义的特有功能。
优点:如在聊天功能中消息类型是有很多种的,如:文本,图片,自定义。。。
预先定义的程序可以运行后期程序的内容,增强了程序的扩展性
就可以不用每次创建具体消息后,手动调用发送的方法了。
多态的注意事项:
对于成员函数:Fu f = new Zi(); f.method();
编译时期:看左边。因为方法是在父类中定义
运行时期:看右边。因为子类会覆盖父类的方法,
对于非私有的实例变量。
属于对象,堆中存储,每个具体类堆都是独立的
静态变量,静态方法。 属于类,方法区存储
编译和运行都看左边。
转型:
//文本消息向上转型为了消息
Message m= new TextMsg(); //向上转型,级别升高
//文本消息对象的父类引用m强制转换成了文本消息类型
TextMsg t = (TextMsg )m; //向下转型。级别降低
总结:多态的体现主要在覆盖重写、类型转换,增强了程序的扩展性。