向上管理向下负责之感想java向上转型与向下转型java转型问题其实并不复杂,只要记住一句话。父类引用指向子类对象。什么叫父类引用指向子类对象,且听我慢慢道来.从2个名词开始说起:向上转型(upcasting)、向下转型(downcasting).举个例子:有2个类,father是父类,son类继承自father。fatherf1=newson;//这就叫upcasting(向上转型)//现在f1引用指向一个son对象sons1=(son)f1;//这就叫downcasting(向下转型)//现在f1还是指向son对象第2个例子:fatherf2=newfather;sons2=(son)f2;//出错,子类引用不能指向父类对象你或许会问,第1个例子中。sons1=(son)f1;问什么是正确的呢。很简单因为f1指向一个子类对象,fatherf1=newson;子类s1引用当然可以指向子类对象了。而f2被传给了一个father对象,fatherf2=newfather;子类s1引用不能指向父类对象。总结:1。父类引用指向子类对象,而子类引用不能指向父类对象。2。把子类对象直接赋给父类引用叫upcasting向上转型,向上转型不用强制转换。如:fatherf1=newson;3。把指向子类对象的父类引用赋给子类引用叫向下转型(downcasting),要强制转换。如。f1就是一个指向子类对象的父类引用。把f1赋给子类引用s1即sons1=(son)f1;其中f1前面的(son)必须加上,进行强制转换。一、向上转型。通俗地讲即是将子类对象转为父类对象。此处父类对象可第1页共7页以是接口。1,向上转型中的方法调用。看下面代码:[java]viewplaincopyprint。1.packagecom.wensefu.others;2.publicclassanimal{3.4.publicvoideat{5.system.out.println("animaleatting...");6.}7.}8.classbirdextendsanimal{9.10.publicvoideat{11.system.out.println("birdeatting...");12.}13.14.publicvoidfly{15.16.17.}18.}19.classmain{20.21.public22.23.24.25.法第2页共7页26.27.28.}29.30.public31.32.}33.}34.system.out.println("birdflying...");staticvoidmain(stringargs){animalb=newbird;//向上转型b.eat;//。error。b.fly;b虽指向子类对象,但此时丢失fly方dosleep(newmale);dosleep(newfemale);staticvoiddosleep(humanh){h.sleep;packagecom.wensefu.others;1.publicclasshuman{2.publicvoidsleep{3.system.out.println("humansleep..");4.}5.}6.classmaleextendshuman{7.@override8.第3页共7页publicvoidsleep{9.system.out.println("malesleep..");10.}11.}12.classfemaleextendshuman{13.@override14.publicvoidsleep{15.system.out.println("femalesleep..");16.}17.}18.注意这里的向上转型:animalb=newbird;//向上转型b.eat;此处将调用子类的eat方法。原因。b实际指向的是bird子类,故调用时会调用子类本身的方法。需要注意的是向上转型时b会遗失除与父类对象共有的其他方法。如本例中的fly方法不再为b所有。2,向上转型的好处。看上面的代码,publicstaticvoiddosleep(humanh){h.sleep;}这里以父类为参数,调有时用子类作为参数,就是利用了向上转型。这样使代码变得简洁。不然的话,如果dosleep以子类对象为参数,则有多少个子类就需要写多少个函数。这也体现了java的抽象编程思想。二、向下转型。第4页共7页与向上转型相反,即是把父类对象转为子类对象。看下面代码:packagecom.wensefu.other1;1.publicclassgirl{2.publicvoidsmile{3.system.out.println("girlsmile...");4.}5.}6.classmmgirlextendsgirl{7.8.@override9.publicvoidsmile{10.11.system.out.println("mmirlsmilesoundssweet...");12.}13.publicvoidc{14.system.out.println("mmirlc...");15.}16.}17.classmain{18.19.publicstaticvoidmain(stringargs){第5页共7页20.21.girlg1=newmmgirl;//向上转型22.g1.smile;23.24.mmgirlmmg=(mmgirl)g1;//向下转型,编译和运行皆不会出错25.mmg.smile;26.mmg.c;27.28.29.girlg2=newgirl;30.//mmgirlmmg1=(mmgirl)g2;//不安全的向下转型,编译无错但会运行会出错31.//mmg1.smile;32.//mmg1.c;33.34.if(g2instanceofmmgirl){35.mmgirlmmg1=(mmgirl)g2;36.mmg1.smile;37.mmg1.c;第6页共7页38.}39.40.}41.}girlg1=newmmgirl;//向上转型g1.smile;mmgirlmmg=(mmgirl)g1;//向下转型,编译和运行皆不会出错这里的向下转型是安全的。因为g1指向的是子类对象。而girlg2=newgirl;mmgirlmmg1=(mmgirl)g2;//不安全的向下转型,编译无错但会运行会出错运行出错:exceptioninthread"main"java.lang.classcastexception:com.wensefu.other1.girlatcom.wensefu.other1.main.main(girl.java:36)如代码所示,可以通过instanceof来防止出现异常。第7页共7页