欢迎来到天天文库
浏览记录
ID:38744120
大小:58.00 KB
页数:9页
时间:2019-06-18
《向上转型和向下转型》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、在Java编程中经常碰到类型转换,对象类型转换主要包括向上转型和向下转型。5.13.1向上转型我们在现实中常常这样说:这个人会唱歌。在这里,我们并不关心这个人是黑人还是白人,是成人还是小孩,也就是说我们更倾向于使用抽象概念“人”。再例如,麻雀是鸟类的一种(鸟类的子类),而鸟类则是动物中的一种(动物的子类)。我们现实中也经常这样说:麻雀是鸟。这两种说法实际上就是所谓的向上转型,通俗地说就是子类转型成父类。这也符合Java提倡的面向抽象编程思想。来看下面的代码:packagea.b;publicclassA{publicvoida1(){ System.ou
2、t.println("Superclass");}}A的子类B:packagea.b;publicclassBextendsA{publicvoida1(){ System.out.println("Childrenclass");//覆盖父类方法} publicvoidb1(){}//B类定义了自己的新方法}C类:packagea.b;publicclassC{publicstaticvoidmain(String[]args){ Aa=newB();//向上转型 a.a1();}}如果运行C,输出的是Superclass
3、还是Childrenclass?不是你原来预期的Superclass,而是Childrenclass。这是因为a实际上指向的是一个子类对象。当然,你不用担心,Java虚拟机会自动准确地识别出究竟该调用哪个具体的方法。不过,由于向上转型,a对象会遗失和父类不同的方法,例如b1()。有人可能会提出疑问:这不是多此一举吗?我们完全可以这样写:Ba=newB();a.a1();确实如此!但这样就丧失了面向抽象的编程特色,降低了可扩展性。其实,不仅仅如此,向上转型还可以减轻编程工作量。来看下面的显示器类Monitor:packagea.b;publicclassMonito
4、r{publicvoiddisplayText(){}publicvoiddisplayGraphics(){}}液晶显示器类LCDMonitor是Monitor的子类:packagea.b;publicclassLCDMonitorextendsMonitor{publicvoiddisplayText(){ System.out.println("LCDdisplaytext");}publicvoiddisplayGraphics(){ System.out.println("LCDdisplaygraphics");}}阴极射线管显示器
5、类CRTMonitor自然也是Monitor的子类:packagea.b;publicclassCRTMonitorextendsMonitor{publicvoiddisplayText(){ System.out.println("CRTdisplaytext");}publicvoiddisplayGraphics(){ System.out.println("CRTdisplaygraphics");}}等离子显示器PlasmaMonitor也是Monitor的子类:packagea.b;publicclassPlasmaMonitor
6、extendsMonitor{publicvoiddisplayText(){ System.out.println("Plasmadisplaytext");}publicvoiddisplayGraphics(){ System.out.println("Plasmadisplaygraphics");}}现在有一个MyMonitor类。假设没有向上转型,MyMonitor类代码如下:packagea.b;publicclassMyMonitor{publicstaticvoidmain(String[]args){ run(ne
7、wLCDMonitor()); run(newCRTMonitor()); run(newPlasmaMonitor());}publicstaticvoidrun(LCDMonitormonitor){ monitor.displayText(); monitor.displayGraphics();}publicstaticvoidrun(CRTMonitormonitor){ monitor.displayText(); monitor.displayGraphics();}publicstatic
8、voidr
此文档下载收益归作者所有