抽象 类 如何在 Java 中实例化?
How are abstract classes instantiated in Java?
我正在阅读 Head First Java,它提到了以下内容:
The argument to paintComponent() is declared as type Graphics (java.awt.Graphics).
public void paintComponent(Graphics g) { }
So the parameter 'g' IS-A Graphics object. Which means it could be a subclass of Graphics (because of polymorphism). And in fact, it is.
The object refrenced by the 'g' parameter is actually an instance of the Graphics2D class
现在想查看Graphics2D的几个方法class,于是打开Oracle documentation搜索class。我找到了我想要的东西,但后来我看到Graphics2D是一个抽象class。现在 Head First 提到参数 'g' 实际上是 Graphics2D class 的一个实例。现在我清楚地知道我们不能实例化一个抽象的class,但是我们可以从中创建一个具体的subclass甚至是一个匿名的class.
现在我不想在黑暗中拍摄,想要至少 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();
}
}
究竟是如何发生的以及我们如何能够实例化 class Graphics2D?
这段代码我也看过:
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D)g;
...
}
这只有在 g 是一个对象时才有可能:
Graphics g = new Graphics2D();
这又是不可能的,因为 Graphics2D 是抽象的 class。
你前半部分说的是对的。必须有Graphics2D
的具体实现。您不能直接实例化它,因为它是抽象的。
关于你的第二点,你的假设是错误的。来电
Graphics2D g2d = (Graphics2D) g;
g
必须是 Graphics2D
的具体子类,所以当 g
被实例化时,它应该是这样的:
Graphics g = new Graphics2DSubclass();
强制转换只是让编译器知道 g
是一个 Graphics2D
,就像你说 Dog
是一个 Animal
一样。没有保证或提及具体实施。
我正在阅读 Head First Java,它提到了以下内容:
The argument to paintComponent() is declared as type Graphics (java.awt.Graphics).
public void paintComponent(Graphics g) { }
So the parameter 'g' IS-A Graphics object. Which means it could be a subclass of Graphics (because of polymorphism). And in fact, it is.
The object refrenced by the 'g' parameter is actually an instance of the Graphics2D class
现在想查看Graphics2D的几个方法class,于是打开Oracle documentation搜索class。我找到了我想要的东西,但后来我看到Graphics2D是一个抽象class。现在 Head First 提到参数 'g' 实际上是 Graphics2D class 的一个实例。现在我清楚地知道我们不能实例化一个抽象的class,但是我们可以从中创建一个具体的subclass甚至是一个匿名的class.
现在我不想在黑暗中拍摄,想要至少 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();
}
}
究竟是如何发生的以及我们如何能够实例化 class Graphics2D?
这段代码我也看过:
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D)g;
...
}
这只有在 g 是一个对象时才有可能:
Graphics g = new Graphics2D();
这又是不可能的,因为 Graphics2D 是抽象的 class。
你前半部分说的是对的。必须有Graphics2D
的具体实现。您不能直接实例化它,因为它是抽象的。
关于你的第二点,你的假设是错误的。来电
Graphics2D g2d = (Graphics2D) g;
g
必须是 Graphics2D
的具体子类,所以当 g
被实例化时,它应该是这样的:
Graphics g = new Graphics2DSubclass();
强制转换只是让编译器知道 g
是一个 Graphics2D
,就像你说 Dog
是一个 Animal
一样。没有保证或提及具体实施。