推 roder: 在執行A的時候 Class B還沒有被建構出來 當然不會過 10/11 18:57
推 cyclone350: static method 的範圍跟一般 class method 不一樣 10/11 19:44
→ minGW128: 謝謝樓上兩位 我也只能這樣說服我自己 否則觀念很難連貫 10/11 19:54
→ cyclone350: 就像你在 static method 沒辦法使用 this 一樣 10/11 20:10
→ ssccg: 這跟static和先後沒關係,class宣告先後沒有差 10/11 22:05
→ ssccg: private不會被繼承,用B的reference是不能呼叫的 10/11 22:06
→ ssccg: 改成 ((A)b).showData(); 就可以 10/11 22:06
→ ssccg: 不是看scope,是看reference是什麼type 10/11 22:09
→ ssccg: 在class A中只是隱含都用type A的this reference去呼叫 10/11 22:10
推 cyclone350: 我知道ssccg的意思... 但是原po是問為什麼在A的method 10/11 22:23
→ cyclone350: 裡面無法用A的方法。恩... 的確跟static沒關係,搞錯 10/11 22:24
→ cyclone350: 抱歉 XD 10/11 22:24
萬分感謝ssccg!
我測試了一下
class A {
public static void main(String[] args) {
B b = new B();
((A)b).showData();
}
private int data = 10;
private void showData() {
System.out.println(data);
}
}
class B extends A {
}
這樣的確可以正確編譯!
但是如果是
class A {
private int data = 10;
private void showData() {
System.out.println(data);
}
}
class B extends A {
}
class Main {
public static void main(String[] args) {
B b = new B();
((A)b).showData(); // wrong here
// The method showData() from the type A is not visible
}
}
也就是把((A)b).showData();寫在class A的scope之外
仍然還是不行的,無法通過編譯
所以class scope對於class private member可否access也是考量因素之一?
※ 編輯: minGW128 (220.136.226.85), 10/11/2014 23:18:57
→ ssccg: 沒錯還是要在class裡面才能用 10/12 00:11
→ ssccg: 應該說非static的member,除了scope還要看reference type 10/12 00:14