溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何在Java中對(duì)對(duì)象進(jìn)行轉(zhuǎn)型

發(fā)布時(shí)間:2021-02-23 15:06:02 來(lái)源:億速云 閱讀:144 作者:戴恩恩 欄目:編程語(yǔ)言

這篇文章主要為大家詳細(xì)介紹了如何在Java中對(duì)對(duì)象進(jìn)行轉(zhuǎn)型,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,發(fā)現(xiàn)的小伙伴們可以參考一下:

Java是什么

Java是一門面向?qū)ο缶幊陶Z(yǔ)言,可以編寫桌面應(yīng)用程序、Web應(yīng)用程序、分布式系統(tǒng)和嵌入式系統(tǒng)應(yīng)用程序。

向上轉(zhuǎn)型:子類對(duì)象轉(zhuǎn)為父類,父類可以是接口。公式:Father f = new Son();Father是父類或接口,son是子類。

向下轉(zhuǎn)型:父類對(duì)象轉(zhuǎn)為子類。公式:Son s = (Son)f;

如何在Java中對(duì)對(duì)象進(jìn)行轉(zhuǎn)型

我們將形參設(shè)為父類Animal類型,當(dāng)執(zhí)行test.f(c)時(shí),內(nèi)存情況如下圖:

如何在Java中對(duì)對(duì)象進(jìn)行轉(zhuǎn)型

c作為Cat類型傳入,Animal a作為形參,相當(dāng)于執(zhí)行了Animal a = new Cat(),這時(shí)a和c同時(shí)指向Cat對(duì)象,但此時(shí)a不能訪問Cat類擴(kuò)展的數(shù)據(jù)成員,所以再將a強(qiáng)轉(zhuǎn)成Cat類型即可。如果不存在這樣的轉(zhuǎn)型機(jī)制,則針對(duì)貓和狗我們還要分別寫兩個(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)要重寫,即子類對(duì)父類中某些方法進(jìn)行重新定義

(3)要向上轉(zhuǎn)型,用父類引用指向子類對(duì)象。

下面來(lái)看一個(gè)例子:

