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 */ ; 您似乎已经回答了问题的前半部分。它必须是一个具体的子类,例如您的 ABCGFG 示例。关于第二个,你的假设是错误的。可能是Graphics g = new Graphics2DSubclass();Graphics2DSubclass Graphics2D,就像狗动物一样。 "只有当 g 是一个像 - Graphics g = new Graphics2D() 这样的对象时才有可能;" 啊,我没看到,谢谢伙计! 【参考方案1】:

您在问题的前半部分所说的是正确的。必须有Graphics2D 的具体实现。您不能直接实例化它,因为它是抽象的。

关于你的第二点,你的假设是错误的。来电

Graphics2D g2d = (Graphics2D) g;

g 必须是Graphics2D 的具体子类,所以当g 被实例化时,它会是这样的:

Graphics g = new Graphics2DSubclass();

强制转换只是让编译器知道gGraphics2D,就像你可以说DogAnimal 一样。没有保证或提及具体的实现。

【讨论】:

谢谢,我看到我的方法错了:),不错的网站顺便说一句。

以上是关于Java中的抽象类是如何实例化的?的主要内容,如果未能解决你的问题,请参考以下文章

抽象类

J2SE之抽象类实例化

java中的Process

Java中的抽象类

Java--多态,抽象类和接口

类对象