2016-09-23 152 views
0

如果我想在java中克隆一个对象。所以我必须实现Cloneable接口。但如果该类是另一个类的子类,那么我必须将父类标记为(即实现)Cloneable。如果我们想克隆子类,父类是否也需要实现Cloneable接口?

这是行得通的吗?

public class A{ 

    private String a; 

    public A(String a){ 
     this.a = a; 
    } 
} 

public class B extends A implements Cloneable{ 

    private String b; 

    public B(String a, String b){ 
     super(a); 
     this.b = b; 
    } 

    public static void main(String args[]){ 
     B b1 = new B("a","b"); 
     B b2 = b1.clone(); 
    } 
} 
+0

每类是'Object',不执行'Cloneable'的子类。 – shmosel

+1

你为什么不尝试看看? –

+0

@Mayank NO,不需要你克隆类B,它是独立类,它只是继承类A的属性。试试吧,检查它会工作 –

回答

0

NO,不需要你是克隆class B它是独立的阶级和

B类只是继承了A类的属性

所以无关与对象class B对象clone

尝试,并检查它的工作

+0

B类不是继承超类的私有变量,所以它是如何工作的,它应该和我们需要实现标记接口(Serializable)到超类的序列化相同(如果不想丢失超类的状态也 –

0

不要求由父类来实现Cloneable使子类资格克隆。

任何子类都可以简单地实现Cloneable并覆盖克隆方法以符合克隆条件。

package com.pradeep.java.practise.object; 

class A{ 
    private String name; 
    public A() { 
     System.out.println("===A()==="); 
    } 
    public A(String name){ 
     System.out.println("===A(-)==="); 
     this.name = name; 
    } 

    @Override 
    public String toString() { 
     return "A [name=" + name + "]"; 
    } 

} 

class B extends A implements Cloneable{ 
    private String name; 
    public B() { 
     System.out.println("===B()==="); 
    } 
    public B(String name){ 
     System.out.println("===B(-)==="); 
     this.name = name; 
    } 
    @Override 
    protected Object clone() throws CloneNotSupportedException { 

     return super.clone(); 
    } 
    @Override 
    public String toString() { 
     return "B [name=" + name + "]"; 
    } 
} 
public class SubclassCloneTest { 

    public static void main(String[] args) throws CloneNotSupportedException { 

     B b = new B("sub class"); 
     B clonedB = (B) b.clone(); 
     System.out.println("original B = "+b); 
     System.out.println("cloned B = "+clonedB); 

    } 

} 

输出:

===A()=== 
===B(-)=== 
original B = B [name=sub class] 
cloned B = B [name=sub class] 
相关问题