2014-09-05 85 views
0

Java的以下片段是否正確?在正面情況下,方法fie被重新定義(重寫)?它打印什麼?Java的以下片段是否正確?

class A { 
    int x = 4; 
    int fie (A p) { return p.x;} 
} 

class B extends A { 
    int y = 6; 
    int fie (B p) { return p.x + p.y;} 
} 

B b = new B(); 
A a = new A(); 
int zz = a.fie(a) +b.fie(a); //here,b.fie(a)---how is this working? 
System.out.println(zz); 

請幫我回答這個問題。我正在開發OOP繼承,但我仍然不明白爲什麼沒問題。我已經在Eclipse上測試過它,它工作正常。它打印出14.我想這裏沒有覆蓋。但是傳入參數爲ac(類型A)時,B類中的方法fie(B p) {...}如何訪問p.y

+2

乙延伸的,並具有兩個INT FIE(的p )和fie(B p)。所以多態性導致這個工作。你實際上並不是壓倒fie(A a),我想你是打算這樣做的。 – 2014-09-05 11:56:35

+3

此代碼打印8,而不是14.如果打印14,則不會運行您發佈的代碼。 'b.fie(a)'在類A中調用'int fie(A p)',這個類繼承了B類。 – nos 2014-09-05 11:58:03

+2

我想知道它爲什麼會打印14,它會打印8.同樣的B類方法不是重寫A類方法 – 2014-09-05 11:58:54

回答

0

該方法沒有被覆蓋,因爲這兩個方法有不同的參數。 fie的方法因此過載。

b.fie(a)將調用Aa.fie(b) 類中定義的方法也將調用類A b.fie(b)將調用B類中定義的方法中定義的方法,現在y被訪問。

A c = new B(); 
c.fie(b); 

還將調用A類中定義的方法(這是因爲外商投資企業超載,不重寫!)

+0

對不起,我不明白第三種情況。爲什麼c.fie(b)將調用在類A中定義的方法而不是在類B中定義的方法。c指向類B的實例對象。此外,傳入的參數是類型B. – HieuNguyen94 2014-09-05 15:18:32

+0

fie在A類和B類中都是完全不同的方法。他們只是分享相同的名字(這是超載)。 B不會覆蓋A的fie。 – 2014-09-07 12:04:30

0

在B類不重寫外商投資企業法,但超載。它使用了不同的方法簽名。所以B類有2個方法。一個接受類A和一個接受類B.

0

我期望打印8,而不是14

乙延伸的,並且繼承INT FIE(A P)。 另外,B定義了int fie(B p)

這兩個方法不會相互碰撞,因爲它們是不同的方法。兩者具有相同的名稱,但簽名不同(一個接受A,另一個接受B作爲參數)。這是方法重載不覆蓋的一個例子。因此,當你調用b.fie(a)時,作爲A的一個類型,它調用從A繼承的方法(B有另一個同名的方法,但它是一個不同的方法,因爲簽名是不同)。

所以,a.fie的(a)+ b.fie的(a)將調用兩次通過A中定義的方法,並且這將增加4 + 4