2012-05-11 34 views
0

我想知道在爲子類創建一個對象但分配類A ref而不是分配類B ref之間的優勢。這是在第1行顯示,2號線下面的代碼在Java編程中的對象引用

class A 
    { 
     int b=10; 
    } 
    class B extends A 
    { 
     int b=12; 

     } 
    class Test 
    { 
     public static void main(String[] args) 
     { 
       A a=new B(); //line1 
       //B a=new B();//line2 
      System.our.println(a.b); 
     } 
    } 
+0

http://stackoverflow.com/questions/1970806/coding-to-interfaces – assylias

+0

如果您取消註釋第二行,則會出現語法錯誤:您無法聲明兩次變量。 –

+0

@RamyAlZuhouri我認爲這個問題是爲什麼比line2更喜歡line1,所以line1或line2都被註釋掉了。 – assylias

回答

0

在你簡短的例子有沒有真正的優勢,。 但總的來說,你的問題是關於什麼多態性是好的?

答案可以追溯到面向對象方法的需要。 簡而言之,它使您能夠從使用中封裝和抽象實現,並且可以幫助您在將來替換實現而無需更改使用情況。

欲瞭解更多詳情,請參見http://en.wikipedia.org/wiki/Polymorphism_(computer_science

1

如果你不會需要特定於B任何方法,換句話說,你嚴格打算使用它作爲一個A,這是一個優勢,可讀性這樣說吧。

但最主要的優勢來自於光當您使用在方法聲明中的一般類型:

public String resolveName(A a) { ... } 

如果使用B這裏沒有很好的理由,那麼你會不必要地削弱你的方法。它可以用於任何A,但它只適用於B

0

在這個例子中,我不認爲你可以談論一個優點(或劣勢),因爲你的兩行代碼每個都做了非常不同的事情。

如果變量a的類型是A,那麼a.b指的是值爲10的字段b

但是,如果你改變aB的類型,然後a.b指的是一個完全不同的領域,裏面B聲明的一個,與價值12

如果改爲b是一種方法,則B中聲明的方法將「覆蓋」A中聲明的方法,這是一種非常不同的情況。例如

class A 
{ 
    public int b() { return 10; }; 
} 
class B extends A 
{ 
    public int b() { return 12; } 
} 

,並且調用代碼如下:

A a=new B(); //line1 
//B a=new B();//line2 
System.our.println(a.b()); 

也就是我們所說的方法b得到的返回值。現在對a的類型是A還是B的行爲沒有任何影響。重要的是a引用的對象類型,它始終爲B,因此始終具有在B中定義的行爲,因此無論如何它都將打印12

這樣做的好處是,你可以有一個對象集合(例如各種車輛),它們可以是汽車,船隻,火車等的混合物。每個都有自己的start方法實現,所以你可以用同樣的方法對待它們。

儘管通常在interface而不是class中定義此類方法更爲明確。 start沒有通用的方法,所以沒有理由有一個無意義的實現start的基類。相反,您只需使用一個接口來聲明方法的「形狀」,而不必給予任何實現。