在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Java/ 構(gòu)造器名和類名不一致?

構(gòu)造器名和類名不一致?

請問為什么在petMap.put那里,Pet類的對象可以用new Cat(),new Dog()構(gòu)造,這跟構(gòu)造器有什么不同?涉及到了具體哪塊知識?并且為什么在輸出時,Cat Dog也能出現(xiàn)在輸出結(jié)果里?懇請點撥!


import typeinfo.pets.*
import java.util.*
import static net.mindview.util.Print.*

public class PetMap {
    public static void main(String[] args) {
        Map<String, Pet> petMap = new HashMap<String, Pet>();
        petMap.put("My Cat", new Cat("Molly"));
        petMap.put("My Dog", new Dog("Ginger"));
        petMap.put("My Hamster", new Hamster("Bosco"));
        print(petMap);
        Pet dog = petMap.get("My Dog");
        print(dog);
    }
} 

/* Output:
{My Cat=Cat Molly, My Hamster=Hamster Bosco, My Dog=Dog Ginger}
Dog Ginger
回答
編輯回答
短嘆

你說的應(yīng)該是繼承吧?定義一個接口,然后用類去實現(xiàn),就可以實現(xiàn)你說的構(gòu)造了(父類引用指向子類)。是java三大特種之一的多態(tài)里面的內(nèi)容。
例子:
接口如下:

interface Pet {
    void eat();
}

實現(xiàn)類如下:

class Cat implements Pet{
    @Override[override] 
    public void eat() {
        System.out.print("貓吃魚");
    }
}
class Dog implements Pet{
    @Override[override] 
    public void eat() {
        System.out.print("狗吃骨頭")
    }
}

測試類代碼如下:

class Test {
    public static void main(String[] args) {
        Pet a = new Cat();
        Pet b = new Dog();
        a.eat();
        b.eat();
    }
}
2017年7月2日 04:00
編輯回答
近義詞

很簡單,繼承。
‘Pet類的對象可以用new Cat(),new Dog()構(gòu)造’,題主這句話我看著總覺得有點別扭;從貼的代碼來看 ,Cat和Dog這兩個類肯定是繼承或者了Pet類的,而這句話用白話來說就是貓類和狗類都是寵物這個基類的子類,而所有能用基類對象的地方都應(yīng)該能用子類對象,這是java的語言特性,也好理解,因為所有的貓和狗都是寵物,但不是所有的寵物都是貓和狗;
再說‘并且為什么在輸出時,Cat Dog也能出現(xiàn)在輸出結(jié)果里’,想必題主是在Cat和Dog類的構(gòu)造器里加了輸出的,這里要說的是父類和子類的構(gòu)造器調(diào)用順序,當Pet dog = new Dog("xxx")這句話執(zhí)行的時候,會先去調(diào)用父類的構(gòu)造器(如果有的話),然后會調(diào)用子類的構(gòu)造器,這個時候,Dog的類構(gòu)造器中加的print就會執(zhí)行,并且是不同的子類都會有不同的輸出。
相對來說很基礎(chǔ)的一個問題,說到底最根本的就是父類子類的替換,具體你可以看看里氏代換原則。

2017年6月28日 08:34