Re: [問題] Object的clone()問題
※ 引述《michael47 (hitman)》之銘言:
: 請問Object class的method, clone(),的modifier是設為protected,
: 對於protected的method,不是只要是該class的descendant就可以call嗎?
: 但是所有的objects不是都是Object class的descendants嗎?
: 如果是這樣,為何其它的class不能直接使用Object的clone()?
樓上說的沒錯,
這樣設計是為了讓你自行 override clone() 成為 public method,
請參考:
http://docs.oracle.com/javase/6/docs/api/java/lang/Cloneable.html
http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html#clone%28%29
但其實並沒有回答到關於 protected 修飾的部份。
Update!
-------
沒想到回這篇的代價這麼大 XD
在推文被指出錯誤了之後,回頭翻了一下過去的筆記:
http://tkcnandy.blogspot.tw/2009/12/java-access-modifiers.html
才發現我今天這篇文章實在是錯得離譜 (遮臉)
我想重點應該是 blog 文章中的第三項,以下是我重新寫成的版本:
protected 所修飾之 member,
若其 subclass 與 base class 屬於不同 package,
則可將該 member 視為 subclass 的 private member。
印象中這應該是我在讀 SCJP 聖經本時所做的筆記,
但剛剛試著找了一下,沒有在網路上看到任何類似的描述,
不知道各位是否認同這樣的解釋方式?
-------
Update 結束,以下為一開始回的錯誤訊息,閱讀時請多加留意以免被誤導。
根據這裡的定義:
http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html
The protected modifier specifies that the member can only be accessed
within its own package (as with package-private) and,
in addition, by a subclass of its class in another package.
subclass 的部份指的其實是這種情況:
---
class Child {
public void invokeByChild() throws Exception {
super.clone(); // Ok! Access via subclass
}
}
public class Other {
public static void main (String [] args) {
new Child().clone();
// Error! 你只是持有 (Object 的) subclass
// caller 其實是 Other 而不是 Child。
}
}
---
其實多想想就會覺得理所當然,
權限肯定要用 caller 來判斷,而不是 refrence 到的 object,
否則豈不是任何一個你持有的 object,都可以直接呼叫 private method 了嗎? XD
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.34.7.189
推
03/06 23:21, , 1F
03/06 23:21, 1F
是呀,所有的 class 都可以呼叫自身所對應的 object 的 clone(),
但不能呼叫其他物件的 clone()。
---
public class Other {
public static void main (String [] args) {
new Object().clone(); // (1)
try {
new Other().clone(); // (2)
} catch (CloneNotSupportedException e) {}
}
}
---
(1) 會 compile error,但 (2) 是 ok 的。
※ 編輯: tkcn 來自: 114.34.7.189 (03/06 23:27)
推
03/06 23:24, , 2F
03/06 23:24, 2F
推
03/06 23:27, , 3F
03/06 23:27, 3F
→
03/06 23:29, , 4F
03/06 23:29, 4F
→
03/06 23:30, , 5F
03/06 23:30, 5F
越聽越糊塗,我猜你說的是 Object 這個類別,
但 "這個類別不能直接呼叫 Object 的 clone()" 指的是什麼?
是說 Object 中的 static method 不能呼叫 clone()?
還是 Object 中的 instance method 不能呼叫 clone()?
但實際上兩者都可以。
如果你指的是其他情況,建議你還是附上 code 吧。
※ 編輯: tkcn 來自: 114.34.7.189 (03/06 23:37)
→
03/06 23:36, , 6F
03/06 23:36, 6F
→
03/06 23:38, , 7F
03/06 23:38, 7F
推
03/06 23:39, , 8F
03/06 23:39, 8F
→
03/06 23:41, , 9F
03/06 23:41, 9F
推
03/06 23:51, , 10F
03/06 23:51, 10F
→
03/06 23:53, , 11F
03/06 23:53, 11F
→
03/06 23:55, , 12F
03/06 23:55, 12F
→
03/07 00:01, , 13F
03/07 00:01, 13F
→
03/07 00:02, , 14F
03/07 00:02, 14F
→
03/07 00:02, , 15F
03/07 00:02, 15F
→
03/07 00:07, , 16F
03/07 00:07, 16F
推
03/07 00:08, , 17F
03/07 00:08, 17F
→
03/07 00:11, , 18F
03/07 00:11, 18F
為了留下紀錄,但又避免誤導板友,所以我更新在文章前段了。
※ 編輯: tkcn 來自: 114.34.7.189 (03/07 01:03)
→
03/07 01:54, , 19F
03/07 01:54, 19F
→
03/07 10:31, , 20F
03/07 10:31, 20F
→
03/07 10:34, , 21F
03/07 10:34, 21F
→
03/07 10:35, , 22F
03/07 10:35, 22F
討論串 (同標題文章)
java 近期熱門文章
PTT數位生活區 即時熱門文章