Java 为什么抽象方法fillOval()可以直接使用?
我读过这样的GUI程序: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);
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实现的结果;)