首頁 > Java > java教程 > Java中的物件的類型轉換介紹(附程式碼)

Java中的物件的類型轉換介紹(附程式碼)

不言
發布: 2018-10-15 15:27:33
轉載
2998 人瀏覽過

這篇文章帶給大家的內容是關於Java中的物件的類型轉換介紹(附程式碼),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

向轉型:子類別物件轉為父類,父類別可以是介面。公式:Father f = new Son();Father是父類別或接口,son是子類別。

向下轉型:父類別物件轉為子類別。公式:Son s = (Son)f;

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

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中的物件的類型轉換介紹(附程式碼)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:cnblogs.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板