Java 向上转型和向下转型的详解
java 向上转型和向下转型的详解
转型是在继承的基础上而言的,继承是面向对象语言中,代码复用的一种机制,通过继承,子类可以复用父类的功能,如果父类不能满足当前子类的需求,则子类可以重写父类中的方法来加以扩展。
向上转型:子类引用的对象转换为父类类型称为向上转型。通俗地说就是是将子类对象转为父类对象。此处父类对象可以是接口
向下转型:父类引用的对象转换为子类类型称为向下转型。
前者是一个向上转型,animal dog 引用指向new dog();子类对象当成父类对象,只能调用父类的成员,如果子类重写了父类的方法就根据这个引用指向调用子类重写的这个方法(这个方法就是覆盖override)。这个调用过程就称为“动态绑定”。
转型需要注意的问题:
向上转型时,父类指向子类引用对象会遗失除与父类对象共有的其他方法,也就是在转型过程中,子类的新有的方法都会遗失掉,在编译时,系统会提供找不到方法的错误。
实例如下:
public class animal { public void eat(){ system.out.println("animal eatting..."); } } class bird extends animal{ public void eat(){ system.out.println("bird eatting..."); } public void fly(){ system.out.println("bird flying..."); } } class main{ public static void main(string[] args) { animal b=new bird(); //向上转型 b.eat(); b.fly(); //此处提示在animal中没有定义fly方法。 }
在向下转型过程中,分为两种情况:
情况一:如果父类引用的对象如果引用的是指向的子类对象,那么在向下转型的过程中是安全的。也就是编译是不会出错误的。
情况二:如果父类引用的对象是父类本身,那么在向下转型的过程中是不安全的,编译不会出错,但是运行时会出现java.lang.classcastexception错误。它可以使用instanceof来避免出错此类错误。
实例如下:
public class girl { public void smile(){ system.out.println("girl smile()..."); } } class mmgirl extends girl{ @override public void smile() { system.out.println("mmirl smile sounds sweet..."); } public void c(){ system.out.println("mmirl c()..."); } } class main{ public static void main(string[] args) { girl g1=new mmgirl(); //向上转型 g1.smile(); mmgirl mmg=(mmgirl)g1; //向下转型,编译和运行皆不会出错 mmg.smile(); mmg.c(); girl g2=new girl(); //mmgirl mmg1=(mmgirl)g2; //不安全的向下转型,编译无错但会运行会出错 //mmg1.smile(); //mmg1.c(); if(g2 instanceof mmgirl){ mmgirl mmg1=(mmgirl)g2; mmg1.smile(); mmg1.c(); } }
总结:
1、父类引用可以指向子类对象,子类引用不能指向父类对象。
2、把子类对象直接赋给父类引用叫upcasting向上转型,向上转型不用强制转型。
如father father = new son();
3、把指向子类对象的父类引用赋给子类引用叫向下转型(downcasting),要强制转型。
如father就是一个指向子类对象的父类引用,把father赋给子类引用son 即son son =(son)father;
其中father前面的(son)必须添加,进行强制转换。
4、upcasting 会丢失子类特有的方法,但是子类overriding 父类的方法,子类方法有效
5、向上转型的作用,减少重复代码,父类为参数,调有时用子类作为参数,就是利用了向上转型。这样使代码变得简洁。体现了java的抽象编程思想。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
下一篇: 莲藕汤的功效和做法
推荐阅读
-
Java : 多态表现:静态绑定与动态绑定(向上转型的运行机制)
-
Java 向上转型和向下转型的详解
-
浅谈Java中向上造型向下造型和接口回调中的问题
-
对继承与多态、成员变量的隐藏和方法重写、super关键字、final关键字、对象的上转型对象、抽象类的学习理解(java)
-
java向上转型发生的时机知识点详解
-
java多态的向上转型的概念及实例分析
-
Java : 多态表现:静态绑定与动态绑定(向上转型的运行机制)
-
重载和重写的理解,以及什么是自动转型与强制转型 Java重写重载自动转型强制转型
-
JAVA 面向对象(继承,向上/下转型,子类调用父类的构造函数)
-
jquery向上遍历、向下遍历、同级遍历和过滤的用法详解