是否可以在不覆盖的情况下使用 clon() 方法
Is it possible to use clon() method without overriding it
我和我的老师有点麻烦,我们要在一个月左右的时间内掌握java的概念,他说以下是可能的:
所以在 Java 中每个 class 都是从对象 class 继承的,这个 class 为我们提供了像 protected Object clone()
这样的方法,例如:现在让我们假设我们有 class Car
// 后面的主要部分:
Car mycar=new Car();
//he is saying now that following is possible:
Car yourCar=(Car) mycar.clone();
但是网上的每篇文章都说这是不可能的,即使我尝试编译它也是不可能的,首先是因为该方法是受保护的,其次是因为它会抛出异常
有没有我遗漏的东西?
如果 Car
公开了 public Object clone
的覆盖实现,那么您的老师是正确的。 Subclass 可以 widen the access to overriden methods,因此 clone
有可能具有 public
访问权限。您也可以在 class 本身中调用该方法,即使您不扩大访问范围也是如此。
而clone
会抛出一个CloneNotSupportedException
if called on a object that hasn't overriden it:
The class Object does not itself implement the interface Cloneable, so calling the clone method on an object whose class is Object will result in throwing an exception at run time.
这就解释了为什么您在尝试时会遇到异常。您需要在已实现它的对象上调用 clone
。
是的,只要 class 实现 Cloneable,您就可以使用 .clone()
而无需覆盖它。
这是一个例子:
class Car implements Cloneable {
String name;
public Car(String n) {
name = n;
}
public static void main(String[] args) throws Exception {
Car c1 = new Car("Lightning McQueen");
Car c2 = (Car) c1.clone();
System.out.println(c2.name);
}
}
这是 default behavior of clone() 的描述,当 class 实现 Cloneable 但不覆盖 clone()
时:
this method creates a new instance of the class of this object and initializes all its fields with exactly the contents of the corresponding fields of this object, as if by assignment; the contents of the fields are not themselves cloned. Thus, this method performs a "shallow copy" of this object, not a "deep copy" operation.
我和我的老师有点麻烦,我们要在一个月左右的时间内掌握java的概念,他说以下是可能的:
所以在 Java 中每个 class 都是从对象 class 继承的,这个 class 为我们提供了像 protected Object clone()
这样的方法,例如:现在让我们假设我们有 class Car
// 后面的主要部分:
Car mycar=new Car();
//he is saying now that following is possible:
Car yourCar=(Car) mycar.clone();
但是网上的每篇文章都说这是不可能的,即使我尝试编译它也是不可能的,首先是因为该方法是受保护的,其次是因为它会抛出异常
有没有我遗漏的东西?
如果 Car
公开了 public Object clone
的覆盖实现,那么您的老师是正确的。 Subclass 可以 widen the access to overriden methods,因此 clone
有可能具有 public
访问权限。您也可以在 class 本身中调用该方法,即使您不扩大访问范围也是如此。
而clone
会抛出一个CloneNotSupportedException
if called on a object that hasn't overriden it:
The class Object does not itself implement the interface Cloneable, so calling the clone method on an object whose class is Object will result in throwing an exception at run time.
这就解释了为什么您在尝试时会遇到异常。您需要在已实现它的对象上调用 clone
。
是的,只要 class 实现 Cloneable,您就可以使用 .clone()
而无需覆盖它。
这是一个例子:
class Car implements Cloneable {
String name;
public Car(String n) {
name = n;
}
public static void main(String[] args) throws Exception {
Car c1 = new Car("Lightning McQueen");
Car c2 = (Car) c1.clone();
System.out.println(c2.name);
}
}
这是 default behavior of clone() 的描述,当 class 实现 Cloneable 但不覆盖 clone()
时:
this method creates a new instance of the class of this object and initializes all its fields with exactly the contents of the corresponding fields of this object, as if by assignment; the contents of the fields are not themselves cloned. Thus, this method performs a "shallow copy" of this object, not a "deep copy" operation.