作者sbrhsieh (十年一夢)
看板java
標題Re: [問題] Object的clone()問題
時間Fri Mar 7 02:56:04 2014
※ 引述《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