看板 java 關於我們 聯絡資訊
各位好,我今天想要釐清我自己對於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
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