[英]I am trying to understand what it means by “Program to an interface” in Java
[英]AWT: I am trying to learn Java and was unable to understand the following program
import java.awt.*;
public class CanvasExample {
public CanvasExample() {
Frame f = new Frame("Canvas Example");
f.add(new MyCanvas());
f.setLayout(null);
f.setSize(400, 400);
f.setVisible(true);
}
public static void main(String args[]) {
new CanvasExample();
}
}
class MyCanvas extends Canvas {
public MyCanvas() {
setBackground (Color.GRAY);
setSize(300, 200);
}
public void paint(Graphics g){
g.setColor(Color.red);
g.fillOval(75, 75, 150, 75);
}
}
請解釋
它是Canvas
類的一個實例。 在 Java 中new
是用於創建對象(給定類的實例)的關鍵字。 話雖如此 - new Canvas()
創建Canvas
類的新實例。 類名后面的括號表示構造函數——當你想創建一個給定類型的對象時被調用的代碼塊。
因為調用了paint
方法,所以得到了橢圓形。 它只是沒有從您的代碼中明確調用。 正如您在Oracle 發布的這篇教程文章中所讀到的, paint
方法將始終作為所謂的“回調機制”被觸發。 該方法屬於Container
類。 我建議閱讀有關它的文檔。 該paint
的方法MyCanvas
類覆蓋了paint
的方法Canvas
。 當擴展Canvas
類並覆蓋paint
方法時,您應該始終在方法的開頭調用 super 方法。 您可以在我已經包含在這一點的鏈接中了解原因。
與第 1 點一樣 - new CanvasExample()
創建MyCanvas
類的新實例。 更具體地說,它調用構造函數( public CanvasExample() { ... }
)。 在您提供的代碼中, CanvasExample 的構造函數創建了Frame
類型的新對象並調用了其中的一些方法。 其中一種方法是add
,它是由Frame
類從其超類Container
繼承的。
正如Java awt API 所解釋的, add
方法:
將指定的組件附加到此容器的末尾。
我希望你會明白:D
首先它調用public static void main(String args[])
然后main
創建類CanvasExample
新實例並調用其構造函數CanvasExample()
該構造函數創建名為“f”的類Frame
新實例並調用類Frame
構造函數,它將該框架的標題設置為“Canvas Example”
在構造函數CanvasExample()
下一行中,它創建並將類MyCanvas
新實例添加到名為“f”的Frame
實例中
構造函數CanvasExample()
第三行它只是將“f”的布局設置為null
構造函數CanvasExample()
第四行將“f”的大小設置為 400x400
構造函數CanvasExample()
第五行它只是在屏幕上顯示“f”(所以你可以看到它)
並在構造函數CanvasExample()
結束時返回main
創建類MyCanvas
新實例時稱為它的構造函數,該構造函數將其背景設置為“Color.GRAY”,並將其大小設置為MyCanvas()
和所有MyCanvas()
構造函數
每次需要再次渲染“f”時,它都會調用MyCanvas
類實例的方法paint(Graphics g)
,該實例小於“f”,因此您可以看到后面的白色
那個白色是“f”的背景
我想這就是你所要求的。
祝你今天過得愉快
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.