關於java繼承的一道題,你能答對嗎?

2021-07-09 11:39:04 字數 1168 閱讀 2673

題目:寫出下面程式的輸出:

class

a public string show(a obj)

} class

bextends

a public string show(a obj)

}class

cextends

b{}

class

dextends

b{}public class

test

}

***********************************分割線===

*************************===

答案:

a

anda

aandaa

and d

b and

ab andaa

and d

b and b

b and b

aand d

到這裡,肯定有人和上面的答案對不上了,特別是第4、5個輸出,為啥輸出是這樣的?

第4個輸出:首先,定義是:a a2 = new b();這裡定義的是乙個a類,然後初始化的時候是初始化a的乙個子類b,然後引數是傳入乙個b,所以很多人這裡直接就認為執行的是b中的show(b obj),於是得到輸出:b and b

這種理解是完全錯誤的,首先你定義的是乙個a,所以在a中是完全找不到show(b obj)方法的。這裡我們傳入的是乙個b為引數,b是繼承於a,所以會執行a中的show(a obj),但是初始化的是乙個a的子類b,b中也有乙個show(a obj),所以這裡會直接執行子類b中的show(a obj),得到輸出:b and a

後面的第5個輸出也是同理的。

關於繼承,一點理解:

1、如果定義的是子類,而且初始化的也是這個子類,例如上面的 b b = new b();如果子類中有重寫這個方法,那麼執行此方法的時候,則優先執行子類的方法,如果子類沒有重寫這個方法,才會執行父類的方法。

2、如果定義的是父類,初始化的時候卻是它的乙個子類,例如上面的a a2 = new b();首先你執行的肯定必須是a中有的方法才行,然後會到b中找是否有重寫這個方法,如果有重寫,則執行的是子類的那個方法。

3、在方法中定義傳入引數為父類,但是你卻可以傳入它的任意乙個子類,傳入子類引數等同於定義的父類。

一道java基礎題

題目 要求隨機產生20個0 100之間的數字,並對這20個數字以10的倍數進行歸類,然後列印。如 10 7 9 5 30 22 25 29 50 49 45 public static void main string args 隨機產生20個0 100之間的數字,並放入list中 return p...

一道JAVA題的解決

1 class person 3 public void printvalue int i 4 5 public class teacher extends person 7 public void printvalue int i 8 public static void main string ...

一道題跟java多型和繼承相關

class base public void tellname public void printname public class dervied extends base public void tellname public void printname public static void ...