<pre id="bbfd9"><del id="bbfd9"><dfn id="bbfd9"></dfn></del></pre>

          <ruby id="bbfd9"></ruby><p id="bbfd9"><mark id="bbfd9"></mark></p>

          <p id="bbfd9"></p>

          <p id="bbfd9"><cite id="bbfd9"></cite></p>

            <th id="bbfd9"><form id="bbfd9"><dl id="bbfd9"></dl></form></th>

            <p id="bbfd9"><cite id="bbfd9"></cite></p><p id="bbfd9"></p>
            <p id="bbfd9"><cite id="bbfd9"><progress id="bbfd9"></progress></cite></p>
            java語言

            Java筆試試題如何實現對象克隆?

            時間:2025-03-23 00:42:25 java語言 我要投稿
            • 相關推薦

            Java筆試試題如何實現對象克隆?

              引導語:在java面向對象的編程當中,要復制引用類型的對象,就必須克隆這些對象。以下是百分網小編分享給大家的Java筆試試題如何實現對象克隆?,歡迎參考學習!

            Java筆試試題如何實現對象克隆?

              如何實現對象克隆?

              答:有兩種方式:

              1). 實現Cloneable接口并重寫Object類中的clone()方法;

              2). 實現Serializable接口,通過對象的序列化和反序列化實現克隆,可以實現真正的深度克隆,代碼如下。

            1
            2
            3
            4
            5
            6
            7
            8
            9
            10
            11
            12
            13
            14
            15
            16
            17
            18
            19
            20
            21
            22
            23
            24
            import java.io.ByteArrayInputStream;
            import java.io.ByteArrayOutputStream;
            import java.io.ObjectInputStream;
            import java.io.ObjectOutputStream;
             
            public class MyUtil {
             
                private MyUtil() {
                    throw new AssertionError();
                }
             
                public static <T> T clone(T obj) throws Exception {
                    ByteArrayOutputStream bout = new ByteArrayOutputStream();
                    ObjectOutputStream oos = new ObjectOutputStream(bout);
                    oos.writeObject(obj);
             
                    ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
                    ObjectInputStream ois = new ObjectInputStream(bin);
                    return (T) ois.readObject();
             
                    // 說明:調用ByteArrayInputStream或ByteArrayOutputStream對象的close方法沒有任何意義
                    // 這兩個基于內存的流只要垃圾回收器清理對象就能夠釋放資源,這一點不同于對外部資源(如文件流)的釋放
                }
            }

              下面是測試代碼:

            1
            2
            3
            4
            5
            6
            7
            8
            9
            10
            11
            12
            13
            14
            15
            16
            17
            18
            19
            20
            21
            22
            23
            24
            25
            26
            27
            28
            29
            30
            31
            32
            33
            34
            35
            36
            37
            38
            39
            40
            41
            42
            43
            44
            45
            46
            47
            48
            49
            50
            import java.io.Serializable;
             
            /**
             * 人類
             * @author 駱昊
             *
             */
            class Person implements Serializable {
                private static final long serialVersionUID = -9102017020286042305L;
             
                private String name;    // 姓名
                private int age;        // 年齡
                private Car car;        // 座駕
             
                public Person(String name, int age, Car car) {
                    this.name = name;
                    this.age = age;
                    this.car = car;
                }
             
                public String getName() {
                    return name;
                }
             
                public void setName(String name) {
                    this.name = name;
                }
             
                public int getAge() {
                    return age;
                }
             
                public void setAge(int age) {
                    this.age = age;
                }
             
                public Car getCar() {
                    return car;
                }
             
                public void setCar(Car car) {
                    this.car = car;
                }
             
                @Override
                public String toString() {
                    return "Person [name=" + name + ", age=" + age + ", car=" + car + "]";
                }
             
            }
            1
            2
            3
            4
            5
            6
            7
            8
            9
            10
            11
            12
            13
            14
            15
            16
            17
            18
            19
            20
            21
            22
            23
            24
            25
            26
            27
            28
            29
            30
            31
            32
            33
            34
            35
            36
            37
            38
            /**
             * 小汽車類
             * @author 駱昊
             *
             */
            class Car implements Serializable {
                private static final long serialVersionUID = -5713945027627603702L;
             
                private String brand;       // 品牌
                private int maxSpeed;       // 最高時速
             
                public Car(String brand, int maxSpeed) {
                    this.brand = brand;
                    this.maxSpeed = maxSpeed;
                }
             
                public String getBrand() {
                    return brand;
                }
             
                public void setBrand(String brand) {
                    this.brand = brand;
                }
             
                public int getMaxSpeed() {
                    return maxSpeed;
                }
             
                public void setMaxSpeed(int maxSpeed) {
                    this.maxSpeed = maxSpeed;
                }
             
                @Override
                public String toString() {
                    return "Car [brand=" + brand + ", maxSpeed=" + maxSpeed + "]";
                }
             
            }
            1
            2
            3
            4
            5
            6
            7
            8
            9
            10
            11
            12
            13
            14
            15
            16
            class CloneTest {
             
                public static void main(String[] args) {
                    try {
                        Person p1 = new Person("Hao LUO", 33, new Car("Benz", 300));
                        Person p2 = MyUtil.clone(p1);   // 深度克隆
                        p2.getCar().setBrand("BYD");
                        // 修改克隆的Person對象p2關聯的汽車對象的品牌屬性
                        // 原來的Person對象p1關聯的汽車不會受到任何影響
                        // 因為在克隆Person對象時其關聯的汽車對象也被克隆了
                        System.out.println(p1);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }

              注意:基于序列化和反序列化實現的克隆不僅僅是深度克隆,更重要的是通過泛型限定,可以檢查出要克隆的對象是否支持序列化,這項檢查是編譯器完成的,不是在運行時拋出異常,這種是方案明顯優于使用Object類的clone方法克隆對象。讓問題在編譯的時候暴露出來總是優于把問題留到運行時。

            【Java筆試試題如何實現對象克隆?】相關文章:

            Java試題筆試題目11-02

            Java如何面向對象08-15

            經典Java、Web筆試題04-27

            Java試題筆試題目答案06-18

            如何理解Java面向對象07-06

            java類筆試題目07-21

            Java基礎筆試題及答案09-20

            java如何實現漢諾塔08-08

            Java面試筆試題大全08-13

                    <pre id="bbfd9"><del id="bbfd9"><dfn id="bbfd9"></dfn></del></pre>

                    <ruby id="bbfd9"></ruby><p id="bbfd9"><mark id="bbfd9"></mark></p>

                    <p id="bbfd9"></p>

                    <p id="bbfd9"><cite id="bbfd9"></cite></p>

                      <th id="bbfd9"><form id="bbfd9"><dl id="bbfd9"></dl></form></th>

                      <p id="bbfd9"><cite id="bbfd9"></cite></p><p id="bbfd9"></p>
                      <p id="bbfd9"><cite id="bbfd9"><progress id="bbfd9"></progress></cite></p>
                      飘沙影院