Given:



public class SumTest {

    public static void doSum(Integer X, Integer Y) {
        System.out.println("Integer sum is " + (X + Y));
    }

    public static void doSum(double x, double Y) {
        System.out.println("double sum is " + (x + Y));
    }

    public static void doSum(float x, float Y) {
        System.out.println("float sum is " + (x + Y));
    }

    public static void doSum(int x, int Y) {
        System.out.println("int sum is " + (x + Y));
    }

    public static void main(String[] args) {
        doSum(10, 20);
        doSum(10.0, 20.0);
    }
}

What is the result?

A.

int sum is 30
float sum is 30.0

B.

int sum is 30
double sum is 30.0

C.

Integer sum is 30
double sum is 30.0

D.

Integer sum is 30
float sum is 30.0

題解

doSumg是一個多載(Overload)方法,Java會自動根據傳入的參數數量和型態來決定要使用哪一個doSumg方法。

Java的預設整數型態是int,浮點數型態是double,因此程式會執行第15行和第7行的doSumg方法。

若在程式碼內想使用long或是float的數值型態,可以直接在數值後接上「l」或是「f」來轉型。舉例來說,若將題目的程式第20和21行改成:

doSum(10l, 20l);
doSum(10.0f, 20.0f);

則程式執行結果會變成:

float sum is 30.0
float sum is 30.0

這裡長整數long型態的數值因為在SumTest類別中並沒有找到完全符合的doSumg方法,因此會自動往上轉型成有符合方法的float型態。

Integer是Java的Wrapper類別,int型態的數值可以被自動轉型(auto wrapping)成Integer物件。僅當傳入int型態的參數給doSumg方法時,若doSumg方法並沒有定義int和long、float、double等能夠讓int向上轉型的多載方法,才會使用Integer型態的doSumg多載方法。