Java 为什么抽象方法fillOval()可以直接使用?

Java 为什么抽象方法fillOval()可以直接使用?,java,Java,我读过这样的GUI程序: import java.awt.*; public class TestPaint{ public static void main(String[] args){ new PaintFrame().launchFrame(); } } class PaintFrame extends Frame{ public void launchFrame(){ setBounds(200,200,640,480);

我读过这样的GUI程序:

import java.awt.*;

public class TestPaint{
    public static void main(String[] args){
        new PaintFrame().launchFrame();
    }
}

class PaintFrame extends Frame{

    public void launchFrame(){
        setBounds(200,200,640,480);
        setVisible(true);
    }

    public void paint(Graphics g){
        Color c = g.getColor();
        g.setColor(Color.red);
        g.fillOval(50,50,50,50);
        g.fillRect(80,80,40,40);
        g.setColor(c);
    }

}
这是一个可以在内存中运行的程序,下面是结果, [很抱歉,我没有足够的声誉发布图像,但它可以运行]

当我阅读APIfile时,我发现fillOval()方法在Graphics类中定义如下:

public abstract void fillOval(int x,
                              int y,
                              int width,
                              int height)

为什么我可以在程序中直接使用abstract fillOval()?此外,我在哪里可以找到这个程序中fillOval()的具体实现?

为了在那里实例化任何抽象类,必须是某个具体实现。正是这个实现被调用

与接口一样,合同是所有指定的内容


因此,您可以安全地调用该方法(因为任何实现都必须遵守契约)。

因为抽象方法不能在非抽象类中
图形
类应该是抽象的。您不能创建抽象类的实例,而且
fillOval()
方法都不是静态的。因此,无法调用该方法


现在来谈谈事实。抽象类中的抽象方法应由扩展抽象类的第一个具体类实现。因此,您必须创建一个非抽象类,
扩展图形
,并在其中提供
fillOval()
的实现。然后在程序中创建它的实例并调用它。

传递给该方法的
Graphics
对象实际上是该类的一个子类(因为从
SomeClass
扩展的任何对象都是-a”
SomeClass
,而该具体子类实现了
Fillova
方法的逻辑

例如:

abstract class A {
    abstract void doStuff();
}

class B extends A {
    void doStuff() {
        System.out.println("B::doStuff()");
    }
}

class Main {
    public static void main(String[] args) {
        A obj = new B();
        obj.doStuff(); // prints B::doStuff()
    }
}

如果您想查看对象的实际类型,可以使用
g.getClass().getCanonicalName()
,在本例中,它的计算结果为
sun.java2d.SunGraphics2D
。可以找到源代码。

最后,我知道调用Fillova()有多态性函数,传递到函数中的图形g是一个子类引用。

永远不需要从
图形扩展来提供实现-除非您正在认真考虑为不同的图形驱动程序或其他东西编写实现,但是您需要重新实现entire核心AWT库支持它…只是说;)在这种情况下,我确信AWT库中已经提供了一个默认实现:)@ZHI请检查并使用它,请检查我的整个程序,我提供了它。我现在的问题是,我在哪里可以找到fillOval()的具体实现?@ZHI您必须找到JVM的源代码,查找它,它的功能将取决于JVM的平台构建,“在本例中,它的计算结果为sun.java2d.SunGraphics2D”-是和否,它的计算结果为JVM实现的结果;)