簡體   English   中英

Java和對象類型中的繼承

[英]Inheritance in Java and Object Types

我正在學習一本AP CS A考試的書,特別是Barron的考試准備書。

本書的一部分提到了兩個班級, StudentGradStudentGradStudent extends Student

GradStudent的方法是getId()Student則沒有。

如果我要運行以下代碼:

Student s = new GradStudent()
s.getId()

這本書告訴我,我會收到一個錯誤。 為什么是這樣? 因為我初始化它作為一個GradStudent ,不會s訪問方法getId()

本質上,如果我將變量聲明為超類,並將其初始化為子類,會發生什么?

換句話說,以下示例中的sg如何不同:

Student s = new GradStudent()
GradStudent g = new GradStudent()

編輯:

現在我已經明白, s只能訪問的方法Student類。 那么如果我執行以下操作會發生什么:

Student s = (new GradStudent().setId(1) )

id字段會發生什么? (假設它只存在於GradStudent類中)如果我再次將sGradStudent ,它是否能夠訪問相同的id

您收到錯誤,因為s聲明Student類型。 它被實例化為new GradStudent()並不重要,編譯器只知道聲明了什么類型的s 所以基本上你只能像使用Student一樣使用s (你只能使用Student類定義的方法)。

如果你真的需要使用.getId() ,你有兩個選擇。 您可以將s聲明為GradStudent

GradStudent s = new GradStudent();
System.out.println(s.getId());

或者,您可以將sGradStudent

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM