Re: [問題] 多型的修飾詞?

看板java作者 (LaPass)時間10年前 (2013/12/27 11:47), 編輯推噓3(303)
留言6則, 3人參與, 最新討論串2/5 (看更多)
: class Base2{ : private void foo(){ : System.out.println("Base2"); : } : } : class Derived2 extends Base2{ : public void foo(){ : System.out.println("Derived2"); : } : } : public class Practice { : static void basefoo(Base2 b){ : b.foo();● : } : static void derivefoo(Derived2 d){ : d.foo(); : } : public static void main(String[] args) { : basefoo(new Derived2()); : derivefoo(new Derived2()); : } : } : ====================================================================== : 我想請問的觀念是: : 在main裡,我將new Derived2()指派給了Base2 b,雖然原先class Base2裡的method : foo 是設為private,但就多型來說,我應該也把Drived2的public method foo給了b : ,理當b.foo()應該是可以執行的吧? : (ps. 紅色的部份就是不能執行) : 謝謝! static void basefoo(Base2 b){ b.foo();● } 這個好像是叫做動態語言或是靜態語言的差異吧? 總之在JAVA中的運作邏輯是這樣的 JAVA編譯器: 嗯,有個Base2,我要去執行它的foo方法 裡面的真實型別是什麼我不管,反正他是Base2就是了 嗯,Base2的foo法是private,所以我不能執行他 (報錯) static void basefoo(Base2 b){ b.foo();● } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 122.117.36.2

12/27 23:09, , 1F
謝謝大大!! 我想請問一下,所以執行到" Base2 b "時,
12/27 23:09, 1F

12/27 23:12, , 2F
b到底是Base2 object? 還是Derived2 object?
12/27 23:12, 2F

12/27 23:20, , 3F
(我自己認為應該是Base2....不過有點混亂)
12/27 23:20, 3F
答案是:都是 但是編譯器會把他當成Base2來看待 如果你要編譯器把他當成Derived2,妳必須要作轉型 Derived2 d=(Derived2)b; 這樣一來,編譯器就會把d當成是Derived2來看待 ※ 編輯: LaPass 來自: 114.41.98.243 (12/28 01:16)

12/29 18:53, , 4F
這明明就是visibility的問題,那來private不能執行?
12/29 18:53, 4F

12/30 11:43, , 5F
妳是說用反射去執行嗎? 當然可以,不過在這裡這樣說比較好
12/30 11:43, 5F

12/30 11:45, , 6F
懂。
12/30 11:45, 6F
文章代碼(AID): #1IlFXAx- (java)
文章代碼(AID): #1IlFXAx- (java)