class Animal { private String name; /**
  * 在Animal類自定義的構(gòu)造方法
  * @param name  */
 Animal(String name) {  this.name = name;
 } /**
  * 在Animal類里面自定義一個(gè)方法enjoy  */
 public void enjoy() {
  System.out.println("動(dòng)物的叫聲……");
 }
}class Cat extends Animal { private String eyesColor; /**
  * 在子類Cat里面定義Cat類的構(gòu)造方法
  * @param n
  * @param c  */
 Cat(String n, String c) {  /**
   * 在構(gòu)造方法的實(shí)現(xiàn)里面首先使用super調(diào)用父類Animal的構(gòu)造方法Animal(String name)。
   * 把子類對(duì)象里面的父類對(duì)象先造出來(lái)。   */
  super(n);
  eyesColor = c;
 } /**
  * 子類Cat對(duì)從父類Animal繼承下來(lái)的enjoy方法不滿意,在這里重寫了enjoy方法。  */
 public void enjoy() {
  System.out.println("我養(yǎng)的貓高興地叫了一聲……");
 }
}/**
 * 子類Dog從父類Animal繼承下來(lái),Dog類擁有了Animal類所有的屬性和方法。
 * @author gacl
 * */class Dog extends Animal { /**
  * 在子類Dog里面定義自己的私有成員變量  */
 private String furColor; /**
  * 在子類Dog里面定義Dog類的構(gòu)造方法
  * @param n
  * @param c  */
 Dog(String n, String c) {  /**
   * 在構(gòu)造方法的實(shí)現(xiàn)里面首先使用super調(diào)用父類Animal的構(gòu)造方法Animal(String name)。
   * 把子類對(duì)象里面的父類對(duì)象先造出來(lái)。   */
  super(n);
  furColor = c;
 } /**
  * 子類Dog對(duì)從父類Animal繼承下來(lái)的enjoy方法不滿意,在這里重寫了enjoy方法。  */
 public void enjoy() {
  System.out.println("我養(yǎng)的狗高興地叫了一聲……");
 }
}/**
 * 子類Bird從父類Animal繼承下來(lái),Bird類擁有Animal類所有的屬性和方法
 * @author gacl
 * */class Bird extends Animal { /**
  * 在子類Bird里面定義Bird類的構(gòu)造方法  */
 Bird() {  /**
   * 在構(gòu)造方法的實(shí)現(xiàn)里面首先使用super調(diào)用父類Animal的構(gòu)造方法Animal(String name)。
   * 把子類對(duì)象里面的父類對(duì)象先造出來(lái)。   */
  super("bird");
 } /**
  * 子類Bird對(duì)從父類Animal繼承下來(lái)的enjoy方法不滿意,在這里重寫了enjoy方法。  */
 public void enjoy() {
  System.out.println("我養(yǎng)的鳥高興地叫了一聲……");
 }
}/**
 * 定義一個(gè)類Lady(女士)
 * @author gacl
 * */class Lady { /**
  * 定義Lady類的私有成員變量name和pet  */
 private String name; private Animal pet; /**
  * 在Lady類里面定義自己的構(gòu)造方法Lady(),
  * 這個(gè)構(gòu)造方法有兩個(gè)參數(shù),分別為String類型的name和Animal類型的pet,
  * 這里的第二個(gè)參數(shù)設(shè)置成Animal類型可以給我們的程序帶來(lái)最大的靈活性,
  * 因?yàn)樽鳛轲B(yǎng)寵物來(lái)說(shuō),可以養(yǎng)貓,養(yǎng)狗,養(yǎng)鳥,只要是你喜歡的都可以養(yǎng),
  * 因此把它設(shè)置為父類對(duì)象的引用最為靈活。
  * 因?yàn)檫@個(gè)Animal類型的參數(shù)是父類對(duì)象的引用類型,因此當(dāng)我們傳參數(shù)的時(shí)候,
  * 可以把這個(gè)父類的子類對(duì)象傳過(guò)去,即傳Dog、Cat和Bird等都可以。
  * @param name
  * @param pet  */
 Lady(String name, Animal pet) {  this.name = name;  this.pet = pet;
 } /**
  * 在Lady類里面自定義一個(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è)父類對(duì)象Animal。   */
  Cat c = new Cat("Catname", "blue");  /**
   * 在堆內(nèi)存里面new了一只黑狗對(duì)象出來(lái),這個(gè)黑狗對(duì)象里面包含有一個(gè)父類對(duì)象Animal。   */
  Dog d = new Dog("Dogname", "black");  /**
   * 在堆內(nèi)存里面new了一只小鳥對(duì)象出來(lái),這個(gè)小鳥對(duì)象里面包含有一個(gè)父類對(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類的構(gòu)造方法時(shí),傳遞過(guò)來(lái)的c,d,b是當(dāng)成Animal來(lái)傳遞的,
   * 因此使用c,d,b這三個(gè)引用對(duì)象只能訪問父類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)的類繼承Animal,完全不用動(dòng)任何一處代碼,因?yàn)檫@里運(yùn)用了面向?qū)ο笞詈诵牡臇|西——多態(tài)。與之前的例子不同,雖然我們一直強(qiáng)調(diào)當(dāng)用父類的引用指向子類對(duì)象,父類無(wú)法訪問子類自己的成員,但是方法與數(shù)據(jù)成員不同,具體調(diào)哪一個(gè)方法是等到運(yùn)行時(shí)決定的,new出了什么對(duì)象就調(diào)用相應(yīng)對(duì)象的方法,取決于實(shí)際new出的對(duì)象而不是指向?qū)ο蟮囊?,所以?dāng)傳入不同動(dòng)物類型,mypetEnjoy()就會(huì)去執(zhí)行不同的方法

如何在Java中對(duì)對(duì)象進(jìn)行轉(zhuǎn)型

以上就是億速云小編為大家收集整理的如何在Java中對(duì)對(duì)象進(jìn)行轉(zhuǎn)型,如何覺得億速云網(wǎng)站的內(nèi)容還不錯(cuò),歡迎將億速云網(wǎng)站推薦給身邊好友。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI