面向对象的多态性
在面向对象设计中多态性描述的是同一结构在执行时会根据不同的形式展现出不同的效果, 在Java中多态性可以分为两种展示方式.
方法的多态性
方法的重载: 同一个方法可以根据传入的参数类型或个数的不同实现不同功能。
方法的覆写:同一个方法可以根据实现子类的不同有不同的实现。
No. | 区别 | 重载 | 覆写 |
1 | 英文 | Overloading | Overriding |
2 | 定义 | 方法名称相同,参数的类型及个数不同 | 方法名称、参数的类型及个数、返回值类型完全相同 |
3 | 权限 | 没有权限要求 | 被子类所覆写的方法不能拥有比父类更严格的访问控制权限 |
4 | 范围 | 发生在一个类中 | 发生在继承关系类中 |
方法重载 | 方法覆写 |
|
|
对象的多态性
对象向上转型: 父类 父类实例 = 子类实例, 自动完成转换
对象向下转型: 子类 子类实例= (子类) 父类实例,强制完成转换
对象向上转换
class Message{
public void print(){
System.out.println("basic message");
}
}
class DatabaseMessage extends Messge{
public void print(){
System.out.println("database message");
}
}
class NetworkMessage extends Message{
public void print(){
System.out.println("network message");
}
}
class Channel{
public static void send(Message mes){
msg.print();
}
}
public class Javaxiangshang{
public static void main(String args[]){
Message msgA = new DatabaseMessage();
msgA.print();
Message msagB = new NetworkMessage();
msgB.print();
Channel.send(new DatabaseMessage());
Channel.send(new NetworkMessage());
}
}
//程序输出结果
//database message
//network message
//database message
//network message
在这个例子中,使用子类对父类对象进行实例化,由于print()方法已经被子类所覆写,所以最后调用的方法就是被实例化的子类所覆写的方法.对象向上转型的最大特点是可以通过父类对象自动接收子类实例, 在实际开发中可以通过这个原理实现方法接收或返回参数类型的统一。一旦发生对象的向上转型,那么父类可以使用的方法只能是本类或其父类定义的方法,是无法直接调用子类扩充方法的。
对象向下转型
子类继承父类之后可以对父类的功能进行扩充,有两种方法,一种是对已有方法进行覆写,还有一种是子类定义自己的新方法。对于子类扩充的方法只有子类实例才可以调用。在这种情况下,如果子类已经发生向上转型后就需要强制向下转型来实现子类方法的调用。
class Person{
public void run(){
System.out.print("human need to run.");
}
}
class Student extends Person{
public void learn(){
System.out.print("student needs to learn");
}
public void read(){
System.out.print("student needs to read");
}
}
public class Javaxiagnxiazhuanxing{
public static void main(String args[]){
Person per = new Student();
per.run();
if (per instanceof Student){
Student stu = (Student) per;
stu.learn();
stu.read();
}esle{
System.out.println("class cast exception");
}
}
}
//human need to run.
//student needs to learn
//student needs to read
在对象向下转型中,父类实例是不可能强制转换为任意子类实例,必须先通过子类实例化,利用向上转型让父类对象与具体子类实例发生联系后才可以向下转型,否则就会出现ClassCastException异常.
所有的类均继承自object类,所有的引用数据类型都可以向Object类进行向上转型,利用Object可以实现方法接收参数或返回数据类型的统一.