溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何在Java中對對象進行轉型

發布時間:2021-02-23 15:06:02 來源:億速云 閱讀:191 作者:戴恩恩 欄目:編程語言

這篇文章主要為大家詳細介紹了如何在Java中對對象進行轉型,文中示例代碼介紹的非常詳細,具有一定的參考價值,發現的小伙伴們可以參考一下:

Java是什么

Java是一門面向對象編程語言,可以編寫桌面應用程序、Web應用程序、分布式系統和嵌入式系統應用程序。

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

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

如何在Java中對對象進行轉型

我們將形參設為父類Animal類型,當執行test.f(c)時,內存情況如下圖:

如何在Java中對對象進行轉型

c作為Cat類型傳入,Animal a作為形參,相當于執行了Animal a = new Cat(),這時a和c同時指向Cat對象,但此時a不能訪問Cat類擴展的數據成員,所以再將a強轉成Cat類型即可。如果不存在這樣的轉型機制,則針對貓和狗我們還要分別寫兩個函數f(Cat c)和f(Dog d)。但其實上圖程序的可擴展性也不是最好的。我們還可以利用動態綁定(即多態)將擴展性進一步提升。多態機制的三個前提分別是:

(1)要有繼承

(2)要重寫,即子類對父類中某些方法進行重新定義

(3)要向上轉型,用父類引用指向子類對象。

下面來看一個例子:

class Animal { private String name; /**
  * 在Animal類自定義的構造方法
  * @param name  */
 Animal(String name) {  this.name = name;
 } /**
  * 在Animal類里面自定義一個方法enjoy  */
 public void enjoy() {
  System.out.println("動物的叫聲……");
 }
}class Cat extends Animal { private String eyesColor; /**
  * 在子類Cat里面定義Cat類的構造方法
  * @param n
  * @param c  */
 Cat(String n, String c) {  /**
   * 在構造方法的實現里面首先使用super調用父類Animal的構造方法Animal(String name)。
   * 把子類對象里面的父類對象先造出來。   */
  super(n);
  eyesColor = c;
 } /**
  * 子類Cat對從父類Animal繼承下來的enjoy方法不滿意,在這里重寫了enjoy方法。  */
 public void enjoy() {
  System.out.println("我養的貓高興地叫了一聲……");
 }
}/**
 * 子類Dog從父類Animal繼承下來,Dog類擁有了Animal類所有的屬性和方法。
 * @author gacl
 * */class Dog extends Animal { /**
  * 在子類Dog里面定義自己的私有成員變量  */
 private String furColor; /**
  * 在子類Dog里面定義Dog類的構造方法
  * @param n
  * @param c  */
 Dog(String n, String c) {  /**
   * 在構造方法的實現里面首先使用super調用父類Animal的構造方法Animal(String name)。
   * 把子類對象里面的父類對象先造出來。   */
  super(n);
  furColor = c;
 } /**
  * 子類Dog對從父類Animal繼承下來的enjoy方法不滿意,在這里重寫了enjoy方法。  */
 public void enjoy() {
  System.out.println("我養的狗高興地叫了一聲……");
 }
}/**
 * 子類Bird從父類Animal繼承下來,Bird類擁有Animal類所有的屬性和方法
 * @author gacl
 * */class Bird extends Animal { /**
  * 在子類Bird里面定義Bird類的構造方法  */
 Bird() {  /**
   * 在構造方法的實現里面首先使用super調用父類Animal的構造方法Animal(String name)。
   * 把子類對象里面的父類對象先造出來。   */
  super("bird");
 } /**
  * 子類Bird對從父類Animal繼承下來的enjoy方法不滿意,在這里重寫了enjoy方法。  */
 public void enjoy() {
  System.out.println("我養的鳥高興地叫了一聲……");
 }
}/**
 * 定義一個類Lady(女士)
 * @author gacl
 * */class Lady { /**
  * 定義Lady類的私有成員變量name和pet  */
 private String name; private Animal pet; /**
  * 在Lady類里面定義自己的構造方法Lady(),
  * 這個構造方法有兩個參數,分別為String類型的name和Animal類型的pet,
  * 這里的第二個參數設置成Animal類型可以給我們的程序帶來最大的靈活性,
  * 因為作為養寵物來說,可以養貓,養狗,養鳥,只要是你喜歡的都可以養,
  * 因此把它設置為父類對象的引用最為靈活。
  * 因為這個Animal類型的參數是父類對象的引用類型,因此當我們傳參數的時候,
  * 可以把這個父類的子類對象傳過去,即傳Dog、Cat和Bird等都可以。
  * @param name
  * @param pet  */
 Lady(String name, Animal pet) {  this.name = name;  this.pet = pet;
 } /**
  * 在Lady類里面自定義一個方法myPetEnjoy()
  * 方法體內是讓Lady對象養的寵物自己調用自己的enjoy()方法發出自己的叫聲。  */
 public void myPetEnjoy() {
  pet.enjoy();
 }
}public class Jerque { public static void main(String args[]) {  /**
   * 在堆內存里面new了一只藍貓對象出來,這個藍貓對象里面包含有一個父類對象Animal。   */
  Cat c = new Cat("Catname", "blue");  /**
   * 在堆內存里面new了一只黑狗對象出來,這個黑狗對象里面包含有一個父類對象Animal。   */
  Dog d = new Dog("Dogname", "black");  /**
   * 在堆內存里面new了一只小鳥對象出來,這個小鳥對象里面包含有一個父類對象Animal。   */
  Bird b = new Bird();  /**
   * 在堆內存里面new出來3個小姑娘,名字分別是l1,l2,l3。
 * l1養了一只寵物是c(Cat),l2養了一只寵物是d(Dog),l3養了一只寵物是b(Bird)。
   * 注意:調用Lady類的構造方法時,傳遞過來的c,d,b是當成Animal來傳遞的,
   * 因此使用c,d,b這三個引用對象只能訪問父類Animal里面的enjoy()方法。   */
  Lady l1 = new Lady("l1", c);
  Lady l2 = new Lady("l2", d);
  Lady l3 = new Lady("l3", b);  /**
   * 這三個小姑娘都調用myPetEnjoy()方法使自己養的寵物高興地叫起來。   */
  l1.myPetEnjoy();
  l2.myPetEnjoy();
  l3.myPetEnjoy();
 }
}

上面的例子中,我們發現,如果我們想要加入新的動物,只需定義相應的類繼承Animal,完全不用動任何一處代碼,因為這里運用了面向對象最核心的東西——多態。與之前的例子不同,雖然我們一直強調當用父類的引用指向子類對象,父類無法訪問子類自己的成員,但是方法與數據成員不同,具體調哪一個方法是等到運行時決定的,new出了什么對象就調用相應對象的方法,取決于實際new出的對象而不是指向對象的引用,所以當傳入不同動物類型,mypetEnjoy()就會去執行不同的方法

如何在Java中對對象進行轉型

以上就是億速云小編為大家收集整理的如何在Java中對對象進行轉型,如何覺得億速云網站的內容還不錯,歡迎將億速云網站推薦給身邊好友。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女