作者:
minGW128 (minGW128)
2014-10-11 18:53:58各位好,我今天想要釐清我自己對於private data/method繼承的觀念
所以試著打了一些小範例:
class A {
private int data = 10;
private void showData() {
System.out.println(data);
}
}
class B extends A {
}
我對private的繼承觀念是:class B內還是會繼承class A的data與showData()
private只是限制data與showData()只能在class A內scope內使用
所以以下範例,我可以理解為什麼會錯
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();
b.showData();
// wrong, showData() can only be accessed within the scope
// of class A
}
}
錯誤的地方是由於b.showData()的使用地方,是在class A的scope之外
但是以下範例,我就不能理解為什麼編譯不過了
class A {
public static void main(String[] args) {
B b = new B();
b.showData(); // wrong! I don't know why
}
private int data = 10;
private void showData() {
System.out.println(data);
}
}
class B extends A {
}
這個範例中,b.showData()是在class A的scope中
請問為什麼不行呢?是不是我對繼承或是private有甚麼理解錯誤的地方?
謝謝大家!
作者:
roder (å°Šé‡ q( ̄︶ ̄)p 包容)
2014-10-11 18:57:00在執行A的時候 Class B還沒有被建構出來 當然不會過
static method 的範圍跟一般 class method 不一樣
作者: minGW128 (minGW128) 2014-10-11 19:54:00
謝謝樓上兩位 我也只能這樣說服我自己 否則觀念很難連貫
就像你在 static method 沒辦法使用 this 一樣
作者:
ssccg (23)
2014-10-11 22:05:00這跟static和先後沒關係,class宣告先後沒有差private不會被繼承,用B的reference是不能呼叫的改成 ((A)b).showData(); 就可以不是看scope,是看reference是什麼type在class A中只是隱含都用type A的this reference去呼叫
我知道ssccg的意思... 但是原po是問為什麼在A的method裡面無法用A的方法。恩... 的確跟static沒關係,搞錯抱歉 XD
作者:
ssccg (23)
2014-10-12 00:11:00沒錯還是要在class裡面才能用應該說非static的member,除了scope還要看reference type