2011-10-04 36 views
1

我正在爲AP CS考試進行學習,並在我的書的OOP部分中發現了這個練習題。 給出以下兩個類。OOP AP CS練習

package chap4q9; 

public class Person 
{ 
    private int age; 
    public Person(int a) 
    { 
     age = a; 
    } 
    public String toString() 
    { 
     return "Age: " + age + "\n"; 
    } 
} 

package chap4q9; 

public class Student extends Person 
{ 
    private double gpa; 
    public Student(int a, double g) 
    { 
     super(a); 
     gpa = g; 
    } 
    public String toString() 
    { 
     return super.toString() + "GPA: " + gpa; //This was where the missing code was 
    } 
} 

而以下是調用這兩個類的客戶端程序。

package chap4q9; 

public class Chap4Q9 
{ 
    public static void main(String[] args) 
    { 
     Student kathy = new Student(17, 3.85); 
     System.out.println(kathy); 
    } 
} 

最後,輸出是:

年齡:17

GPA:3.85

以防萬一你想知道,有沒有實際應該是年齡之間的線和輸出中的GPA,當我發佈這個時,這是一個奇怪的格式化的東西。

目標是在第二個toString方法中替換丟失的代碼(在上面的代碼中,爲缺少的代碼插入了正確的答案,但我標記了位置)。我認爲這本書是錯誤的,但運行代碼並得到相同的輸出。我認爲它只是打印kathy所在的內存位置,如果你想得到那個輸出,你將不得不打印kathy.toString()。但是,只需打印kathy似乎在運行Student類中的toString方法。我的問題是,爲什麼要打印Student對象kathy,獲取該輸出,而不是簡單的內存位置。 預先感謝所有回覆。

回答

2

那麼這只是因爲System.out.println默認調用了toString() - 一個對象的方法。在你的情況下,你已經在子類中實現了你自己的toString,所以這被使用了。

只有當您的Person和Student類中沒有toString時,纔會調用Object-class中的toString,它會打印一個對象標識字符串,它包含類名和十六進制表示對象的hashCode。

參見對象級的更多詳細信息的Javadoc:http://download.oracle.com/javase/6/docs/api/java/lang/Object.html#toString()

+1

實際上,它調用'String.valueOf(...)'輸出''null''給出'null'參數。 – Gandalf

+0

爲+1,mcfinnigan爲-1。在這裏,我們看到了一個很好的答案和一個完全無用的答案之間的區別。好東西Robert M. – Brendan

-1

你重寫這兩類的toString() - 爲什麼地球上,你認爲一個標準的對象toString()方法將被稱爲?

0

我覺得在書的某處,它說,當做System.out.println時,它會自動調用toString方法,如果有的話。