1. 程式人生 > >Java過載函式,當引數為null時,呼叫的處理

Java過載函式,當引數為null時,呼叫的處理

精確性原則

關於以下程式的輸出結果:

public class TestNull {  
public void show(String a){  
System.out.println("String");  
}  
public void show(Object o){  
System.out.println("Object");  
}  
public static void main(String args[]){  
TestMain t = new TestMain();  
t.show(null);  
}  
}  
輸出結果為:

string

解釋:主要是過載函式或建構函式呼叫時精確性的問題。

java是強型別語言,就是使用的時候要明確型別,如果不明確的話,編譯器會幫你做,它會呼叫他認為最合適的那個,編譯器也是程式,也是按照預先的規則執行。

Java的過載解析過程是以兩階段執行的。第一階段 選取所有可獲得並且可應用的方法或構造器。第二階段在第一階段選取的方法或構造器中選取最精確的一個。如果一個方法或構造器可以接受傳遞給另一個方法或構 造器的任何引數,那麼我們就說第一個方法比第二個方法缺乏精確性。
在我們的程式中,兩個構造器都是可獲得 並且可應用的。構造器Confusing(Object)可以接受任何傳遞給Confusing(double[ ])的引數,因此Confusing(Object)相對缺乏精確性。(每一個double陣列都是一個Object,但是每一個Object並不一定是 一個double陣列。)因此,最精確的構造器就是Confusing(double[ ]),這也就解釋了為什麼程式會產生這樣的輸出。

理解本謎題的關鍵在於在測試哪一個方法或構造器最精確。

要想用一個null引數來呼叫 Confusing(Object)構造器,你需要這樣寫程式碼:new Confusing((Object)null)。

相關推薦

Java過載函式引數null呼叫處理

精確性原則 關於以下程式的輸出結果: public class TestNull { public void show(String a){ System.out.println("String"); } public void show(Object o)

問題描述: 在使用mybatis對資料庫執行更新操作parameterType某個具體的bean而bean中傳入的引數null丟擲異常如下:

org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.type.TypeException: Could not set parameters for mappin

C語言之定義一個函式實現對字串做如下操作:字元字母大小寫互換字元數字原樣輸出有其它字元出現時結束操作返回已處理的字串

Action(){       char str[]={"tEst234%^road"};int len = sizeof(str)/sizeof(char);//strTest2呼叫函式lr_output_message("%s",strTest2(str,len)); r

用mybatis更新資料資料0無法更新

在bean中,count是long型別: private Long count; 需求就是利用下面的更新語句更新bills表中的count和amout <update id="updateBills" parameterType="map" >

關於輸入多組測試資料資料0輸入結束

1.while(scanf("%d",&n)!=EOF) EOF在stdio.h中巨集定義為-1; 即有輸入時,迴圈繼續,其實,如無別的條件,一直會“輸入——處理”,“輸入——處理”的迴圈從而

vue-cli + router生成的專案modehistory直接在url中輸入地址頁面訪問404或者重新整理頁面後404

有的時候,業務中會有一些需求,直接在其他地方,比如郵件中提供系統連結,通過點選一個url直接跳轉到我們的系統中來。 在本地開發時,直接輸入對應的url就可以訪問,但是當專案部署在伺服器之後,直接輸入url就會報錯404,這是因為router本身提供的就是一個 虛擬路徑,通過

java 反射: Timestamp型別的屬性值null設定預設值

import java.beans.PropertyDescriptor; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.sql.Timestamp; class Person {

java 編寫一個函式輸入n偶數呼叫函式求1/2+1/4+...+1/n,輸入n奇數呼叫函式1/1+1/3+...+1/n(利用指標函式)

題目: 編寫一個函式,輸入n為偶數時,呼叫函式求1/2+1/4+…+1/n,當輸入n為奇數時,呼叫函式1/1+1/3+…+1/n(利用指標函式) 程式碼: import java.util.S

類的指標被賦值NULL類的哪些成員還可以被該指標呼叫

轉自:https://blog.csdn.net/xiaoluer/article/details/53337292 該問題源自於一道面試題,題目如下所示: 看如下程式碼,請問能不能編譯通過?如果能編譯通過能不能執行成功?並說明原因     clas

Java的if判斷物件nullnull放在比較運算子的左邊還是右邊較好?

  如java中:if(name == null)和if(null == name)有什麼講究嗎?   答:在java裡面,它們是一樣的。但是通常寫為null == name。這其實是在C語言裡面引申出來的。   在C語言裡面,為了防止少敲一個等號,程式設計人員仍然能在編譯的時候找到錯誤。因為if(nam

Jackson 轉換JSONSpringMVC ajax 輸出null或者空不輸出欄位@JsonInclude

當我們提供介面的時候,  Ajax  返回的時候,當物件在轉換  JSON  (序列化)的時候,值為Null 或者為“”的欄位還是輸出來了。看上去不優雅。 現在我敘述三種方式來控制這種情況。 註解的方式( @JsonInc

C#呼叫非託管函式引數Void* 方法

This sample demonstrates how to pass data to an unmanaged function that expects a void pointer as an argument. The sample provides two solutions. The Voi

函式呼叫引數指標實參跟形參的問題

#include<stdio.h> void change(int *p){     int val = 5;     printf("%p\n", p);     *p = val;

Mybatis:使用bean傳值傳入值Null提示“無效的列型別”的解決辦法

提示: Try setting a different JdbcType forthis parameter or a differentjdbcTypeForNull configuration property. Cause: java.sql.SQLException: 無效的列型別: 1111

JS函式引數物件如何呼叫

當JS函式的引數為物件時,呼叫時不能直接傳物件,而是要將物件使用者JSON轉換之後才能用,如下 特別要注意這個return "<button class='btn btn-primary btn-sm'' onclick='toEdit(" + JSON.stri

java中判斷物件nullnull在前面還是後面

因為目前只學習並使用java語言,所以這裡主要是根據java來說的 Java中對null進行判斷放在前後沒有什麼區別,只是為了

spring boot加mybatis使用Map返回屬性也會沒有(轉)

call pri per n-n spring fig setter 解決 strong 使用spring boot加mybatis時,設置Map返回,當值為空時屬性也會沒有,就會報錯 在application.properties中加入下面配置,將會解決這個問題。

Scala中引數超過22通過實現Product特質

在使用Spark做某些專案時,可能對某寫資料進行分析時,會出現有很多欄位,而Scala中,預設的最大的引數個數是22,因此如果當我們的欄位太多時 ,22欄位不能滿足,我們可以同過實現Product這個特質,實現裡面的方法,可以傳更多的欄位 object Demo01 { def ma

c++中指向物件的指標NULL可以呼叫物件成員函式

問題貌似有點奇怪,指標都為NULL了怎麼還可使用?但其實不是的,可以看以下程式碼: #include <iostream> 2 using namespace std; 3 4 class A 5 { 6 public: 7 void

gson或jackson實體的屬性null序列化保留該字串

Gson g = new GsonBuilder().serializeNulls().create(); ObjectMapper mapper = new ObjectMapper();  mapper.setSerializationInclusion(Includ