[英]Inheritance in Java and Object Types
我正在學習一本AP CS A考試的書,特別是Barron的考試准備書。
本書的一部分提到了兩個班級, Student
和GradStudent
, GradStudent
extends
Student
。
GradStudent
的方法是getId()
而Student
則沒有。
如果我要運行以下代碼:
Student s = new GradStudent()
s.getId()
這本書告訴我,我會收到一個錯誤。 為什么是這樣? 因為我初始化它作為一個GradStudent
,不會s
訪問方法getId()
本質上,如果我將變量聲明為超類,並將其初始化為子類,會發生什么?
換句話說,以下示例中的s
和g
如何不同:
Student s = new GradStudent()
GradStudent g = new GradStudent()
編輯:
現在我已經明白, s
只能訪問的方法Student
類。 那么如果我執行以下操作會發生什么:
Student s = (new GradStudent().setId(1) )
id
字段會發生什么? (假設它只存在於GradStudent
類中)如果我再次將s
為GradStudent
,它是否能夠訪問相同的id
?
您收到錯誤,因為s
被聲明為Student
類型。 它被實例化為new GradStudent()
並不重要,編譯器只知道聲明了什么類型的s
。 所以基本上你只能像使用Student
一樣使用s
(你只能使用Student
類定義的方法)。
如果你真的需要使用.getId()
,你有兩個選擇。 您可以將s
聲明為GradStudent
:
GradStudent s = new GradStudent();
System.out.println(s.getId());
或者,您可以將s
為GradStudent
:
Student s = new GradStudent();
System.out.println(((GradStudent) s).getId());
變量
Student s
被宣布為Student
,而不是GradStudent
。 您GradStudent
實例分配給Student
變量 - 這不會更改所述變量的類型。
您可以執行以下操作來解決編譯時錯誤:
Student s = new GradStudent()
((GradStudent)s).getId()
但這被認為是代碼氣味。
正是因為GradStudent
有方法getId()
而Student
沒有。
GradStudent
繼承了Student
方法,但Student
類只有OWN方法。
如果GradStudent
實現了Student
getId()
,它將起作用
我希望你能得到上述人的回答。 只想添加一些要點。
調用方法s.getId()
最終會給你一個錯誤,因為s是一種Student類型,在編譯時編譯器會檢查Student中是否存在getId()
方法,如果找不到它,會給你一個錯誤。
但是s指向一個子類型的對象,它是GradStudent,它將在運行時解析,編譯器不知道它。 所以為了滿足編譯器,你必須這樣做
((GradStudent)s).getId()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.