且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

领略多态的魅力-对象向上转型 | 带你学《Java面向对象编程》之四十八

更新时间:2022-06-26 13:53:05

上一篇:初识面向对象第三特征-多态 | 带你学《Java面向对象编程》之四十七
【本节目标】
通过阅读本节内容,你将了解到向上转型在编程过程中带来的便利性与面向对象编程的魅力,学会借助继承与向上转型实现某些复杂的业务逻辑。

对象向上转型(接收或返回参数的统一性)

对象转型的处理属于多态性,而这一特性必须在继承性的基础上实现。
范例:观察一个简单代码

class Message {
    public void print() {
        System.out.println(“www.mldn.cn”) ;  
    }
}
Class DataBaseMessage extends Message {
    public void print() {
        System.out.println(“Oracle数据库连接信息…..”) ;
    }
}
public class JavaDemo{
    public static void main(String args[]) {
        DataBaseMessage msg = new DataBaseMessage() ;
        msg.print() ;
    }
}

本程序是一个简单的方法覆写操作实现,整体的程序之中可以发现,由于现在实例化的是子类对象,并且子类对象覆写了父类中的print()方法,所以调用的是被覆写过的方法。
范例:观察向上转型

class Message {
    public void print() {
        System.out.println(“www.mldn.cn”) ;  
    }
}
Class DataBaseMessage extends Message {
    public void print() {
        System.out.println(“Oracle数据库连接信息…..”) ;   //执行结果: Oracle数据库连接信息…..
    }
}
public class JavaDemo{
    public static void main(String args[]) {
        Message msg = new DataBaseMessage() ;    //向上转型
        msg.print() ;
    }
}

那么这个时候就需要思考了,向上转型这种操作有什么主要的用处呢?

class Message {
    public void print() {
        System.out.println(“www.mldn.cn”) ;  
    }
}
class DataBaseMessage extends Message {
    public void print() {
        System.out.println(“Oracle数据库连接信息…..”) ;   
    }
}
class WebServerMessage extends Message {
    public void print() {
        System.out.println(“WEB服务器连接信息…..”) ;   
    }
}
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() ;
    }
}

执行结果:
Oracle数据库连接信息…..
WEB服务器连接信息…..
向上转型的主要特点在于可以对参数进行统一的设计。但是为什么此时不使用重载来解决当前问题?

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(DataBaseMessage msg) {   //不管传递的是哪一个子类都可以接收
        msg.print() ;
    }
    public static void fun(WebServerMessage msg) {   //不管传递的是哪一个子类都可以接收
        msg.print() ;
    }
}

现在的操作利用了重载解决了当前的设计,的确可以实现与之前完全一样的效果。但是在进行程序类设计的时候除了满足于当前的要求之外,还需要做出可维护性的设计。如果说现在随着项目的发展,Message产生了3W个子类,那么这个时候每当扩充一个Message子类之后就需要追加一个fun()的方法重载,这样就对程序的维护性造成很大影响。
想学习更多的Java的课程吗?从小白到大神,从入门到精通,更多精彩不容错过!免费为您提供更多的学习资源。
本内容视频来源于阿里云大学

下一篇:领略多态的魅力-对象向下转型 | 带你学《Java面向对象编程》之四十九
更多Java面向对象编程文章查看此处