有關java中子類覆蓋父類的方法的傳回值的問題 10 如果在父類Person:
public class Person {
private String name;
public String showName() {
return name;
}
}
而覆蓋了showName方法的子類為:
public class Teacher extends Person{
public String showName() {
return name+"老師";
}
}
為什麼這樣的覆蓋方法是不正確的。
而子類的覆蓋方法的傳回值必須寫成
return super.showName() + "老師";
才算正確。 收合 幽靜夜雨 | 瀏覽 2125 次 問題暫時關閉 推薦於2016-08-14 04:51:34 最佳答案
覆蓋父類的方法,那就是重寫,子類會調用重寫的方法。
override可以翻譯為覆蓋,從字面就可以知道,它是覆蓋了一個方法並且對其重寫,以求達到不同的作用。對我們來說最熟悉的覆蓋就是對介面方法的實現,在介面中一般只是對方法進行了聲明,而我們在實現時,就需要實現介面聲明的所有方法。除了這個典型的用法以外,我們在繼承中也可能會在子類覆蓋父類中的方法。在覆蓋要注意以下的幾點:
1、覆蓋的方法的標誌必須要和被覆蓋的方法的標誌完全符合,才能達到覆蓋的效果;
2、覆蓋的方法的傳回值必須和被覆蓋的方法的返回一致;
3、覆蓋的方法所拋出的異常必須和被覆蓋方法的所拋出的異常一致,或者是其子類;
4、被覆蓋的方法不能為private,否則在其子類中只是新定義了一個方法,並沒有對其進行覆蓋。
本回答由 電腦網路分類達人 董輝推薦 評論(1) 0 9 發布評論 275408194 | 2016-11-19 15:50 傳回值:子類可以是父類的相容值 回複
有車2015
採納率:85% 來自團隊:思想驅動 擅長: 電腦/網路 其他回答 很簡單,在這個method裡面的時候,你寫name,系統不會自動匹配super.name而是自動匹配this.name,由於你這個name在this裡面沒有,所以系統就找不到了。你寫成super.name應該也能通過。 追問
謝謝回答,我想多問一句,既然父類中的private屬性子類不能繼承,那麼子類是否擁有問題中的name屬性了。
追答
擁有,但是不能用。你要是這麼申明一個對象:Person p=new Teacher("blablabla");那麼p.name就可以用了。你想直接繼承變數,應該用protected。我複製一張對照表:範圍 當前類 同一package 子類 其他package public √ √ √ √ protected √ √ √ × friendly √ √ × × private √ × × × 還有一種叫default。就是你什麼都不加的時候的範圍,那個範圍和publick類似,但是不支援其他package而是支援java.lang.Object這個package 本回答被提問者採納 timom | 推薦於2016-03-06 22:16:29 評論(2) 4 4 發布評論 qjzh0603 | 2014-4-30 10:06 寫成super.name通過不了,因為name是private屬性。 回複 熱心網友 | 2013-2-15 11:01 這位老師答得真好:) 回複 父類中的name定義為private,只能被父類自己識別,可以把private改成public。 youlian20 | 發佈於2012-10-06 12:37 評論 0 0 person中的name是private的,子類不能直接去調用。 winters1224 | 發佈於2012-01-21 15:39 評論 0 0 這種題目有木有,我不知道哎。。 玉米肉丸 | 發佈於2012-01-21 15:38