面向对象的多态性的理解
在面向对象设计当中,多态性描述的是同一结构在执行的的过程当中会根据不同的形式展现出来不同的效果。在JAVA语言当中多态性可以分为方法的重载和方法的覆写
方法重载:
class Message {
public void print() {//重载
System.out.println("www.csdn.com");
}
public void print(String str)//重载
{
System.out.println(str);
}
}
方法重写:
class Message {
public void print() {//重载
System.out.println("www.csdn.com");
}
}
class DatabaseMessage extends Message {
@Override
public void print()
{
System.out.println("csdn数据库消息");
}
}
class NetWorkMessage extends Message{
@Override
public void print()
{
System.out.println("csdn网络消息");
}
}
方法重载的多态性体现了一个方法名可以有多个不同的实现;方法的重写的多态性体现出来对于一个父类的用一个方法,在不同的子类中会有不同的实现。
对象的多态性(父类和子类实例之间转换处理)
1.对象向上进行转型: 父类, 父类实例 = 子类实例, 自动完成转换
在子类对象实例化之前一定会自动实例化父类对象,所以此时将子类对象的实例通过父类进行接收即可实现对象的自动向上转型。而此时的本质还是子类实例,一旦子类中覆写了父类的方法,并且调用该方法时,所调用的方法一定是被子类所覆写的方法。
class Message {
public void print() {//重载
System.out.println("www.csdn.com");
}
}
class DatabaseMessage extends Message {
@Override
public void print()
{
System.out.println("csdn数据库消息");
}
}
class NetWorkMessage extends Message{
@Override
public void print()
{
System.out.println("csdn网络消息");
}
}
public class JavaDemo
{
public static void main(String args[]) {
Message msg1 = new DataaseMessage(); //向上进行转型
msg1.print();
Message msg2 = new NetMessage();
msg2.print();
}
}
程序执行结果如下:
csdn数据库消息
csdn网络消息
对象向上进行转型的特点:
可以通过父类对象自动接收子类实例。
而在实际的软件开发的过程当中,可以利用这一特点来实现方法的接收或者参数返回类型的统一。
class Message {
public void print() {//重载
System.out.println("www.csdn.com");
}
}
class DatabaseMessage extends Message {
@Override
public void print()
{
System.out.println("csdn数据库消息");
}
}
class NetWorkMessage extends Message{
@Override
public void print()
{
System.out.println("csdn网络消息");
}
}
class Channel{
public void send(Message msg)
{
msg.print();
}
}
public class JavaDemo
{
public static void main(String args[]) {
Channel.send( new DataaseMessage()); //子类实例发送消息
Channel.send(new NetMessage());//子类实例发送消息
}
}
运行结果如下
csdn数据库消息
csdn网络消息
上述程序定义的Channel send()方法,接收的参数的类型为Message,这就意味着所有的Message类及其子类对象都可以被接收。相当于统一了方法的参数的类型
2.对象向下进行转型: 子类 子类实例 = (子类)父类实例,强制完成转换
子类继承父类之后可以对已有的父类的功能进行相应的扩充。除了采用方法覆写这一功能之外,子类还可以定义自己的新的方法。而对于子类扩充的方法只有具体的子类实例才可以进行调用,在这样的情况下,如果子类已经发生了向上转型后就需要强制向下转型来 实现子类扩充方法的调用。
class Person{
public void run() {
System.out.println("奔跑");
}
}
class Superman extends Person{
public void fly()
{
System.out.println("超音速飞行");
}
public void fire()
{
System.out.println("喷火");
}
}
public class JavaDemo{
public static void main(String args[])
{
System.out.println("正常状态下超人的行为");
Person per = new Superman();
per.run();
System,out.println("特殊状态下超人的行为");
Superman spm = (Superman) per;
spm.fly();
spm.fire();
}
}
程序运行结果如下
正常状态下超人的行为
奔跑
特殊状态下超人的行为
超音速飞行
喷火
上述程序当中superman子类利用对象向上转型实例化了Person类对象,此时Person类只能够调用其本身和其父类中定义的方法。如果此时需要调用子类中扩充的方法时,就必须强制性地将其转换成为指定的子类类型。
只有县发生了向上转型,才能够进行向下转型,否则会出现ClassCastException
对象的向下转型存在着安全隐患,为了保证转换的安全性,可以在转换前通过instanceof关键字进行对象所属类型的判断,该关键字的使用方法如下:
对象 instanceof 类
该判断将会返回一个Boolean类型的数据,如果是true表示实例是指定的对象。