java对象间的转型,详细讲述Java中的对象转型
向上轉(zhuǎn)型:子類(lèi)對(duì)象轉(zhuǎn)為父類(lèi),父類(lèi)可以是接口。公式:Father f = new Son();Father是父類(lèi)或接口,son是子類(lèi)。
向下轉(zhuǎn)型:父類(lèi)對(duì)象轉(zhuǎn)為子類(lèi)。公式:Son s = (Son)f;
我們將形參設(shè)為父類(lèi)Animal類(lèi)型,當(dāng)執(zhí)行test.f(c)時(shí),內(nèi)存情況如下圖:
c作為Cat類(lèi)型傳入,Animal a作為形參,相當(dāng)于執(zhí)行了Animal a = new Cat(),這時(shí)a和c同時(shí)指向Cat對(duì)象,但此時(shí)a不能訪問(wèn)Cat類(lèi)擴(kuò)展的數(shù)據(jù)成員,所以再將a強(qiáng)轉(zhuǎn)成Cat類(lèi)型即可。如果不存在這樣的轉(zhuǎn)型機(jī)制,則針對(duì)貓和狗我們還要分別寫(xiě)兩個(gè)函數(shù)f(Cat c)和f(Dog d)。但其實(shí)上圖程序的可擴(kuò)展性也不是最好的。我們還可以利用動(dòng)態(tài)綁定(即多態(tài))將擴(kuò)展性進(jìn)一步提升。多態(tài)機(jī)制的三個(gè)前提分別是:
(1)要有繼承
(2)要重寫(xiě),即子類(lèi)對(duì)父類(lèi)中某些方法進(jìn)行重新定義
(3)要向上轉(zhuǎn)型,用父類(lèi)引用指向子類(lèi)對(duì)象。
下面來(lái)看一個(gè)例子:
class Animal { private String name; /**
* 在Animal類(lèi)自定義的構(gòu)造方法
* @param name */
Animal(String name) { this.name = name;
} /**
* 在Animal類(lèi)里面自定義一個(gè)方法enjoy */
public void enjoy() {
System.out.println("動(dòng)物的叫聲……");
}
}class Cat extends Animal { private String eyesColor; /**
* 在子類(lèi)Cat里面定義Cat類(lèi)的構(gòu)造方法
* @param n
* @param c */
Cat(String n, String c) { /**
* 在構(gòu)造方法的實(shí)現(xiàn)里面首先使用super調(diào)用父類(lèi)Animal的構(gòu)造方法Animal(String name)。
* 把子類(lèi)對(duì)象里面的父類(lèi)對(duì)象先造出來(lái)。 */
super(n);
eyesColor = c;
} /**
* 子類(lèi)Cat對(duì)從父類(lèi)Animal繼承下來(lái)的enjoy方法不滿意,在這里重寫(xiě)了enjoy方法。 */
public void enjoy() {
System.out.println("我養(yǎng)的貓高興地叫了一聲……");
}
}/**
* 子類(lèi)Dog從父類(lèi)Animal繼承下來(lái),Dog類(lèi)擁有了Animal類(lèi)所有的屬性和方法。
* @author gacl
* */class Dog extends Animal { /**
* 在子類(lèi)Dog里面定義自己的私有成員變量 */
private String furColor; /**
* 在子類(lèi)Dog里面定義Dog類(lèi)的構(gòu)造方法
* @param n
* @param c */
Dog(String n, String c) { /**
* 在構(gòu)造方法的實(shí)現(xiàn)里面首先使用super調(diào)用父類(lèi)Animal的構(gòu)造方法Animal(String name)。
* 把子類(lèi)對(duì)象里面的父類(lèi)對(duì)象先造出來(lái)。 */
super(n);
furColor = c;
} /**
* 子類(lèi)Dog對(duì)從父類(lèi)Animal繼承下來(lái)的enjoy方法不滿意,在這里重寫(xiě)了enjoy方法。 */
public void enjoy() {
System.out.println("我養(yǎng)的狗高興地叫了一聲……");
}
}/**
* 子類(lèi)Bird從父類(lèi)Animal繼承下來(lái),Bird類(lèi)擁有Animal類(lèi)所有的屬性和方法
* @author gacl
* */class Bird extends Animal { /**
* 在子類(lèi)Bird里面定義Bird類(lèi)的構(gòu)造方法 */
Bird() { /**
* 在構(gòu)造方法的實(shí)現(xiàn)里面首先使用super調(diào)用父類(lèi)Animal的構(gòu)造方法Animal(String name)。
* 把子類(lèi)對(duì)象里面的父類(lèi)對(duì)象先造出來(lái)。 */
super("bird");
} /**
* 子類(lèi)Bird對(duì)從父類(lèi)Animal繼承下來(lái)的enjoy方法不滿意,在這里重寫(xiě)了enjoy方法。 */
public void enjoy() {
System.out.println("我養(yǎng)的鳥(niǎo)高興地叫了一聲……");
}
}/**
* 定義一個(gè)類(lèi)Lady(女士)
* @author gacl
* */class Lady { /**
* 定義Lady類(lèi)的私有成員變量name和pet */
private String name; private Animal pet; /**
* 在Lady類(lèi)里面定義自己的構(gòu)造方法Lady(),
* 這個(gè)構(gòu)造方法有兩個(gè)參數(shù),分別為String類(lèi)型的name和Animal類(lèi)型的pet,
* 這里的第二個(gè)參數(shù)設(shè)置成Animal類(lèi)型可以給我們的程序帶來(lái)最大的靈活性,
* 因?yàn)樽鳛轲B(yǎng)寵物來(lái)說(shuō),可以養(yǎng)貓,養(yǎng)狗,養(yǎng)鳥(niǎo),只要是你喜歡的都可以養(yǎng),
* 因此把它設(shè)置為父類(lèi)對(duì)象的引用最為靈活。
* 因?yàn)檫@個(gè)Animal類(lèi)型的參數(shù)是父類(lèi)對(duì)象的引用類(lèi)型,因此當(dāng)我們傳參數(shù)的時(shí)候,
* 可以把這個(gè)父類(lèi)的子類(lèi)對(duì)象傳過(guò)去,即傳Dog、Cat和Bird等都可以。
* @param name
* @param pet */
Lady(String name, Animal pet) { this.name = name; this.pet = pet;
} /**
* 在Lady類(lèi)里面自定義一個(gè)方法myPetEnjoy()
* 方法體內(nèi)是讓Lady對(duì)象養(yǎng)的寵物自己調(diào)用自己的enjoy()方法發(fā)出自己的叫聲。 */
public void myPetEnjoy() {
pet.enjoy();
}
}public class Jerque { public static void main(String args[]) { /**
* 在堆內(nèi)存里面new了一只藍(lán)貓對(duì)象出來(lái),這個(gè)藍(lán)貓對(duì)象里面包含有一個(gè)父類(lèi)對(duì)象Animal。 */
Cat c = new Cat("Catname", "blue"); /**
* 在堆內(nèi)存里面new了一只黑狗對(duì)象出來(lái),這個(gè)黑狗對(duì)象里面包含有一個(gè)父類(lèi)對(duì)象Animal。 */
Dog d = new Dog("Dogname", "black"); /**
* 在堆內(nèi)存里面new了一只小鳥(niǎo)對(duì)象出來(lái),這個(gè)小鳥(niǎo)對(duì)象里面包含有一個(gè)父類(lèi)對(duì)象Animal。 */
Bird b = new Bird(); /**
* 在堆內(nèi)存里面new出來(lái)3個(gè)小姑娘,名字分別是l1,l2,l3。
* l1養(yǎng)了一只寵物是c(Cat),l2養(yǎng)了一只寵物是d(Dog),l3養(yǎng)了一只寵物是b(Bird)。
* 注意:調(diào)用Lady類(lèi)的構(gòu)造方法時(shí),傳遞過(guò)來(lái)的c,d,b是當(dāng)成Animal來(lái)傳遞的,
* 因此使用c,d,b這三個(gè)引用對(duì)象只能訪問(wèn)父類(lèi)Animal里面的enjoy()方法。 */
Lady l1 = new Lady("l1", c);
Lady l2 = new Lady("l2", d);
Lady l3 = new Lady("l3", b); /**
* 這三個(gè)小姑娘都調(diào)用myPetEnjoy()方法使自己養(yǎng)的寵物高興地叫起來(lái)。 */
l1.myPetEnjoy();
l2.myPetEnjoy();
l3.myPetEnjoy();
}
}
上面的例子中,我們發(fā)現(xiàn),如果我們想要加入新的動(dòng)物,只需定義相應(yīng)的類(lèi)繼承Animal,完全不用動(dòng)任何一處代碼,因?yàn)檫@里運(yùn)用了面向?qū)ο笞詈诵牡臇|西——多態(tài)。與之前的例子不同,雖然我們一直強(qiáng)調(diào)當(dāng)用父類(lèi)的引用指向子類(lèi)對(duì)象,父類(lèi)無(wú)法訪問(wèn)子類(lèi)自己的成員,但是方法與數(shù)據(jù)成員不同,具體調(diào)哪一個(gè)方法是等到運(yùn)行時(shí)決定的,new出了什么對(duì)象就調(diào)用相應(yīng)對(duì)象的方法,取決于實(shí)際new出的對(duì)象而不是指向?qū)ο蟮囊?#xff0c;所以當(dāng)傳入不同動(dòng)物類(lèi)型,mypetEnjoy()就會(huì)去執(zhí)行不同的方法
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的java对象间的转型,详细讲述Java中的对象转型的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 无房贷车贷,在银行存200万,存款利率4
- 下一篇: 已经确定,四大一线城市要出新变化了?上半