作者LaPass (LaPass)
看板java
標題Re: [問題] 多型的修飾詞?
時間Fri Dec 27 11:47:19 2013
: 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