最近面試了一些應聘者,錯誤率最高的就是這道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系結起來了,因此與后續的繼承、重寫屬性沒有任何關系(嚴格的講,屬性不能叫“重寫”,只是子類重新定義了一份),
總結一下:在使用多型的時候,重寫方法,呼叫的是子類的方法;重寫屬性,呼叫的是父類的屬性,
如果喜歡本篇文章,歡迎轉發、點贊,
記得關注我!

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/229326.html
標籤:其他
上一篇:智能視頻監控的發展和優勢
