看板 java 關於我們 聯絡資訊
※ 引述《michael47 (hitman)》之銘言: : public class foo { : int count; : } : public class Demo { : public static void main(String[] args) { : foo foo1 = new foo(); : foo foo2 = foo1.clone(); : /* 這裡呼叫的是Object class的clone() */ : /* 不是所有的objects都有繼承到Object class的clone()嗎? */ : /* 但是這樣好像不可以 */ : } : } : 我舉例的code很簡略,我的問題是為何不能直接使用Object的clone(), : Object的clone()不是protected,所有的objects不是Object class以及 : Object class的subclass的instances,為何不能直接使用Object的clone()? 既然 protected 的意義是 package default 的部份放寬,那麼就先說一下 package default 的部份。 當在 class A 的 context 下要存取 class B 的 package default member P, 假如定義 P 的 class 與 A 是處於同一個 package,那麼此存取是允許的; 若定義 P 的 class 與 A 處於不同 package,則此存取是被禁止的。 對於 protected member M,大致上和 P 相同,加上一個放寬的條件是: 在 class A context 下,當去存取自身或同一類的物件的 memebr M,若這個 M 是定義在 A 的任一個 base class C 裡,則此存取也是被允許的(不論 A 與 C 是不是在同一個 package)。 這個放寬必須在藍色存在的條件下,而不是單單去放寬紅色的部份。換句話說, 一個 object 可以存取自己身上或同類身上那份繼承而來的 protected member, 放寬的也儘儘如此而已。存取其他的 class 的 protected member 則等同存取 package default member。 那麼 class A 從 Object 繼承了 protected clone member,儘管 class A 與 Object 處於不同的 package 內,在 class A context 下去存取任一個 A object 的 clone member 是可以的,但不是存取其他 class 的 clone member 都可以(假如沒有再定義放寬成 public)。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 36.238.37.104 ※ 編輯: sbrhsieh 來自: 36.238.37.104 (03/07 02:57)
michael47:藍色的部份是說subclass本身也要有member M才可以嗎? 03/07 11:59
michael47:所以我上面使用clone()方式要是foo有自己定義clone() 03/07 12:02
michael47:然後在foo的clone()裡面使用super.clone()這樣就可以嗎? 03/07 12:04