Рассмотрим следующую программупонижающее приведение при вызове super.clone() метод
class A implements Cloneable {
String str = null;
public void set(String str)
{
this.str = str;
}
@Override
public A clone()
{
A a = null;
try {
a = (A) super.clone();
if(a.str!=null) {
System.out.println(a.str);
}
else {
System.out.println("null");
}
}
catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return a;
}
public static void main (String args[])
{
A a = new A();
a.set("1234");
A b = a.clone();
}
}
Почему выход выше программы 1234, а не нулевой.
Я ожидал null, из-за нижеследующего понимания.
метод super.clone() создает новый объект родительского типа (Object в данном случае), в котором атрибуты родительского класса будет скопирован мелким.
Когда мы применяем метод downone в нашем методе clone(), атрибуты, определенные в дочернем классе, будут инициализированы с их значениями по умолчанию, поскольку это новый объект.
Но после того, глядя на выходе, похоже, значение атрибутов текущего экземпляра класса ребенка (это) становится копируется вновь contructed объекта (после вызова клона родительского класса и понижающего приведения).
Может кто-нибудь рассказать, что происходит, когда мы сбиваемся с толку?
Метод 'clone()' реализуется изначально в классе 'Object', требуя, чтобы вы использовали' super.clone(); 'для его вызова. Однако он, конечно, вернет объект типа 'this', который в вашем случае равен' A'. – Kayaman