-4

以下のコードでは、オーバーロード関数の呼び出しがどのように行われるのか理解できません。サイド参照とテール参照をそれぞれ使用してオブジェクトが作成されたときに、オーバーロード関数呼び出しがどのように行われるかを詳しく説明してください。

interface Side {
    String getSide();
}

class Head implements Side {
    public String getSide() {
        return "Head ";
    }
}

class Tail implements Side {
    public String getSide() {
        return "Tail ";
    }
}

class Coin {
    public static void overload(Head side) {
        System.out.print(side.getSide());
    }

    public static void overload(Tail side) {
        System.out.print(side.getSide());
    }

    public static void overload(Side side) {
        System.out.print("Side ");
    }

    public static void overload(Object side) {
        System.out.print("Object ");
    }

    public static void main(String[] args) {
        Side firstAttempt = new Head();
        Tail secondAttempt = new Tail();
        overload(firstAttempt);
        overload((Object) firstAttempt);
        overload(secondAttempt);
        overload((Side) secondAttempt);
    }
}
4

2 に答える 2

1

http://docs.oracle.com/javase/tutorial/java/javaOO/methods.html

  1. すべての Java オブジェクトは Object から派生します。
  2. インターフェイス Side を定義しました
  3. 頭装備側
  4. テールはサイドを実装します。

同じ名前 (オーバーロード) の 4 つのメソッドがありますが、それらはすべて異なるシグネチャを持っています... 1 つは Head を受け入れ、もう 1 つは Tail を受け入れ、もう 1 つは Side を受け入れ、最後の 1 つは Object を受け入れます。Head と Tail はどちらも Side を継承しているため、メソッド overload(Side side) はどちらも引数として受け入れます。同様に、Head と Tail の両方が Object から派生しているため、overload(Object obj) はどちらも受け入れます。

特定の例では、firstAttempt は Side 型であるため、overload(firstAttempt) を呼び出すときは、overload(Side side) メソッドを使用しています。2 番目の呼び出しは明示的に Object にキャストするため、overload(Object obj) を使用しています。secondAttempt 変数は Tail 型であるため、overload(secondAttempt) は overload(Tail tail) を呼び出します。最後に、overload((Side) secondAttempt) が明示的に Side にキャストされるため、overload(Side side) が呼び出されます。

于 2013-08-15T14:09:54.100 に答える
1

コンセプトを細かく消化!

まずこのコードを理解してください

interface Side
{
String getSide();
}

class Head implements Side
{
public String getSide()
{
    return "Head ";
}
}

class Tail implements Side
{
public String getSide()
{
    return "Tail ";
}
}

インターフェイスを作成し、2 つのクラスがそれを実装します。関数をオーバーライドします。それからあなたの最終クラス、

public class Coin
{
public static void overload(Head side)
{
    System.out.println(side.getSide()+" -> "+side);
}

public static void overload(Tail side)
{
    System.out.println(side.getSide()+" -> "+side);
}

public static void overload(Side side)
{
    System.out.println("Side <- "+side);
}

public static void overload(Object side)
{
    System.out.println("Object <- "+side);
}
public static void main(String[] args)
{
    Side a = new Head();
    Side b = new Tail();
    Head c = new Head();
    Tail d = new Tail();
    overload(a);
    overload((Side) a);
    overload((Object) a);
    overload(b);
    overload((Side) b);
    overload((Object) b);
    overload(c);
    overload((Side) c);
    overload((Object) c);
    overload(d);
    overload((Side) d);
    overload((Object) d);
}

次のように、コードをサンプル出力にマッピングする紙の上の行ごとに main 関数の予行演習をシミュレートします。

Side a = new Head()の場合、

Side <- Head@12d5e310
Side <- Head@12d5e310
Object <- Head@12d5e310

Side b = new Tail()の場合、

Side <- Tail@182e3919
Side <- Tail@182e3919
Object <- Tail@182e3919

Head c = new Head()の場合、

Head  -> Head@2a6a4b6
Side <- Head@2a6a4b6
Object <- Head@2a6a4b6

Tail d = new Tail()の場合、

Tail  -> Tail@a87aa16
Side <- Tail@a87aa16
Object <- Tail@a87aa16

参照が各オブジェクトで同じであることをマークし、@hashcode も同じです!

于 2013-08-19T18:42:39.740 に答える