2010-12-08 9 views
5

のオーバーロード、私はこのクラスを持っている:Java。例えば方法

public class Col { 

static void test(int a) 
    { 
     System.out.println("int"); 
    } 
    public static void main(String args[]) 
    { 
     Col.test(12); //1 

     Col.test((byte)12); //2 

     Col.test((long)100); //3 

    } 
} 

と今の私は、どのようにそのアルゴリズムの仕事にこのコードのintresting。 私は、この手順を:

1行 - int param、すべての正確な呼び出しメソッドと思う。

2バイトパラメータを使用した2行呼び出しメソッド... oooops。何ですか? Javaはintにバイトを広げてみますか?それは本当です?

長いパラメータを持つ3行の呼び出しメソッド...再びooops。何ですか? intをjavaに変換することはできません。正確さが失われるためです。その試行?そして結果 - 例外。

public static void test(Object a) 
    { 
     System.out.println("Object"); 
    } 

とあればコール:

Col.test((long)100); 

ので、すべて正しい、例外 、どのようなプリミティブ型との関係は長く、オブジェクト私はこれを追加したより

+0

OK、おかげで、男性は、このリンクを参照することができ.Also(オブジェクト)のテストを呼んで! – user471011

答えて

7

はい、byteからintへの暗黙的な変換はありませんが、(理由は情報を失う可能性の)longからintへの暗黙的な変換。第三の場合

、あなたはLong(クラス型)にlong(プリミティブ型)に変換されますどのをオートボクシングを使用しています。

あなたはへtestの体を変更することであることがわかります。

public static void test(Object a) 
{ 
    System.out.println(a.getClass()); 
} 

それは、その後class java.lang.Longを出力します。

+0

+1 - 両方の質問に対処する5のうち2つの回答の1つ。 –

2
public static void test(Object obj) { 
     if (obj instanceof Integer) { 
      System.out.println("Integer"); 
     } else if (obj instanceof Double) { 
      System.out.println("Double"); 
     } else if (obj instanceof Float) { 
      System.out.println("Float"); 
     } else if (obj instanceof Long) { 
      System.out.println("Long"); 
     } 
    } 
2

すべてのjavaプリミティブは、実際のクラスである対応するボックス化された「型」を持っています。あなたの例では、longに対応するクラスLongがあります。このクラスはObjectから継承されています。

あなたが経験したことは、ボクシングとアンボクシングです。

2

これはJava 5で導入された機能で、オートボクシングと呼ばれています。この場合、プリミティブ型はObjectに変換されます(あなたの場合はLongからLongに変換されます)。 Autoboxingの詳細については、this linkを参照してください。

4

最初の例は、プリミティブ型の変換を示しています。 2番目はボクシングとアンボクシングを示しています。これは簡単に言えば、プリミティブ型(longなど)とそのラッパークラス(この場合はjava.lang.Long)の間の便利な変換です。のオーバーロード

同じ名前が異なるパラメータを持つメソッドを実装しています。ここでは2つの方法があります

static void test(int a){} 
static void test(Object a){} 

test((long) 100)と呼んでください。JVMは明示的なキャストなしでlongintに限定しないため、最初のメソッドを呼び出すことはできません。しかし、JVM(バージョン1.5以降)Long(オートボクシング)にlong値を変換することができますし、test(Long.valueOf((long) 100))は、第二の方法のために良い試合です。

+0

なぜ、static void test(int a)とstatic void test(Object a)がオーバーロードの例ではないのですか? –

+0

@Adriaanは - あなたは正しい - 彼は本当に同じファイルに他の試験方法を追加した場合、その後、彼はオーバーロードしなかった、(既存のメソッドのシグネチャを変更していないだけ)。しかし、彼の質問は側面を過負荷にすることを目標としておらず、型変換とオートボクシングを扱います。 –

+0

うん、多分、あなたは真のが、コードでは、我々は持っているオーバーロード、我々は二つの方法テスト(int型a)とテスト(オブジェクト)、そう、あなたが言うように持っている結果コードに - 同じ名前、および異なるのparamsを。 – user471011

3

これは、オートボクシング機能です。 実際にあなたが長いプリミティブを推進してきたし、故に、それは。あなたがこのCol.test(新しい整数(12))のように見ることができます(Aオブジェクト)のテストを呼んでそれに相当するタイプのためseachingされ、自動的にテストメソッドを呼び出している間、この意志また、あなたが Determining if an Object is of primitive type