Rumah  >  Soal Jawab  >  teks badan

Java类中为什么不能直接调用Object的clone()方法

在Java中所有的类都是Object的子类。

在Object类中有一个clone方法定义如下:

protected native Object clone() throws CloneNotSupportedException;

该方法的修饰符为protected,表示该方法可以在子类中调用


然后结果是调用不了

网上有回答是需要实现Cloneable接口,但即使实现了,也调用不到。
不实现Cloneable接口,只是报CloneNotSupportedException异常。

只能重写clone方法,并且使用super.clone()

疑惑这是为什么呢?

黄舟黄舟2762 hari yang lalu1072

membalas semua(5)saya akan balas

  • 巴扎黑

    巴扎黑2017-04-18 10:18:27

    Antara muka Boleh Diklon hanyalah bendera, ia kosong
    Kaedah klon Objek ialah kaedah tempatan, yang lebih cekap
    Beberapa syarat untuk menggunakan kaedah klon

    1)在派生类中实现Cloneable借口。
    

     2) Untuk mendapatkan salinan objek, kita boleh menggunakan kaedah klon kelas Objek.

     3) Gantikan kaedah klon terkumpul dalam kelas terbitan dan isytiharkannya sebagai awam.

    4) Dalam kaedah klon kelas terbitan, panggil super.clone().

    Untuk butiran lanjut, anda boleh rujuk
    http://www.cnblogs.com/gw811/...

    balas
    0
  • PHPz

    PHPz2017-04-18 10:18:27

    Anda boleh menghubungi:

    public class Test implements Cloneable{
        private int foo;
    
        public Test(int foo) {
            this.foo = foo;
        }
    
        @Override
        protected Object clone() throws CloneNotSupportedException {
            return super.clone();
        }
    
        public int getFoo() {
            return foo;
        }
    
        public static void main(String[] args) throws CloneNotSupportedException {
            Test test = new Test(1);
            Test cloned = (Test) test.clone();
            System.out.println(cloned.getFoo());
        }
    }

    balas
    0
  • 怪我咯

    怪我咯2017-04-18 10:18:27

    klon() ialah skop yang dilindungi. Selepas mewarisi antara muka Boleh Diklon, anda perlu mengatasi kaedah tersebut, dan kemudian memanggil kaedah klon() kelas induk dalam kaedah tersebut. Pada masa yang sama, klon lalai hanyalah klon cetek objek rujukan. Biar saya berikan anda sekeping kod untuk dijalankan dan cuba sendiri:

    package cesar.Test0810;
    
    /**
     * Created by Cesar on 2016/8/10.
     */
    public class A implements Cloneable{
    
        private int a;
        private B b;
    
        public int getA() {
            return a;
        }
    
        public void setA(int a) {
            this.a = a;
        }
    
        public B getB() {
            return b;
        }
    
        @Override
        public String toString() {
            return "A{" +
                    "a=" + a +
                    ", b=" + b +
                    '}';
        }
    
        public void setB(B b) {
            this.b = b;
        }
    
        protected A clone() throws CloneNotSupportedException {
            return (A) super.clone();
        }
    }
    
    package cesar.Test0810;
    
    /**
     * Created by Cesar on 2016/8/10.
     */
    public class B {
    
        private int b1;
        private int b2;
    
        @Override
        public String toString() {
            return "B{" +
                    "b1=" + b1 +
                    ", b2=" + b2 +
                    '}';
        }
    
        public B(int b1, int b2){
            this.b1 = b1;
            this.b2 = b2;
        }
    
        public int getB1() {
            return b1;
        }
    
        public void setB1(int b1) {
            this.b1 = b1;
        }
    
        public int getB2() {
            return b2;
        }
    
        public void setB2(int b2) {
            this.b2 = b2;
        }
    }
    package cesar.Test0810;
    
    /**
     * Created by Cesar on 2016/8/10.
     */
    public class TestClone {
    
        public static void main(String[] args) {
    
            A a = new A();
            B b = new B(1, 2);
    
            a.setA(10);
            a.setB(b);
            try {
                A a1 = a.clone();
                System.out.println("a=" + a.toString());
                System.out.println("a1=" + a1.toString());
    
                a.setA(1000);
                a.getB().setB1(10000);
                a.getB().setB2(8000);
    
                System.out.println("a=" + a.toString());
                System.out.println("a1=" + a1.toString());
    
                a.setB(new B(9999,9999));
    
                System.out.println("a=" + a.toString());
                System.out.println("a1=" + a1.toString());
    
    
            } catch (CloneNotSupportedException e) {
                e.printStackTrace();
            }
        }
    }
    
    • Antaranya, A mewarisi antara muka boleh klon dan memegang rujukan kepada B.

    balas
    0
  • PHP中文网

    PHP中文网2017-04-18 10:18:27

    Laksanakan antara muka Boleh Diklon dan ganti kaedah klon().

    balas
    0
  • 天蓬老师

    天蓬老师2017-04-18 10:18:27

    Saya sangat keliru apabila saya mula-mula melihatnya, saya mencubanya dan mendapati kaedah klon dalam objek dipanggil secara langsung.
    Kod adalah seperti berikut:

    CommonTest kelas awam melaksanakan Boleh Diklon{

    public static String name  = "hell0";
    public static void main(String[] args){
    
        try{
            CommonTest aa = new CommonTest();
            CommonTest ee = (CommonTest) aa.clone();
            System.out.println("Clone succeed");
            System.out.println(ee.name);
        }catch (CloneNotSupportedException e) {
            System.out.print("clone failed");
        }
    }

    }

    balas
    0
  • Batalbalas