介绍
这篇文章主要介绍Java向上转型和向下转型的使用方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
1向上转型(子类转型成父类)
,举例:
包a.b; 公共类{ 公共空间a1 () { System.out.println (“Superclass"); } } 一个的子类B: 包a.b; 公共B类扩展了{ 公共空间a1 () { System.out.println (“Childrenclass");//覆盖父类方法 } 公共空间b1 () {}//B类定义了自己的新方法 } C类: 包a.b; 公共类C { 公共静态void main (String [] args) { A=new ();//向上转型 a.a1 (); } }
如果运行C、输出的是超类还是Childrenclass ?不是你原来预期的超类,而是Childrenclass。这是因为一个实际上指向的是一个子类对象。当然,你不用担心,Java虚拟机会自动准确地识别出究竟该调用哪个具体的方法,不过,由于向上转型,一个对象会遗失和父类不同的方法,例如b1()。有人可能会提出疑问:这不是多此一举吗?我们完全可以这样写:
B=新B ();
a.a1 ();
确实如此!但这样就丧失了面向抽象的编程特色,降低了可扩展性。其实,不仅仅如此,向上转型还可以减轻编程工作量。来看下面的显示器类监视器:
包a.b; 公共班长{ 公共空间displayText () {} 公共空间显示图形(){} } 液晶显示器类LCDMonitor是监控的子类: 包a.b; 公开课LCDMonitor扩展监控{ 公共空间displayText () { System.out.println(“液晶显示屏text"); } 公共空间显示图形(){ System.out.println(“液晶显示屏graphics"); } } 阴极射线管显示器类CRTMonitor自然也是监控的子类: 包a.b; 公开课CRTMonitor扩展监控{ 公共空间displayText () { System.out.println (“CRT显示器text"); } 公共空间显示图形(){ System.out.println (“CRT显示器graphics"); } } 等离子显示器PlasmaMonitor也是监控的子类: 包a.b; 公开课PlasmaMonitor扩展监控{ 公共空间displayText () { System.out.println(“等离子显示text"); } 公共空间显示图形(){ System.out.println(“等离子显示graphics"); } } 现在有一个MyMonitor类。假设没有向上转型,MyMonitor类代码如下: 包a.b; 公开课MyMonitor { 公共静态void main (String [] args) { 运行(新LCDMonitor ()); 运行(新CRTMonitor ()); 运行(新PlasmaMonitor ()); } 公共静态空运行(LCDMonitor监控){ monitor.displayText (); monitor.displayGraphics (); } 公共静态空运行(CRTMonitor监控){ monitor.displayText (); monitor.displayGraphics (); } 公共静态空运行(PlasmaMonitor监控){ monitor.displayText (); monitor.displayGraphics (); } } 可能你已经意识到上述代码有很多重复代码,而且也不易维护。有了向上转型,代码可以更为简洁: 包a.b; 公开课MyMonitor { 公共静态void main (String [] args) { 运行(新LCDMonitor ());//向上转型 运行(新CRTMonitor ());//向上转型 运行(新PlasmaMonitor ());//向上转型 } 公共静态空运行(监视器监视){//父类实例作为参数 monitor.displayText (); monitor.displayGraphics (); } } 我们也可以采用接口的方式,例如: 包a.b; 公共接口监控{ 抽象的空白displayText (); 抽象的空白显示图形(); } 将液晶显示器类LCDMonitor稍作修改: 包a.b; 公共类LCDMonitor实现监控{ 公共空间displayText () { System.out.println(“液晶显示屏text"); } 公共空间显示图形(){ System.out.println(“液晶显示屏graphics"); } }Java向上转型和向下转型的使用方法