https://blog.csdn.net/HuoYiHengYuan/article/details/84855069
向上转型:将子类转化为父类。
向下转型:将父类转化为子类。
下面我们通过例子让读者一步步带入:
转型是基于继承,所以先实现一个子类继承父类。
虽然f是Son对象向上转型得到的,但因为它此时属于Father类,并未实现子类的p()方法,所以不能使用f.p();此时可以看做是一种“瘦身”。
还是上面的例子,如果再强转为子类。代码如下。
是不是很惊喜?父类转化为子类,又恢复了子类独有的方法。
那么,如果我们是直接向下转型呢?
看来,向下转型并不耽误父类方法的调用。
但是,直接向下转型竟然会报错!提示如下:
Exception in thread "main" java.lang.ClassCastException: lanqiao.Father cannot be cast to lanqiao.Son
at lanqiao.UpAndDown.main(UpAndDown.java:7)
意思是说:类型转换异常,Father不能转化为Son。
这种现象我们可以通俗地理解:
其实吧,事情是这样的:
内存中,因为向上转型是父类的引用指向为子类的对象,所以,它只是指向了父类应该拥有的属性和方法,而子类的独有的方法和属性就不指向了(或者说隐藏了),当再强转到子类时。又重新指向了子类对象,那属于它的东西又恢复了。
来图:
好了,那么转型有撒子用途呢?
我们这样理解,人都能跳舞,男人和女人跳舞是不一样的。(女装大佬请手下留情!)
假装有代码:
假设Person有个dance()跳舞方法。
Man extends Person Women extends Person
此时Man和Women都重写了Person的dance();
当 Person p = new Man(); p.dance(); //这个时候就是调用男人跳舞的dance方法
当 Person p = new Woman(); p.dance();// 这个时候就是调用女人的跳舞的dance方法
这样其实就是一个java的继承,多态. 利于程序扩展. 你需要理解这种设计方式,会让你写出更易维护,简洁的代码。
灵感不够,拷贝来凑:(不要揍我)
https://blog.csdn.net/xyh269/article/details/52231944
原文:https://www.cnblogs.com/gtea/p/13697699.html