【问题标题】:How are abstract classes instantiated in Java?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() 这样的对象时才有可能;"
  • 啊,我没看到,谢谢伙计!

标签: java awt graphics2d


【解决方案1】:

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

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

Graphics2D g2d = (Graphics2D) g;

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

Graphics g = new Graphics2DSubclass();

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

【讨论】:

  • 谢谢,我看到我的方法错了:),不错的网站顺便说一句。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-11
  • 2013-03-07
  • 2014-09-08
  • 2010-09-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多