2014-03-13 49 views
0

我正在閱讀「Big Java Early Objects」一書。在Java中構造對象

在「Java構造對象」一節中,他們給出了下面的這個例子。

import java.awt.Rectangle; 

/** 
    This example demonstrates constructors. 
*/ 
public class ConstructorDemo 
{ 
    public static void main(String[] args) 
    { 
     // Constructs and prints a rectangle 
     System.out.println(new Rectangle(5, 10, 20, 30)); 

     // Constructs a rectangle and saves it in a variable 
     Rectangle box = new Rectangle(5, 10, 20, 30); 
     System.out.print("box: "); 
     System.out.println(box); 

     // The constructor with no arguments 
     box = new Rectangle(); 
     System.out.print("box: "); 
     System.out.println(box); 
    } 
} 

我認爲這段代碼應該打印出一個矩形。但是沒有任何反應,它只在控制檯打印出來:

java.awt.Rectangle[x=5,y=10,width=20,height=30] 
box: java.awt.Rectangle[x=5,y=10,width=20,height=30] 
box: java.awt.Rectangle[x=0,y=0,width=0,height=0] 

我的Eclipse有什麼問題嗎?我該如何做這項工作?

+7

爲什麼會打印出矩形?你打印出矩形_的意思是什麼? –

+3

它不會繪製矩形。 – gd1

+1

它調用'Rectangle#toString'方法,並且該字符串正在控制檯中打印。 –

回答

2

如果您查看Rectangle.toString()的代碼(由System.out.println自動調用),您將看到它打印出構成Rectangle對象的參數。但是,它不會畫它:

return getClass().getName() + "[x=" + x + ",y=" + y + ",width=" + width + ",height=" + height + "]"; 

你沒有顯式調用toString(),但impliclty你:

參見:

System.out.println(foo); // foo is a non primitive variable 

System是一類,具有staticout,類型PrintStream。所以你打電話給PrintStream的方法println(Object)

它的實現是這樣的:

public void println(Object x) { 
     String s = String.valueOf(x); 
     synchronized (this) { 
      print(s); 
      newLine(); 
     } 
    } 

正如我們看到的,它調用了String.valueOf(Object)方法。這是實施如下:

public static String valueOf(Object obj) { 
     return (obj == null) ? "null" : obj.toString(); 
    } 

而在這裏你看到,那toString()被稱爲。

您的代碼運行正常。

1

我不認爲你的Eclipse有什麼問題,並且輸出實際上是正確的。如果您期望看到一個矩形的實際繪圖,那麼您需要重新查看Rectangle類。在Rectangle對象上調用System.out.print將調用.toString方法。這又是您創建的矩形的座標和尺寸的表示。