Java中的抽象类是如何实例化的?
Posted
技术标签:
【中文标题】Java中的抽象类是如何实例化的?【英文标题】:How are abstract classes instantiated in Java? 【发布时间】: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() 这样的对象时才有可能;"
啊,我没看到,谢谢伙计!
【参考方案1】:
您在问题的前半部分所说的是正确的。必须有Graphics2D
的具体实现。您不能直接实例化它,因为它是抽象的。
关于你的第二点,你的假设是错误的。来电
Graphics2D g2d = (Graphics2D) g;
g
必须是Graphics2D
的具体子类,所以当g
被实例化时,它会是这样的:
Graphics g = new Graphics2DSubclass();
强制转换只是让编译器知道g
是Graphics2D
,就像你可以说Dog
是Animal
一样。没有保证或提及具体的实现。
【讨论】:
谢谢,我看到我的方法错了:),不错的网站顺便说一句。以上是关于Java中的抽象类是如何实例化的?的主要内容,如果未能解决你的问题,请参考以下文章