挑戰一道Java基礎的面試題

最近面試了一些應聘者,錯誤率最高的就是這道Java基礎題了,大家一起看看吧。

題目是這樣設計的:

  1. 父類有一個方法,子類重寫了該方法;那麼使用多態調用該方法時,調用的是父類的還是子類的?
  2. 父類有一個屬性,子類也定義了這個屬性;那麼使用多態調用該屬性時,調用的是父類的還是子類的?

先看第一個,如下


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

本題的解析如下:

  1. 當子類重寫了父類的方法時,調用主體(即代碼中的對象“x”)和方法(即代碼中的“method()”)是運行時綁定的。也就是說,在編譯期間,對象“x”還沒有和"method()"方法關聯起來,而是在程序運行期間綁定。根據多態“父類引用,指向子類對象”的特性,父類引用"x"在運行時使用了子類對象Son中的method()方法。
  2. 當子類重寫了父類的屬性時,調用主體(即代碼中的對象“x”)和屬性(即代碼中的“name”)是編譯時綁定的。也就是說,在編譯期間,父類Father對象已經和屬性name綁定起來了,因此與後續的繼承、重寫屬性沒有任何關係(嚴格的講,屬性不能叫“重寫”,只是子類重新定義了一份)。

總結一下:在使用多態的時候,重寫方法,調用的是子類的方法;重寫屬性,調用的是父類的屬性。

如果喜歡本篇文章,歡迎轉發、點贊。

記得關注我!
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章