作者lovdkkkk (dk)
看板java
标题Re: [问题] 在子类别new建构子为protected的父类别
时间Sun May 11 22:49:03 2014
※ 引述《sbrhsieh (十年一梦)》之铭言:
: : 实测下来结果也是如此,参见 gist
: : https://gist.github.com/anonymous/2d80bf9eb1581ed05fc6
: : --
: : 我只是很单纯的照官方文件说法去看
: : 截录:
: : within its own package (as with package-private) and, in addition,
: : by a subclass of its class in another package.
: : 官方说明的就是这两个条件
: : 1. 在同 package 里 call
: : 2. 由 subclass call
: : 所以我才会由
: : 是不是同 package 或 是不是 subclass 去看 @@
: 是不是 package 或 subclass 是指 member access(含 method call/field access/
: construction) expression 所在的 context。
: 以这个例子来说:
: new Test(...).protectedMethod();
: 试看这一串(statement/expression)出现在哪个 class 里,由这个 class 的处境
: 来看是否可以接受此等 access,而不是看 new Test(...) 这个 object 所属的
: class。
以上与我的认知相同,不是看所属 class。
: 你在文中所提(红色部分),我感觉上就是不对劲。到底能不能透过 protected
: constructor 来建构 Test object,与 call 一个 Test object 的 protected
: method 是跟这些操作是出现在哪个 class 有关,与 Test 是不是 Test 的
: subclass 没有任何关系。
: 你会加上 Test 不是 Test subclass 这一点来说服你自己,表示你还是对 protected
: 的意义误解。你无法说服你自己为什麽在 Test 的 subclass 里无法透过 protected
: constructor 建构 Test instance,也不能 call Test object 的 protected
: method,你解读 spec. 的认知还是停留在 protected member 可以在 subclass 里
: access 这种单纯的描述。
不...是因为文件这麽写啊 @@",
文件说 在同 package 内 或 被 subclass call 可以,
那在不同 package 内时不行,
应该就是因为也不是被 subclass call。
: 有一群人倾向以继承的观点来看,我觉得这是个比较好的看法。
: 即使 Test2 与 Test 处在不同 package,但是 Test2 extends Test 使得 Test 的
: 所有 protected field/method 如同定义在 Test2 class 里。所以 Test2 object
: 可以去存取/执行任一个 Test2 object(同类)的这些(继承下来的) field/method。
: (同类之间的 private field/method 也都可以互相 access/call)
: 但是 Test2 extend Test 不代表 Test2 就定可以存取 Test class 所定义的
: protected field/method。(Test/Test2 不同 package 时还是不行,同 package 下
: 则同 package default 的规范,是可以的)
: // in class Test2 extends Test
: public void someMethod(Test t1, Test2 t2) {
: t1.protectedMethod();
: t2.protectedMethod();
: this.protectedMethod();
: }
: 第一个 statement 与 2nd, 3rd statement 意义是不同的,前者是要 invoke
: Test::protectedMethod(),後者是 Test2::protectedMethod,所以两者合不合格
: 所聚的焦点是不同的。
: 1. Test2 可不可以 access Test::protectedMethod。 /* No */
: 2/3. Test2 可不可以 access Test2::protectedMethod。/* Yes */(透过继承
: Test2 确实有这个 protectedMethod,Test2 的 private method 都可以
: access 了,故...)
: 尽管最後在 runtime 所执行(if possible) 其实是同一个 method implementation,
: 但就 Java PL 语法层面的规范是这样的。
意思是 call 自己的与 invoke 别人的的差别?
如果这是主因,而和 Test 是不是自己的 subclass 无关的话...
这样去想感觉有点更复杂,先暂停 XDD
(super.protectedMethod 之类...
痾,暂停暂停)
总之,受教了。
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 36.226.196.214
※ 文章网址: http://webptt.com/cn.aspx?n=bbs/java/M.1399819745.A.595.html
1F:推 sbrhsieh:自己与别人有些笼统,access规则是看 class与 class之间 05/11 22:51
2F:推 sbrhsieh:不是 instance 与 instance 之间 05/11 22:59