0

クローン メソッドをオーバーライドすると、コンパイラは正しいポリモーフィズムを保証するためにブリッジ メソッドを作成します (これはクラスのデコンパイルです)。

class Point
{

    Point()
    {
    }

    protected Point clone()
        throws CloneNotSupportedException
    {
        return this; // not good only for example!!!
    }

    protected volatile Object clone()
        throws CloneNotSupportedException
    {
        return clone();
    }
}

したがって、クローン メソッドが呼び出されると、ブリッジ メソッドが呼び出され、その内部で正しいクローン メソッドが呼び出されます。しかし、私の質問は、ブリッジメソッドが呼び出されたときにreturn clone()、VM が自分自身ではなく呼び出す必要があるとどのように言うのかということですPoint clone()???

4

2 に答える 2

1

このコードはJava1.6ではコンパイルされません。Javaのメソッドシグニチャには戻り型が含まれていません...そして重複するメソッドシグニチャを持つことはできません。

于 2010-06-17T09:11:38.823 に答える
1

それはできません。同じ名前と同じパラメーター (この場合はなし) を持つ 2 つのメソッドがあり、呼び出しsomePoint.clone()た場合、どちらが意味するのかが明確でないため、コンパイルされません。

あなたは次のようなことをすることになっています:

public Point clone() {
    return (Point) super.clone(); // shallow copy
}

編集:いくつかの細かい点:クラスはクローン可能なインターフェースを実装することになっています。そうしないと、super.clone()で例外が発生します。Object クラスの clone() メソッドは、現在のオブジェクトの浅いコピーを返します (そのランタイム クラスは、clone メソッドが呼び出されたオブジェクトの 1 つと同じになります)。次に、そのオブジェクトに対してクラス固有の操作 (他のオブジェクトへの参照の複製など) を行い、それを返すのはあなたの仕事です。戻り値の型は Object ではなく独自のクラスにすることができ、それでも Object.clone() (またはその他の ParentClass.clone()) メソッドを上書きします。

于 2010-06-17T09:12:47.680 に答える