【发布时间】:2021-07-27 01:48:06
【问题描述】:
我正在阅读 Head First Java,它提到了以下内容:
paintComponent() 的参数声明为 Graphics 类型 (java.awt.Graphics)。
public void paintComponent(Graphics g) { }所以参数'g'是一个图形对象。这意味着它可能是 Graphics 的子类(因为多态性)。事实上,确实如此。
'g'参数引用的对象实际上是Graphics2D类的一个实例
现在想查看Graphics2D类的几个方法,于是打开Oracle documentation搜索类。我找到了我想要的,但后来我看到 Graphics2D 是一个抽象类。现在Head First提到参数'g'实际上是Graphics2D类的一个实例。现在我清楚地知道我们不能实例化一个抽象类,但我们可以从中创建一个具体的子类,甚至是一个匿名类。
现在我不想在黑暗中开枪,想要至少 java.awt.Graphics2D 的一些证据。
我能想到的一种可能性是这样的:
public abstract class GFG {
public abstract void foo();
}
class ABC extends GFG {
@Override
public void foo() {
System.out.println("Hey");
}
public static void main(String[] args) {
GFG obj = new ABC();
obj.foo();
}
}
究竟是如何发生的,我们如何能够实例化类 Graphics2D?
我也看过这段代码:
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D)g;
...
}
只有当 g 是这样的对象时才有可能:
Graphics g = new Graphics2D();
这又是不可能的,因为 Graphics2D 是一个抽象类。
【问题讨论】:
-
"只有当 g 是一个像- 这样的对象时才有可能" 但不一定是这样:一种方法是
Graphics g = new Graphics2D() { /* implementation of abstract methods */ };。 -
您似乎已经回答了问题的前半部分。它必须是一个具体的子类,例如您的
ABC、GFG示例。关于第二个,你的假设是错误的。可能是Graphics g = new Graphics2DSubclass();。Graphics2DSubclass是Graphics2D,就像狗是动物一样。 -
"只有当 g 是一个像 - Graphics g = new Graphics2D() 这样的对象时才有可能;"
-
啊,我没看到,谢谢伙计!
标签: java awt graphics2d