作者minGW128 (minGW128)
看板java
標題[問題] 請問private繼承的問題
時間Sat Oct 11 18:53:58 2014
各位好,我今天想要釐清我自己對於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有甚麼理解錯誤的地方?
謝謝大家!
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 220.136.226.85
※ 文章網址: http://webptt.com/m.aspx?n=bbs/java/M.1413024841.A.379.html
1F:推 roder: 在執行A的時候 Class B還沒有被建構出來 當然不會過 10/11 18:57
2F:推 cyclone350: static method 的範圍跟一般 class method 不一樣 10/11 19:44
3F:→ minGW128: 謝謝樓上兩位 我也只能這樣說服我自己 否則觀念很難連貫 10/11 19:54
4F:→ cyclone350: 就像你在 static method 沒辦法使用 this 一樣 10/11 20:10
5F:→ ssccg: 這跟static和先後沒關係,class宣告先後沒有差 10/11 22:05
6F:→ ssccg: private不會被繼承,用B的reference是不能呼叫的 10/11 22:06
7F:→ ssccg: 改成 ((A)b).showData(); 就可以 10/11 22:06
8F:→ ssccg: 不是看scope,是看reference是什麼type 10/11 22:09
9F:→ ssccg: 在class A中只是隱含都用type A的this reference去呼叫 10/11 22:10
10F:推 cyclone350: 我知道ssccg的意思... 但是原po是問為什麼在A的method 10/11 22:23
11F:→ cyclone350: 裡面無法用A的方法。恩... 的確跟static沒關係,搞錯 10/11 22:24
12F:→ 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
13F:→ ssccg: 沒錯還是要在class裡面才能用 10/12 00:11
14F:→ ssccg: 應該說非static的member,除了scope還要看reference type 10/12 00:14