亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Java類中為什么不能直接調用Object的clone()方法

Java類中為什么不能直接調用Object的clone()方法

慕森卡 2019-03-20 14:15:11
在Java中所有的類都是Object的子類。在Object類中有一個clone方法定義如下:protected native Object clone() throws CloneNotSupportedException;該方法的修飾符為protected,表示該方法可以在子類中調用然后結果是調用不了網上有回答是需要實現Cloneable接口,但即使實現了,也調用不到。不實現Cloneable接口,只是報CloneNotSupportedException異常。只能重寫clone方法,并且使用super.clone()疑惑這是為什么呢?
查看完整描述

5 回答

?
weixin_慕村3541823

TA貢獻1條經驗 獲得超4個贊

我想我明白你問的是什么。

舉個例子:

clone()方法是Object里面的protected方法,只允許在同包和子類內部調用。

現在有一個類Cat,默認繼承Object,所以假如你的調用測試寫在Cat類里面,那么是可以調用的。

但是假如你在和Cat同包的下面寫了一個Test測試類,并嘗試在Test里面實例化Cat,并調用clone(),是無法調用的。

原因是,假如Cat沒有重寫clone()方法,Cat調用的clone()方法是Object類的,而Test類和Object不同包。你可能會問Test也是Object的子類呀?是的沒錯,你可以在子類內部調用自己的clone()方法,但是你不可以調用你兄弟類的clone()方法,protected的語義就是這樣的。


查看完整回答
4 反對 回復 2020-10-08
?
慕婉清6304310

TA貢獻1條經驗 獲得超0個贊

protected方法在子類中可調用特指通過對應子類對象調用 而不是父類的其他子類的對象或父類對象 lz的例子就是通過在子類中通過父類的其他子類的對象調用父類的protected方法,所以編譯通過不了 我一開始也沒弄清楚有跟lz一樣的疑問 納悶了好久
查看完整回答
反對 回復 2021-09-19
?
aluckdog

TA貢獻1847條經驗 獲得超7個贊

clone() 是protected的作用域。繼承Cloneable接口后要重寫方法,然后在方法里調用父類的clone()的方法。同時默認的克隆對于引用對象只是淺克隆。給你一段代碼自己去運行試試吧:


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();

        }

    }

}

其中A繼承了cloneable接口,同時持有了對B的引用。


查看完整回答
反對 回復 2019-04-25
?
陪伴而非守候

TA貢獻1757條經驗 獲得超8個贊

實現接口Cloneable,重寫clone()方法。


查看完整回答
反對 回復 2019-04-25
?
慕姐8265434

TA貢獻1813條經驗 獲得超2個贊

實現了Cloneable接口如果不重寫clone方法,將clone方法的權限等級上升到public,因為繼承下來的clone是protected權限,那么clone方法只能在子類調用,不能被外部類調用。


查看完整回答
反對 回復 2019-04-25
  • 5 回答
  • 1 關注
  • 3547 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號