作者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)
1F:推 michael47:蓝色的部份是说subclass本身也要有member M才可以吗? 03/07 11:59
2F:推 michael47:所以我上面使用clone()方式要是foo有自己定义clone() 03/07 12:02
3F:→ michael47:然後在foo的clone()里面使用super.clone()这样就可以吗? 03/07 12:04