26 02向上转型和向下转型的总结和作用
向上转型:父类引用指向子类对象,例如:Father f1 = new Son(); 当子类向上造型后的对象的方法中不存在子类的自己的特色的方法,只有父类的方法。而且子类对于父类进行重写的方法。向上造型的对象的方法为重写后新的方法。
在这个例子中 person类分别是man,weman,child 的父类
package DAY12; public class Demo { public static void main(String[] args) { Person p=new man();//向上转型,编译是Person对象,运行的时候是man类对象 声明是父类,调用的方法却只能是子类的 System.out.println(p.getClass());//class DAY12.man p.speak();// 我是man类 此时运行调用的是man类中的方法 } } class Person{ String name; int age; void speak() { System.out.println("我是Person类,是所有人的父类"); } } class man extends Person { void speak() { System.out.println("我是man类"); } void doThing() { System.out.println("我是man类,我可以做重活"); //这是子类的特有方法 } } class weman extends Person { void speak() { System.out.println("我是weman类"); } void doThing() { System.out.println("我是weman类,我可以做针线活"); //这是子类的特有方法 } } class child extends Person { void speak() { System.out.println("我是child类"); } void doThing() { System.out.println("我是child类,我可以玩游戏"); //这是子类的特有方法 } }
.向下造型:把指向子类对象的父类引用赋给子类引用,需要强制转换,父类引用的对象转换为子类类型。但是对于父类的引用对象一定要是由子类实例化的,也就是说向下造型的出现一般的情况都是和向上造型一起出现的。例如:
Father f1 = new Son();
Son s1 = (Son)f1;
但有运行出错的情况:
Father f2 = new Father();
Son s2 = (Son)f2;//编译无错但运行会出现错误
在不确定父类引用是否指向子类对象时,可以用instanceof来判断:
if(f3 instanceof Son){
Son s3 = (Son)f3;
}
也可以来个通俗点的:
A类是父类,B类是子类
A a = new A(); B b = new B();
A a1 = b; ---向上造型
B b1 =(B)a1;-----向下造型
B b2 = (A)a;--------这个就会报错。ClassCastException
详情可以看我的https://www.cnblogs.com/xuwangqi/p/11106535.html
作用:就好像是一个工厂可以生产多种品牌的电脑,那么我们让工厂生产的时候如果是按品牌给工厂,那么我们要工厂开多个品牌的流水线生产,而不同品牌的电脑又可以统称为电脑,这个时候我们给工厂就让他生产电脑,等他生产出来的时候我们在贴上不同品牌的商标。这样让工厂的使用更方便了。
这个过程就是电脑作为不同品牌的父类,生产的时候先向上转型成电脑,随后在向下转型转换为个品牌的电脑。讲的不好,请谅解。
---------------------
作者:Syaxis
来源:CSDN
原文:https://blog.csdn.net/syaxis/article/details/54585086
版权声明:本文为博主原创文章,转载请附上博文链接!