多态性简介
-
多态性是在继承的基础之上扩展出来的概念,也就是说可以实现父子类之间的互相转换处理
-
在Java之中对于多态性有两种实现的模式:
- 方法的多态性:
·1. 方法的重载:同一个方法名称可以根据传入的参数的类型或个数的不同实现不同功能的执行;
·2. 方法的覆写:同一个方法可能根据子类的不同有不同的实现; - 对象的多态性:父子实例之间的转换处理,它有两种模式:
·1. 对象的向上转型:父类 父类实例 = 子类实例;自动完成转换
·2. 对象的向下转型:子类 子类实例 = (子类) 父类实例;强制转换
- 方法的多态性:
-
从实际的转型处理来讲,大部分情况下考虑的是对象的向上转型,而对象的向下转型都是在使用子类的特殊功能(子类可以对父类进行功能扩充)的时候要采用向下转型
对象向上转型(接受或返回参数的统一性)
对象转型的处理属于多态性,而这一特性必须在继承性的基础上实现。
/**
向上转型的主要特点在于,可以对参数进行统一的设计
*/
class Message {
public void print() {
System.out.println("********** Channel ************");
}
}
class DataBaseMessage extends Message {
public void print() {
System.out.println("进行了databasse连接");
}
}
class WebServerMessage extends Message {
public void print() {
System.out.println("进行了webservermessage连接");
}
}
public class JavaDemo {
public static void main(String [] args) {
//向上转型
fun(new DataBaseMessage()); // Message msg = new DataBaseMessage()
fun(new WebServerMessage()); // Message msg = new WebServerMessage()
}
public static void fun(Message msg) {
msg.print();
}
}
对象向下转型
向下转型主要特点在于需要使用到一些子类自己特殊的定义处理。
class Person {
public void print() {
System.out.println("一个正常的人类");
}
}
class SuperMan extends Person {
public String fly() {
return "飞";
}
public String fire() {
return "喷火";
}
}
public class JavaDemo {
public static void main(String [] args) {
Person per = new SuperMan(); //向上转型
SuperMan man = (SuperMan) per; //向下转型
System.out.println(man.fly());
System.out.println(man.fire());
}
}
- 向上描述的是一些公共的特征,而向下描述的是子类自己特殊的定义环境,但是向下转型并不是一件安全的事情,因为在进行向下转型之前一定要先发生向上转型
//错误程序
Person per = new Person();
SuperMan man = (SuperMan) per; //向下转型
- 所以只要在发生对象向下转型之前一定要首先发生向上转型,两个没人任何关系的实例如果要发生强制转换,那么就会出现"ClassCastException"异常,所以向下转型并不是一件安全的事情。
instanceof关键字
通过分析来看,向下转型存在安全隐患,所以为了保证向下转型的正确性,往往需要在进行转型之前进行判断,判断某个实例是否是某个类的对象,这个就需要instanceof语法来实现。
- 对象 instanceof 类, 返回boolean类型,如果是true表示实例是指定类对象
Person per = new Person();
System.out.println(per instanceof Person); //true
System.out.println(per instanceof SuperMan); //false
Person per = new SuperMan(); //向上转型
System.out.println(per instanceof Person); //true
System.out.println(per instanceof SuperMan); //true
Person per = new SuperMan(); //向上转型
if(per instanceof SuperMan) {
SuperMan man = (SuperMan) per;
System.out.println(man.fly());
System.out.println(man.fire());
}
网友评论