3 回答

TA貢獻(xiàn)1812條經(jīng)驗(yàn) 獲得超5個(gè)贊
多態(tài),這個(gè)涉及到 java 引用變量的 編譯時(shí)類型(申明變量時(shí)的類型) 和 運(yùn)行時(shí)類型(變量所引用的實(shí)際對象的類型)
Animal dog1 = new Dog();
關(guān)于編譯時(shí)類型:
dog1 被申明為 Animal,在編譯時(shí)也就是書寫代碼的時(shí)候,dog1 只能夠調(diào)用 Animal 中申明(不一定要實(shí)現(xiàn))的方法。
關(guān)于運(yùn)行時(shí)類型:
dog1 實(shí)際引用的對象類型為 Dog。如果 Dog 類中實(shí)現(xiàn)了或者重載了 Animal 中的方法,那么在運(yùn)行時(shí),dog1 實(shí)際調(diào)用的方法是 Dog 類中的方法。
dog2 兩種類型一致,不需要糾結(jié)~,寫的時(shí)候和運(yùn)行的時(shí)候是一致的。

TA貢獻(xiàn)1869條經(jīng)驗(yàn) 獲得超4個(gè)贊
設(shè)計(jì)模式中有一個(gè)原則,就是針對接口編程或者叫針對超類型編程。程序針對超類編程,執(zhí)行時(shí)會(huì)根據(jù)實(shí)際類型執(zhí)行到真正的行為,不要綁死在具體的類型上。
public class Main {
public static void main(String[] args) throws UnsupportedEncodingException {
Dog dog = new Dog();//針對實(shí)現(xiàn)編程
Animal animal = new Dog();//針對接口/超類編程
Animal animal2 = getAnimal(1);//我不管對象是狗,還是貓,我只要知道它有doSomething()的行為,利用Animal進(jìn)行多態(tài)調(diào)用。
animal2.doSomething();
}
public static Animal getAnimal(int type){
if(1 == type){
return new Dog();
}else if(2 == type){
return new Cat();
}else{
throw new IllegalArgumentException("非法類型");
}
}
}
class Animal{
public void doSomething(){
}
}
class Cat extends Animal{
@Override
public void doSomething() {
System.out.println("cat do!");
}
}
class Dog extends Animal{
@Override
public void doSomething() {
System.out.println("dog do!");
}
}
添加回答
舉報(bào)