可以结合以下程序说明:谢谢
import java.awt.*;
import java.applet.*;
public class Shishi extends Applet
{
public void paint(Graphics g)
{
g.drawString("thank you", 33, 34);//怎么可以调用drawString这个抽象方法呢?
}
}
import java.awt.*;
import java.applet.*;
public class Shishi extends Applet
{
public void paint(Graphics g)
{
g.drawString("thank you", 33, 34);//怎么可以调用drawString这个抽象方法呢?
}
}
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子类的实例。
传进来的实际是一个类,实现了Graphics接口。
这个类叫做sun.java2d.Graphics2D