Вопрос

Java Doc говорит -

Объект класса сама не реализует интерфейс к клождестве, поэтому вызывая метод клона на объекте, класс которого является объектом, приведет к образованию исключения во время выполнения.

Вот почему метод клонирования в классе объекта защищен? это так ?

Это означает, что любой класс, который не реализует клонкологический, будет бросать клоненотсопортное исключение, когда его клон использует метод.

Я провел тестовую программу

public class Test extends ABC implements Cloneable{

    @Override
    public Object clone() throws CloneNotSupportedException {
        System.out.println("calling super.clone");
            return super.clone();
    }

    public static void main(String[] args) {
        Test t = new Test();
        try{
        t.clone();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
}
class ABC{

}

Из метода клона класса тестов Super.Clone вызывается?

Почему это не бросает исключение?

Это было полезно?

Решение

Наследование дерева Test пример t выглядит как

Object
  ABC
    Test

Test Также реализация Cloneable что означает, что когда вы называете метод super.clone() ObjectС. clone Метод будет вызван. Это проверяет, если экземпляр t реализует Cloneable интерфейс. Так как он реализует метод не бросает исключение.

Другие советы

Кломичный интерфейс представляет собой интерфейс маркера, который указывает, что класс реализации поддерживает метод клона. Причина, по которой Super.clone () не бросает исключение, состоит в том, что базовый объект вызывается, клобному навлечению на наследство.

От Javadoc:

Класс реализует клобильный интерфейс для указания метода Object.CLONE (), который является законным для этого метода, чтобы сделать поле для полевых экземпляров этого класса.

Способ призывающего клона объекта на экземпляр, который не реализует клонируемый интерфейс, приводит к выброшению исключения клоненоцупопортноеexception.

Видеть: Кломируемая (Java Platform SE 6)

Потому что ваш класс реализует Cloneable. Отказ Из Javadoc. из Cloneable:

Класс реализует клобильный интерфейс для указания метода Object.CLONE (), который является законным для этого метода, чтобы сделать поле для полевых экземпляров этого класса.

Так что это позволяет использовать ObjectС. clone() метод. Это (опять по словам Javadoc) только к конвенции, чтобы переопределить clone(). Отказ Если вы не переопределите его и ObjectС. clone() метод выполняет экземпляр поле для поля, вы все равно можете получить CloneNotSupportedException Если один из полей сама не клобно. Поэтому это хорошие советы, чтобы переопределить его.

Почему метод клона в классе объекта protected?

Так что класс, который выбирает к поддержке клонирования, не является принужденный разоблачить его в публичном API.

Когда ваш пример демонстрирует, подкласс разрешается переопределить метод с большим доступом, чем унаследованная версия метода. Вы просто не можете уменьшить доступ метода таким образом.

Это означает, что любой класс, который не реализует клонкологический, будет бросать клоненотсопортное исключение, когда его клон использует метод.

Это верно.

Из метода клона класса тестов Super.Clone вызывается?

Это верно.

Почему это не бросает исключение?

Потому что вы заявили, что ваш класс реализует Cloneable. Отказ Если вы этого не сделали, это было бы бросить исключение ... Предполагая, что ваш клон-метод все еще называется super.clone().

Это может дать вам ответ, почему этот метод защищенПочему метод клона защищен

Это не бросает исключение, потому что вы реализуете клонко. От клонной документации:

«Класс реализует клонный интерфейс для указания метода Object.Clone (), который является законным для этого метода, чтобы сделать поле для полевых экземпляров этого класса. Призыв не реализует Набор клонируемых интерфейсов приводит к исключительному кроншему ClonenotsupportedException. "

Но, поскольку вы реализуете его, вы расскажите об реализации объекта, что законно создать полевую копию для полевых экземпляров, поэтому он не бросает исключение.

Я бы сказал хороший вопрос, чтобы запутать интервьюируемую :).

Что касается причины, почему это не бросает исключение. Подумайте об этом по объекту. Ваш объекционный объект имеет классный тест, который реализует кломин. Когда вы называете метод Super.clone, это все еще объект класса теста, и поэтому нет причин для него, чтобы бросить клоненотпортное исключение. Было ли это объектом самого объекта класса, он бросил бы исключение.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top