对象的可替换性

引子

对象的可替换性,这个概念是从父类子类那一块看到的,我开始看的也纳闷。比如形状是父类,子类有矩形、三角形、圆形、椭圆形等等。难道三角形可以替换圆形,苦思冥想好久,心想怎么可能啊。原来是是说子类可以替换父类,因为子类继承了父类的所有属性和方法同时可以自己扩充。就像儿子(子类)想装成爸爸的模样装上帅气的西装…….,但是父亲不会(不能)去办成儿子,因为儿子继承了他的所有又有新的东西了。

但是在程序中创建对象的时候声明是父类但是实例化的时候是子类呢?

father = new son();

看下面的例子吧

例子

为啥不直接son= new son();呢?
确实如此!但这样就丧失了面向抽象的编程特色,降低了可扩展性。其实,不仅仅如此,向上转型还可以减轻编程工作量。来看下面的显示器类Monitor:

package a.b;
public class Monitor{
public void displayText() {}
public void displayGraphics() {}
}

液晶显示器类LCDMonitor是Monitor的子类:

package a.b;
public class LCDMonitor extends Monitor {
public void displayText() {
       System.out.println("LCD display text");
}
public void displayGraphics() {
       System.out.println("LCD display graphics");
}
}

阴极射线管显示器类CRTMonitor自然也是Monitor的子类:

package a.b;
public class CRTMonitor extends Monitor {
public void displayText() {
       System.out.println("CRT display text");
}
public void displayGraphics() {
       System.out.println("CRT display graphics");
}
}

等离子显示器PlasmaMonitor也是Monitor的子类:

package a.b;
public class PlasmaMonitor extends Monitor {
public void displayText() {
       System.out.println("Plasma display text");
}
public void displayGraphics() {
       System.out.println("Plasma display graphics");
}
}

现在有一个MyMonitor类。假设没有向上转型,MyMonitor类代码如下:

package a.b;
public class MyMonitor {
public static void main(String[] args) {
       run(new LCDMonitor());
       run(new CRTMonitor());
       run(new PlasmaMonitor());
}
public static void run(LCDMonitor monitor) {
       monitor.displayText();
       monitor.displayGraphics();
}
public static void run(CRTMonitor monitor) {
       monitor.displayText();
       monitor.displayGraphics();
}
public static void run(PlasmaMonitor monitor) {
       monitor.displayText();
       monitor.displayGraphics();
}
}

可能你已经意识到上述代码有很多重复代码,而且也不易维护。有了向上转型,代码可以更为简洁:

package a.b;
public class MyMonitor {
public static void main(String[] args) {
       run(new LCDMonitor());                      //向上转型
       run(new CRTMonitor());                     //向上转型
       run(new PlasmaMonitor());            //向上转型
}
public static void run(Monitor monitor) { //父类实例作为参数
       monitor.displayText();
       monitor.displayGraphics();
}
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值