最近面試了一些應聘者,錯誤率最高的就是這道Java基礎題了,大家一起看看吧。
題目是這樣設計的:
- 父類有一個方法,子類重寫了該方法;那麼使用多態調用該方法時,調用的是父類的還是子類的?
- 父類有一個屬性,子類也定義了這個屬性;那麼使用多態調用該屬性時,調用的是父類的還是子類的?
先看第一個,如下
public class Father {
public void method(){
System.out.println("father...");
}
}
//子類重寫了父類的method()
class Son extends Father{
public void method(){
System.out.println("son...");
}
}
class Test{
public static void main(String[] args) {
Father x = new Son();
x.method() ;
}
}
運行結果:son…
(這一問 沒什麼大問題,大部分人都能答對。考點就是最基本的:方法重寫,即子類重寫了父類的方法。)
問題出在第二問,如下。
public class Father {
String name = "zs" ;
}
class Son extends Father{
String name = "ls" ;
}
class Test{
public static void main(String[] args) {
Father x = new Son();
System.out.println(x.name);
}
}
運行結果:zs
沒錯,是zs,不是ls
本題的解析如下:
- 當子類重寫了父類的方法時,調用主體(即代碼中的對象“x”)和方法(即代碼中的“method()”)是運行時綁定的。也就是說,在編譯期間,對象“x”還沒有和"method()"方法關聯起來,而是在程序運行期間綁定。根據多態“父類引用,指向子類對象”的特性,父類引用"x"在運行時使用了子類對象Son中的method()方法。
- 當子類重寫了父類的屬性時,調用主體(即代碼中的對象“x”)和屬性(即代碼中的“name”)是編譯時綁定的。也就是說,在編譯期間,父類Father對象已經和屬性name綁定起來了,因此與後續的繼承、重寫屬性沒有任何關係(嚴格的講,屬性不能叫“重寫”,只是子類重新定義了一份)。
總結一下:在使用多態的時候,重寫方法,調用的是子類的方法;重寫屬性,調用的是父類的屬性。
如果喜歡本篇文章,歡迎轉發、點贊。
記得關注我!