看板 java 關於我們 聯絡資訊
: 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
broodstare:謝謝大大!! 我想請問一下,所以執行到" Base2 b "時, 12/27 23:09
broodstare:b到底是Base2 object? 還是Derived2 object? 12/27 23:12
broodstare:(我自己認為應該是Base2....不過有點混亂) 12/27 23:20
答案是:都是 但是編譯器會把他當成Base2來看待 如果你要編譯器把他當成Derived2,妳必須要作轉型 Derived2 d=(Derived2)b; 這樣一來,編譯器就會把d當成是Derived2來看待 ※ 編輯: LaPass 來自: 114.41.98.243 (12/28 01:16)
bleed1979:這明明就是visibility的問題,那來private不能執行? 12/29 18:53
LaPass:妳是說用反射去執行嗎? 當然可以,不過在這裡這樣說比較好 12/30 11:43
LaPass:懂。 12/30 11:45