作者tkcn (sayuan)
看板java
标题Re: [问题] Object的clone()问题
时间Thu Mar 6 22:52:05 2014
※ 引述《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
1F:推 michael47:我的意思是所有的class都是Object class的subclass 03/06 23:21
是呀,所有的 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)
2F:推 michael47:或者是Object class,为何不能直接呼叫Object的clone()? 03/06 23:24
3F:推 michael47:Object class不是所有class的base class? 03/06 23:27
4F:→ tkcn:我不懂你的 Object class 指的是什麽 03/06 23:29
5F:→ michael47:请注意Object的O是大写 03/06 23:30
越听越糊涂,我猜你说的是 Object 这个类别,
但 "这个类别不能直接呼叫 Object 的 clone()" 指的是什麽?
是说 Object 中的 static method 不能呼叫 clone()?
还是 Object 中的 instance method 不能呼叫 clone()?
但实际上两者都可以。
如果你指的是其他情况,建议你还是附上 code 吧。
※ 编辑: tkcn 来自: 114.34.7.189 (03/06 23:37)
6F:→ sbrhsieh:原po对 protected 修饰词的认知是错误的 03/06 23:36
7F:→ sbrhsieh:Subobject 只能碰继承下来的 protected member 03/06 23:38
8F:推 dream1124:是啊,他还觉得别人没回到他的问题,有中文连结也不看 03/06 23:39
9F:→ sbrhsieh:Not other instances of base class的 protected member 03/06 23:41
10F:推 michael47:很抱歉我有dream1124提供的连结,我的问题跟继承有关 03/06 23:51
12F:→ michael47:里面的Anand的问题一样,很抱歉麻烦大家看一下 03/06 23:55
13F:→ bitlife:「// caller 其实是 Other 而不是 Child 」这行不对 03/07 00:01
14F:→ tkcn:我好像知道我错在哪了,找一下资料 03/07 00:02
15F:→ bitlife:caller是Child. 会错是因为protected只能在member中叫用 03/07 00:02
16F:→ bitlife:(当然还有同package) 03/07 00:07
17F:推 PsMonkey:我是路过的 [喂喂],我觉得先不要扯 clone() 会比较好 03/07 00:08
18F:→ tkcn:知道错误在哪了,感谢各位指正。 03/07 00:11
为了留下纪录,但又避免误导板友,所以我更新在文章前段了。
※ 编辑: tkcn 来自: 114.34.7.189 (03/07 01:03)
19F:→ tkcn:另求 JLS 对这部份进行说明的章节,我找不到。 03/07 01:54
20F:→ bitlife:更正:我应该误会了那行的caller的意义,原po应该是指单纯的 03/07 10:31
21F:→ bitlife:call stack中的caller function所属类别.我想成叫用callee 03/07 10:34
22F:→ bitlife:时的「this」的所属类别 03/07 10:35