关于Graphics这个抽象类的疑问
在书上看到很多Graphics这个类,可这是个抽象类啊,不是抽象类不能实例化的吗,而且这个类里的很多方法都是抽象方法,怎么可以直接使用呢?不是抽象方法比较OVERRIDE的吗?很不解,请高手帮忙解释一下好不好,十分感谢!
public void paint(Graphics g) //?,Graphics是抽象类,怎么可以实例化g?按我的理解应该有个子类
//先继承Graphics,然后再用这个子类实例化对象吧
{
g.setColor(Color.blue);//?
g.drawOval(40, 40, 100, 100);//?
g.drawRect(40, 40, 100, 100);//?
g.drawString("It is a Oval",60,90);//等等,这些都是抽象方法,为何没有实现就可以调用,或者请
//告诉我这些是在哪个类中被实现的?
g.fillOval(180, 40, 100, 80);
g.drawRect(180, 40, 100, 80);
g.setColor(Color.white);
g.drawString("It is a Oval",200,80);
}
问题点数:60、回复次数:7Top
1 楼zouxinfox(Read the source,Use the force)回复于 2006-05-04 19:34:22 得分 0
传入的参数并不是Graphics的对象,而是实现Graphics的子类的对象。这些子类都实现了同样的Graphics的接口,所以可以这样使用。
而且这是面向对象语言中很重要的一种特性,这样做有很大的好处,有点类似与设计模式中的桥接模式,楼主可以好好体会一下OO的精神。Top
2 楼csdnlady()回复于 2006-05-04 19:46:27 得分 0
你好,当然我们可以传入实现Graphics类的子类的实例来做参数,可问题是这里都没有实际传入实参啊,我就不知道在哪里实现了这个子类,从而也调用了这些抽象方法.或者说如果我们不想在paint中,而在别的方法或函数中如何用Graphics这个类来完成这样的功能呢?Top
3 楼csdnlady()回复于 2006-05-04 20:16:53 得分 0
高手帮帮我,帮我解决一下这个疑问啊Top
4 楼xzf_fancy(三人行必有我师)回复于 2006-05-05 22:03:52 得分 0
public class Clock extends java.applet.Applet implements Runnable
{
Thread clockThread;
public void start()//该方法是Applet的方法,不是线程的方法
{
if(clockThread == null)
{
clockThread = new Thread(this, "Clock");
clockThread.start();
}
}
public void run()
{
while (clockThread != null)
{
repaint();
try
{
clockThread.sleep(1000);
}
catch(InterruptedException e)
{}
}
}
public void paint(Graphics g)
{
Date now = new Date();
g.drawString(now.getHours()+":"+now.getMinutes()+":"+now.getSeconds(),5,10);
}
public void stop()
{
clockThread.stop();
clockThread = null;
}
}
Top
5 楼lzmailcn(一年前的新手)回复于 2006-05-05 22:40:36 得分 0
Graphics的确是一个抽象类,但传过来的是由不同组件(JFrame,JPanel等)实现了的子类,但它们都是一个Graphics,以下是一个测试代码(j2se1.5):
//重写JFrame的paint方法(其他组件传来的可能不太一样)
public void paint(java.awt.Graphics g){
super.paint(g);
System.out.println(g.getClass().getName());
System.out.println(g.getClass().getSuperclass().getName());
}
//输出
sun.java2d.SunGraphics2D
java.awt.Graphics2DTop
6 楼arsaluo(热血年华)回复于 2006-05-05 22:58:29 得分 0
Graphics g是对子类的实例的一个引用吧。Top
7 楼xzf_fancy(三人行必有我师)回复于 2006-05-05 23:16:09 得分 0
import java.awt.Graphics; //引入图形类Graphics
import java.applet.Applet; //引入Applet类
public class HelloWorld extends Applet {
String hw_text ;
public void init () { //init()方法是Applet首先执行的方法
hw_text = "Hello World";
}
public void paint(Graphics g) {
g.drawString (hw_text , 25, 25) ;
//在坐标为(25,25)的地方显示字符串hw_text
}
}Top




