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

看板java作者 (minGW128)時間10年前 (2014/10/11 18:54), 10年前編輯推噓3(3011)
留言14則, 4人參與, 最新討論串1/1
各位好,我今天想要釐清我自己對於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://www.ptt.cc/bbs/java/M.1413024841.A.379.html

10/11 18:57, , 1F
在執行A的時候 Class B還沒有被建構出來 當然不會過
10/11 18:57, 1F

10/11 19:44, , 2F
static method 的範圍跟一般 class method 不一樣
10/11 19:44, 2F

10/11 19:54, , 3F
謝謝樓上兩位 我也只能這樣說服我自己 否則觀念很難連貫
10/11 19:54, 3F

10/11 20:10, , 4F
就像你在 static method 沒辦法使用 this 一樣
10/11 20:10, 4F

10/11 22:05, , 5F
這跟static和先後沒關係,class宣告先後沒有差
10/11 22:05, 5F

10/11 22:06, , 6F
private不會被繼承,用B的reference是不能呼叫的
10/11 22:06, 6F

10/11 22:06, , 7F
改成 ((A)b).showData(); 就可以
10/11 22:06, 7F

10/11 22:09, , 8F
不是看scope,是看reference是什麼type
10/11 22:09, 8F

10/11 22:10, , 9F
在class A中只是隱含都用type A的this reference去呼叫
10/11 22:10, 9F

10/11 22:23, , 10F
我知道ssccg的意思... 但是原po是問為什麼在A的method
10/11 22:23, 10F

10/11 22:24, , 11F
裡面無法用A的方法。恩... 的確跟static沒關係,搞錯
10/11 22:24, 11F

10/11 22:24, , 12F
抱歉 XD
10/11 22:24, 12F
萬分感謝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

10/12 00:11, , 13F
沒錯還是要在class裡面才能用
10/12 00:11, 13F

10/12 00:14, , 14F
應該說非static的member,除了scope還要看reference type
10/12 00:14, 14F
文章代碼(AID): #1KEGn9Dv (java)
文章代碼(AID): #1KEGn9Dv (java)