作者sbrhsieh (十年一梦)
看板java
标题Re: [问题] 在子类别new建构子为protected的父类别
时间Sun May 11 22:08:39 2014
※ 引述《lovdkkkk (dk)》之铭言:
: 稍做补充
: 根据定义,连 call 方法也是不行的,
: 也就是在 Test2 中以下这行也会错:
:
: // 假设 Test 有一个 public constructor
: // 并有一个 protected method
: new PublicConstructorOfTest().protectedMethod();
:
: 因为 Test 并不是自己的 subclass,
: 不能在其它 package 中生一个 Test 的实体,
: 然後透过它来 call Test 的 protected 方法。
:
: 实测下来结果也是如此,参见 gist
: https://gist.github.com/anonymous/2d80bf9eb1581ed05fc6
:
: --
:
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 36.226.196.214
: ※ 文章网址: http://webptt.com/cn.aspx?n=bbs/java/M.1399775273.A.2D9.html
: ※ 编辑: lovdkkkk (36.226.196.214), 05/11/2014 10:29:09
: → lovdkkkk:贴完 github 马上挂掉...0rz 05/11 10:37
: → sbrhsieh:都搞错重点,跟 constructor 算不算 member 没关系 05/11 20:35
: → sbrhsieh:跟 Test 是不是自己的 subclass 也没关系。 05/11 20:36
: → sbrhsieh:new Test().protectedMethod(); 合不合格是看 statement 05/11 20:38
: → sbrhsieh:出现的context。不要往为什麽一个Test object 会不能执行 05/11 20:40
: → sbrhsieh:自己的 protected method 这方向硬要想一个理由。 05/11 20:41
:
: 我只是很单纯的照官方文件说法去看
:
: 截录:
:
: 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 去看 @@
: ※ 编辑: lovdkkkk (36.226.196.214), 05/11/2014 21:22:42
是不是 package 或 subclass 是指 member access(含 method call/field access/
construction) expression 所在的 context。
以这个例子来说:
new Test(...).protectedMethod();
是看这一串(statement/expression)出现在哪个 class 里,由这个 class 的处境
来看是否可以接受此等 access,而不是看 new Test(...) 这个 object 所属的
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 这种单纯的描述。
有一群人倾向以继承的观点来看,我觉得这是个比较好的看法。
即使 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,不论 Test/Test2 间有无继承关系,
protected 是扩充 package default 规则加上 protected member 可以"落到"
不同 package 下的 subclass 里)
*不用"继承"实因个人觉得还是有误解的可能。说"界面继承"可能稍明确一点,
我认为 package default/protected/private modifier 会造成界面没有继承
但实作有继承下来这种现象(假如继承是一种 subclass object 内嵌 base object
的状况)。
// 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 语法层面的规范是这样的。
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 218.173.233.189
※ 文章网址: http://webptt.com/cn.aspx?n=bbs/java/M.1399817324.A.3EA.html
※ 编辑: sbrhsieh (218.173.233.189), 05/11/2014 22:13:16
※ 编辑: sbrhsieh (218.173.233.189), 05/11/2014 22:43:53
※ 编辑: sbrhsieh (218.173.233.189), 05/11/2014 22:48:28