объяснение методов моста - PullRequest
0 голосов
/ 17 июня 2010

Если я сделаю переопределение метода клона, компилятор создаст метод моста для гарантировать правильный полиморфизм (ЭТО КЛАСС ОТКРЫТ)

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(), как виртуальная машина может сказать, что она должна вызывать Point clone(), а не сама себя ???

Ответы [ 2 ]

1 голос
/ 17 июня 2010

Вы не можете этого сделать, он не скомпилируется, потому что у вас есть два метода с одинаковым именем и одинаковыми параметрами (в данном случае ни одного), и если вы вызываете somePoint.clone(), не ясно, какой из них имеется в виду.

Вы должны сделать что-то вроде:

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

Редактировать: некоторые тонкости: ваш класс должен реализовывать клонируемый интерфейс, иначе super.clone () выдаст исключение.Метод clone () в классе Object возвращает поверхностную копию текущего объекта (его класс времени выполнения будет таким же, как у объекта, для которого был вызван метод clone).Тогда ваша задача - выполнить какие-либо специфические для класса манипуляции с этим объектом (например, клонировать ссылки на другие объекты) и затем вернуть его.Тип возвращаемого значения может быть вашим собственным классом вместо Object, и он все равно будет перезаписывать Object.clone () (или любой другой метод ParentClass.clone ()).

1 голос
/ 17 июня 2010

Этот код не компилируется с Java 1.6.Сигнатуры методов в Java не включают тип возвращаемого значения ... и у вас не может быть повторяющихся сигнатур методов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...