您好,欢迎访问一九零五行业门户网

Java向上转型和向下转型的使用介绍(附代码)

本篇文章给大家带来的内容是关于java向上转型和向下转型的使用介绍(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。
1 向上转型(子类转型成父类)
 举例:
package a.b;public class a {public void a1() {       system.out.println(superclass);}}a的子类b:package a.b;public class b extends a {public void a1() {       system.out.println(childrenclass); //覆盖父类方法}       public void b1(){} //b类定义了自己的新方法}c类:package a.b;public class c {public static void main(string[] args) {       a a = new b(); //向上转型       a.a1();}}
如果运行c,输出的是superclass 还是childrenclass?不是你原来预期的superclass,而是childrenclass。这是因为a实际上指向的是一个子类对象。当然,你不用担心,java虚拟机会自动准确地识别出究竟该调用哪个具体的方法。不过,由于向上转型,a对象会遗失和父类不同的方法,例如b1()。有人可能会提出疑问:这不是多此一举吗?我们完全可以这样写:
b a = new b();
a.a1();
确实如此!但这样就丧失了面向抽象的编程特色,降低了可扩展性。其实,不仅仅如此,向上转型还可以减轻编程工作量。来看下面的显示器类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();}}我们也可以采用接口的方式,例如:package a.b;public interface monitor {abstract void displaytext();abstract void displaygraphics();}将液晶显示器类lcdmonitor稍作修改:package a.b;public class lcdmonitor implements monitor {public void displaytext() {       system.out.println(lcd display text);}public void displaygraphics() {       system.out.println(lcd display graphics);}}
2 向下转型(父类转型成子类)
a类:package a.b;public class a {void amthod() {       system.out.println(a method);}}a的子类b:package a.b;public class b extends a {void bmethod1() {       system.out.println(b method 1);}void bmethod2() {       system.out.println(b method 2);}}c类:package a.b;public class c {     public static void main(string[] args) {            a a1 = new b(); // 向上转型            a1.amthod();    // 调用父类amthod(),a1遗失b类方法bmethod1()、bmethod2()            b b1 = (b) a1; // 向下转型,编译无错误,运行时无错误            b1.amthod();    // 调用父类a方法            b1.bmethod1(); // 调用b类方法            b1.bmethod2(); // 调用b类方法            a a2 = new a();            b b2 = (b) a2; // 向下转型,编译无错误,运行时将出错            b2.amthod();            b2.bmethod1();            b2.bmethod2();     }}从上面的代码我们可以得出这样一个结论:向下转型需要使用强制转换。运行c程序,控制台将输出:exception in thread main java.lang.classcastexception: a.b.a cannot be cast to a.b.b at                a.b.c.main(c.java:14)a methoda methodb method 1b method 2
其实b b2 = (b) a2处的向下转型代码后的注释已经提示你将发生运行时错误。为什么前一句向下转型代码可以,而后一句代码却出错?这是因为a1指向一个子类b的对象,所以子类b的实例对象b1当然也可以指向a1。而a2是一个父类对象,子类对象b2不能指向父类对象a2。那么如何避免在执行向下转型时发生运行时classcastexception异常?使用5.7.7节学过的instanceof就可以了。我们修改一下c类的代码:
a a2 = new a();if (a2 instanceof b) {b b2 = (b) a2;b2.amthod();b2.bmethod1();b2.bmethod2();}
这样处理后,就不用担心类型转换时发生classcastexception异常了。
以上就是java向上转型和向下转型的使用介绍(附代码)的详细内容。
其它类似信息

推荐信息