Discussion:
[問題] 有關多型的問題
(时间太久无法回复)
n***@ptt.cc
2007-05-20 05:02:12 UTC
Permalink
我在書上看到,

假設Cat與Dog都是繼承在Animal底下,

則我用Animal產生的物件可以直接等於Cat所產生的物件,

因為子類別的物件一定會是"父類別的物件"的一種,

所以可以用:

Anamal father = new Anamal();

Cat son = new Cat();

則可以 father = son ;

但反之則不成立,

也就是說如果是 son = father 會出現編譯錯誤,

但我在書上看到只要父類別是宣告成抽象類別,

也就是 abstract Animal 的話,

是不是就可以讓 son = father 成立而不會出現編譯錯誤,

還是說跟抽象類別也沒有關係,

但是我在書上的確有看到將 子類別物件 = 父類別物件 的例子,

那是在什麼時候,

或是什麼條件下可以讓 子類別物件 = 父類別物件呢?

請高手幫忙一下嚕!

頭腦快打結了!

謝謝

--
 ███●/ Java中Int與Integer有什麼不一樣?
  電 /■ \ 師:那我們請小華來回答這個問題
 腦 /\ - 師:(筆掉)天啊!居然連這都不知道
 華:就是byte數不一樣ㄎㄎ 哈哈哈哈
 囧 \● 囧 ● ● ●
 ╓俊╖ ╓華╖ ╓國╖ ╓■╖ ╓■╖ ╓■╖

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.228.22.179
※ 編輯: naturalskyss 來自: 61.228.22.179 (05/20 13:07)
小安
2007-05-20 05:22:28 UTC
Permalink
※ 引述《naturalskyss ()》之銘言:
: 我在書上看到,
: 也就是說如果是 son = father 會出現編譯錯誤,
: 但我在書上看到只要父類別是宣告成抽象類別,
: 也就是 abstract Animal 的話,
: 是不是就可以讓 son = father 成立而不會出現編譯錯誤,
: 還是說跟抽象類別也沒有關係,

的確沒有關係
abstract class 的意思是說,
這個 class 不可以被實體化,
並且可以具有一個 abstract method,
留待繼承此 abstract class 的 class 去 implement

: 但是我在書上的確有看到將 子類別物件 = 父類別物件 的例子,
: 那是在什麼時候,
: 或是什麼條件下可以讓 子類別物件 = 父類別物件呢?

這樣寫的話...應該是不可能

除非是 Child child = (Child)parent;

多了一個強制轉型,這樣子編譯的確會過,

但如果 parent 所 reference 的物件其實不是 Child,
那麼在轉型的時候產生 Casting Exception (正確的名稱我忘了)

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.131.65.14
tsya
2007-05-20 05:32:22 UTC
Permalink
※ 引述《naturalskyss ()》之銘言:
: 我在書上看到,
: 假設Cat與Dog都是繼承在Animal底下,
: 則我用Animal產生的物件可以直接等於Cat所產生的物件,
: 因為子類別的物件一定會是"父類別的物件"的一種,
: 所以可以用:
: Anamal father = new Anamal();
: Cat son = new Cat();
: 則可以 father = son ;
: 但反之則不成立,
: 也就是說如果是 son = father 會出現編譯錯誤,
: 但我在書上看到只要父類別是宣告成抽象類別,
: 也就是 abstract Animal 的話,
: 是不是就可以讓 son = father 成立而不會出現編譯錯誤,
: 還是說跟抽象類別也沒有關係,
: 但是我在書上的確有看到將 子類別物件 = 父類別物件 的例子,

class Cat extends Animal{

}

class Dog extends Animal{

}

class Zoo{
public static void main(String[] args){
Dog d;
Cat c;
Animal a=new Dog();
d=(Dog)a; //OK
c=(Cat)a; //a是一隻狗 所以會ClassCastException
}
}

: 那是在什麼時候,
: 或是什麼條件下可以讓 子類別物件 = 父類別物件呢?
: 請高手幫忙一下嚕!
: 頭腦快打結了!
: 謝謝

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 202.132.132.7
月狼
2007-05-21 00:20:45 UTC
Permalink
※ 引述《tsya (tsya)》之銘言:
: class Cat extends Animal{
: }
: class Dog extends Animal{
: }
: class Zoo{
: public static void main(String[] args){
: Dog d;
: Cat c;
Animal a=new Dog(); //長相是父親,實體上是狗兒子
d=(Dog)a; //OK, 他只是長得像爸爸的狗兒子,還給他原本面貌 ok...
c=(Cat)a; //a是一隻狗,想要換成貓 所以會ClassCastException
: }
: }
我來幫忙註解一下....XD

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 222.250.36.208

继续阅读narkive:
Loading...