Re: [問題] 在子類別new建構子為protected的父類別
※ 引述《pzyc79 (I'm bored)》之銘言:
: 標題: [問題] 在子類別new建構子為protected的父類別
: 時間: Sun May 11 00:53:48 2014
:
: ===============Class Test:===============
: package a;
:
: public class Test {
: protected Test(){
: }
: }
:
: ===============Class Test2:==============
: package b;
:
: import a.Test;
:
: public class Test2 extends Test{
: void fun(){
: Test t = new Test(); //Test() is not visible
: }
: }
:
: WHY? 宣告protected不是可以在子類別中看見嗎?
我覺得這一篇的問題同 #1J5-rnUZ [問題] Object的clone()問題。
就是誤解了 protected member 可被不同 package 的 subtype 存取的意義。
先把你的 sample code 稍微改成這樣:
// a/Test.java
package a;
public class Test {
protected Test() {
System.out.println("Test::Test()");
}
}
// b/Test2.java
package b;
import a.Test;
public class Test2 extends Test {
public static void main(String[] args) {
new Test2();
}
}
編譯沒問題啊,那麼 Test2 的確可以"看的見" Test 的 protected constructor 呀,
不然編譯器幫你添加的 public Test2::Test2() constructor 怎麼可以 invoke
Test::Test() constructor?(跑跑看 b.Test2 驗證一下)
:
: --
: ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.240.30.17
: ※ 文章網址: http://www.ptt.cc/bbs/java/M.1399740834.A.2E7.html
: ※ 編輯: pzyc79 (111.240.30.17), 05/11/2014 00:56:05
: 推 luoqr:是在 new Test2() 時 super() 看的見, 不是在new Test()看見 05/11 01:00
:
: ===============Class Test:===============
: package a;
:
: public class Test {
: Test(){
: }
: }
:
: ===============Class Test2:==============
: package a;
:
: import a.Test;
:
: public class Test2 extends Test{
: void fun(){
: Test t = new Test(); //OK
: }
: }
:
: 照你說的「是在new Test2()時super()看的見 ,不是在 new Test() 看見 那換成這樣…… 在new Test()又看的見了?
: ※ 編輯: pzyc79 (111.240.30.17), 05/11/2014 01:33:01
這個例子完全被 package default 的規則所涵蓋了,我不知道舉這樣的例子是
強調什麼?
根據 protected 的規則(扣掉 package default 相關的部份):
Test2 object 只能碰自己承襲而來的那份由 Test 所定義的 subobject 的 protected
member。
什麼意思呢?
把 Test/Test2 再稍微修成:
// Test.java
package a;
public class Test {
protected Test() {
System.out.println("Test::Test()");
}
public Test(String notImportant) {
System.out.println("Test::Test(String)");
}
protected void foo() {
System.out.println("Test::foo()");
}
}
// Test2.java
package b;
import a.Test;
public class Test2 extends Test {
public static void main(String[] args) {
new Test2().bar();
}
public void bar() {
System.out.println("<Test2::bar()>");
foo(); // 同 this.foo();
System.out.println("</Test2::bar()>");
}
}
這沒有問題,Test2 object 還是可以要求他自己(或體內的那份 Test subobject,
看你喜歡怎麼去看這回事)去執行 foo 操作。protected 修飾詞加在 constructor/
non-constructor 的意義無不同(回你在他帖中的推文)。
但是他不能要求別的 Test object 去執行 foo 操作。替 Test2 加上
public void fooBar(String s) {
System.out.println("<Test2::foobar(String)>");
new Test(s).foo();
System.out.println("</Test2::foobar(String)>");
}
是行不通的,因為 protected 賦予的就不是這麼寬。
如果要我類比的話(不過通常我舉得類比例子不多人看得懂),就像是你是你老爹的
兒子,故你可以去要求你爹的遺產,不管你有沒有跟你爹住在一起,或是跟你爹姓,
你不能夠去要求碰他人的老爹的遺產。
而 package default 的話則是只要住在同一個屋簷下,那你就可以偷同屋簷下
任一個人的錢,不管你稱不稱他為爹。
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.172.239.93
※ 文章網址: http://www.ptt.cc/bbs/java/M.1399747077.A.181.html
※ 編輯: sbrhsieh (1.172.239.93), 05/11/2014 02:45:16
推
05/11 09:29, , 1F
05/11 09:29, 1F
推
05/15 21:20, , 2F
05/15 21:20, 2F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 3 之 8 篇):
java 近期熱門文章
PTT數位生活區 即時熱門文章