[問題] 請問private繼承的問題

作者: 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還沒有被建構出來 當然不會過
作者: cyclone350 (老子我最神)   2014-10-11 19:44:00
static method 的範圍跟一般 class method 不一樣
作者: minGW128 (minGW128)   2014-10-11 19:54:00
謝謝樓上兩位 我也只能這樣說服我自己 否則觀念很難連貫
作者: cyclone350 (老子我最神)   2014-10-11 20:10: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去呼叫
作者: cyclone350 (老子我最神)   2014-10-11 22:23:00
我知道ssccg的意思... 但是原po是問為什麼在A的method裡面無法用A的方法。恩... 的確跟static沒關係,搞錯抱歉 XD
作者: ssccg (23)   2014-10-12 00:11:00
沒錯還是要在class裡面才能用應該說非static的member,除了scope還要看reference type

Links booklink

Contact Us: admin [ a t ] ucptt.com