java面試題0001-區分類中過載方法的依據是什麼?

Moscow發表於2020-08-26

到底是根據什麼來區分類中過載的方法?

	A:不同的返回值型別。
	B:不同的引數型別。
	C:不同的訪問許可權。
	D:不同的引數名稱。

解析:

Step1.我們先在DifferentiateReload類中建立一個無參無返回值的say()方法
package components.javaTest.day1_20200822;

/**
* Question:
*  區分類中過載方法的依據是什麼?
*/
public class DifferentiateReload {
  public void say(){
      System.out.println("A");
  }
}
java面試題0001-區分類中過載方法的依據是什麼?
Step2.試著在該類中構造返回值不同的say()方法
public class DifferentiateReload {
 public void say(){
     System.out.println("A");
 }
	//新增返回值不同的say()方法
 public String say(){
     return "B";
 }
}
java面試題0001-區分類中過載方法的依據是什麼?

此時我們可以看到編譯報錯了,編譯器認為已經存在了say()方法,

換言之,兩個方法無法被區分開來(我們可以想象一下,在呼叫該類的兩個方法new DifferentiateReload().say(),

此時根本不需要知道say()返回的內容,系統也是腦殼疼不知道您是在呼叫哪一個,所以

  	A:不同的返回值型別。--->無法區別類中的過載方法。

Step3.在該類中構造訪問許可權不同的say()方法
package components.javaTest.day1_20200822;

/**
 * Question:
 *  區分類中過載方法的依據是什麼?
 */
public class DifferentiateReload {
    public void say(){
        System.out.println("A");
    }
    //新增許可權不同的say()方法
    private void say(){
        System.out.println("C");
    }  
}
java面試題0001-區分類中過載方法的依據是什麼?

同樣的,提示方法已經存在了,編譯報錯,

不同許可權,無非是控制不同地方的呼叫,舉個例子,

如果都在DifferentiateReload類中呼叫,

那麼public、private、protected對應呼叫者都是沒有區別,

系統還是無法得知你想呼叫的到底是哪個方法,所以

  	C:不同的訪問許可權。--->無法區別類中的過載方法。

Step4.在該類中構造引數名稱不同的say()方法 在這裡我們先後建立兩個有參,且引數型別都為int,同時引數名稱不同的say()
package components.javaTest.day1_20200822;

/**
 * Question:
 * 區分類中過載方法的依據是什麼?
 */
public class DifferentiateReload {
    public void say(int age) {
        System.out.println("I'm "+ age + "old.");
    }
}
package components.javaTest.day1_20200822;

/**
 * Question:
 * 區分類中過載方法的依據是什麼?
 */
public class DifferentiateReload {
    public void say(int age) {
        System.out.println("I'm "+ age + "old.");
    }
    //新增一個有參,且引數型別為int,同時引數名稱不同的say()
    public void say(int money) {
        System.out.println("I hava "+ money+ "yuan." );
    }
}

java面試題0001-區分類中過載方法的依據是什麼?

java面試題0001-區分類中過載方法的依據是什麼?

可以看到,編譯器在寫say(int money)方法的時候,認為say(int)方法已經存在了。

很顯然,對於編譯器,你傳一個int型別的年齡,和一個int型別的鈔票其實對它來說沒兩樣,

只要int型別的,我管你是什麼含義,照收即可。也就是說,當你呼叫new DifferentiateReload(1)方法時,

編譯器也不知道你需要呼叫哪個方法,所以

		D:不同的引數名稱。--->無法區別類中的過載方法。

Step5.在該類中構造引數型別不同say()方法

注意:引數型別不同可以有兩種理解:

一、在引數個數、引數所處位置順序相同的情況下,其對應的引數物件的型別不同

二、引數個數、引數所處位置的順序、引數的型別其中一個或者多個不同

不管是哪種理解,不同的引數型別,就能正確地區分類中的過載方法,下面控制檯列印出的就是呼叫多個say過載方法的輸出結果。

package components.javaTest.day1_20200822;

/**
 * Question:
 * 區分類中過載方法的依據是什麼?
 */
public class DifferentiateReload {
    public static void main(String[] args) {
        say();
        say(11);
        say("11");
        say(11, "11");
        say("11", 11);
    }

    public static void say() {
        System.out.println("呼叫了無參無返回值的say");
    }

    public static void say(int count) {
        System.out.println("呼叫了引數為int無返回值的say");
    }

    public static void say(String msg) {
        System.out.println("呼叫了引數個數相同,型別不同,無返回值的say");
    }

    public static void say(int count, String msg) {
        System.out.println("呼叫了引數個數不同,型別不同,無返回值的say");
    }

    public static void say(String msg, int count) {
        System.out.println("呼叫了引數個數相同,型別相同,順序不同,無返回值的say");
    }
}
java面試題0001-區分類中過載方法的依據是什麼?

所以區分類中過載方法的依據是:

	B:不同的引數型別。


非  淡  泊  無  以  明  志
非 寧 靜 無 以 致 遠 !

相關文章