<ruby id="bdb3f"></ruby>

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

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                ## Java專題十九:淺拷貝與深拷貝 [TOC] ### 19.1. clone方法 `clone`方法是`Object`類提供的一個用于對象拷貝的方法,且是`protected`,使用時需要類實現`java.lang.Cloneable`接口,否則將拋出`CloneNotSupportedException`異常 ~~~ // java.lang.Object protected native Object clone() throws CloneNotSupportedException; ~~~ 使用`clone`通常遵循的約定: - `x.clone() != x`返回ture - `x.clone().getClass() == x.getClass()`返回ture - `x.clone().equals(x)`返回ture ### 19.2. 淺拷貝 - 對于基本數據類型字段,直接賦值給新的對象 - 對于引用數據類型字段,復制對象引用(對象地址)到新的對象 - **問題**:**對新對象中引用數據類型字段的修改會一同修改源對象引用數據類型字段,因為兩個字段引用的是同一個對象地址** ### 19.3. 深拷貝 - 對于基本數據類型字段,直接賦值給新的對象 - 對于引用數據類型字段,為字段構造一個新的對象,并將源對象字段中每一個子字段賦值到新的對象字段中 假設有一個`Person`類,有眼睛(`eye`字段)和性別(`sex`字段),其中`sex`是基本數據類型,`eye`是引用數據類型 ~~~ public class Person{ public static final int SEX_MAN = 0; public static final int SEX_WOMAN = 0; private int sex; private Eye eye; public Person shallowCopy(){ Person dest = new Person(); dest.sex = this.sex; dest.eye = this.eye; return dest; } public Person deepCopy(){ Person dest = new Person(); dest.sex = this.sex; dest.eye = this.eye.deepCopy(); return dest; } @Override public String toString() { StringBuffer buffer = new StringBuffer(); buffer.append(getClass().getName() + "@" + Integer.toHexString(hashCode())) .append(": { ") .append("sex: ").append(sex).append(", ") .append("eye: ").append(eye.toString()) .append(" }"); return buffer.toString(); } public int getSex() { return sex; } public void setSex(int sex) { this.sex = sex; } public Eye getEye() { return eye; } public void setEye(Eye eye) { this.eye = eye; } } class Eye { public static final String COLOR_BLACK = "black"; public static final String COLOR_BLUE = "blue"; private String color; private int size; public Eye(String color, int size){ this.color = color; this.size = size; } public String getColor() { return color; } public void setColor(String color) { this.color = color; } public int getSize() { return size; } public void setSize(int size) { this.size = size; } public Eye deepCopy(){ return new Eye(this.color, this.size); } public String toString() { StringBuffer buffer = new StringBuffer(); buffer.append(getClass().getName() + "@" + Integer.toHexString(hashCode())) .append(": { ") .append("color: ").append(color).append(", ") .append("size: ").append(size) .append(" }"); return buffer.toString(); } } ~~~ ### 19.4. 實現方法 #### 19.4.1. 淺拷貝 ##### 19.4.1.1. 使用shalldowCopy方法 shalldowCopy為自定義的方法,在方法中,直接構造一個新對象,將源對象的每一個字段使用`=`賦值給新對象中,調用shalldowCopy()方法即可完成淺拷貝 ##### 19.4.1.2. 使用clone方法 重寫`clone`方法,在類的`clone`方法種直接調用`super.clone()`,調用clone()方法即可完成淺拷貝 ~~~ public class Person implements Cloneable { public Person clone(){ Person dest = null; try{ dest = (Person) super.clone(); } catch (CloneNotSupportedException e){ e.printStackTrace(); } return dest; } } ~~~ #### 19.4.2. 深拷貝 ##### 19.4.2.1. 使用deepCopy方法 deepCopy為自定義的方法,在方法中,直接構造一個新對象,對源對象的基本數據類型字段使用`=`賦值給新對象中,對于引用數據類型使用deepCopy方法賦值,調用deepCopy()方法即可完成深拷貝 ##### 19.4.2.2. 使用clone方法 重寫`clone`方法,在類的`clone`方法種調用`super.clone()`,對于引用數據類型使用deepCopy方法賦值,調用clone()方法即可完成深拷貝 ~~~ public class Person implements Cloneable { public Person clone(){ Person dest = null; try{ dest = (Person) super.clone(); dest.eye = dest.eye.deepCopy(); } catch (CloneNotSupportedException e){ e.printStackTrace(); } return dest; } } ~~~
                  <ruby id="bdb3f"></ruby>

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

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看