抽象 类 如何在 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 一样。没有保证或提及具体实施。