可以结合以下程序说明:谢谢
import java.awt.*;
import java.applet.*;
public class Shishi extends Applet
{
public void paint(Graphics g)
{
g.drawString("thank you", 33, 34);//怎么可以调用drawString这个抽象方法呢?
}
}

解决方案 »

  1.   

    给你看个例子,你看明白了你就知道了abstract class A {
        protected A () {
            System.out.println("create A instance");
        }    abstract void callMe();
    } class B extends A {
        public B() {
            System.out.println("create B instance");
        }    public void callMe() {
            System.out.println("call me in B");
        }
    }public class Test {
        public static void main(String[] args) {
            A a = createA();
            callA(a); //这里就是LZ疑惑的地方
        }    public static void callA(A a) {
            a.callMe(); //这里就是LZ的疑惑
        }    public static A createA() {
            return new B(); //注意这里,这里就是答案
        }
    }LZ看明白了吗?
    public void paint(Graphics g) //这个参数说明是Graphics类型,但是传进来继承了Graphics的子类的实例,该实例实现了Graphics的抽象方法。不要看到参数是什么类型就觉得参数只能是这个类型,还可以是这个类型的子类,知道吗?该方法是系统调用的,系统内部生成了Graphics子类的实例,然后再当作参数传给paint方法的,Component类都有public Graphics getGraphics()方法,该方法就好像上面的createA,里面实际上生成的Graphics子类的实例。
      

  2.   

    你加一个断点Debug一下就知道了。
    传进来的实际是一个类,实现了Graphics接口。
    这个类叫做sun.java2d.Graphics2D