在书上看到很多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);}

解决方案 »

  1.   

    传入的参数并不是Graphics的对象,而是实现Graphics的子类的对象。这些子类都实现了同样的Graphics的接口,所以可以这样使用。
    而且这是面向对象语言中很重要的一种特性,这样做有很大的好处,有点类似与设计模式中的桥接模式,楼主可以好好体会一下OO的精神。
      

  2.   

    你好,当然我们可以传入实现Graphics类的子类的实例来做参数,可问题是这里都没有实际传入实参啊,我就不知道在哪里实现了这个子类,从而也调用了这些抽象方法.或者说如果我们不想在paint中,而在别的方法或函数中如何用Graphics这个类来完成这样的功能呢?
      

  3.   

    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;
    }
    }
      

  4.   

    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.Graphics2D
      

  5.   

    Graphics g是对子类的实例的一个引用吧。
      

  6.   

    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
          }
      }