查文档得知:Graphic是抽象类。setColor/drawLine都是抽象方法。未重载应该是甚么也不干的。但在以下代码中最后两行却可以不加重载直接使用这些方法,为什么?
import java.awt.*;
import java.awt.event.*;
public class DrawLine
{
Frame f= new Frame("啦啦啦");
public static void main(String [] args)
{
new DrawLine().init();
}
public void init()
{
f.setSize(300,300);
f.setVisible(true);
f.addMouseListener(new MouseAdapter()
        {
        int orgX;
        int orgY;
            public void mousePressed(MouseEvent e)
            {
        orgX=e.getX();
        orgY=e.getY();
            }
            public void mouseReleased(MouseEvent e)
        {Grahpics g=f.getGraphics(); g.getGraphics().setColor(Color.red);
//设置绘图颜色为红色
    g.getGraphics().drawLine(orgX,orgY,e.getX(),e.getY());
}
     });
}
}

解决方案 »

  1.   

    这个g实际上是sun.java2d.SunGraphics2D
    只不过用父类指代而已
      

  2.   

    Grahpics g=f.getGraphics();
    这句话是返回的一个Grahpics的子类的实例给Grahpics的引用.
      

  3.   

    g.getGraphics()返回一个Grahpics的子类,然后将该子类向上转型(Upcasting)赋给Grahpics,由于Java中运行时默认是动态联编,所以代码:g.getGraphics().setColor(Color.red)实际上是调用Grahpics子类的setColor(Color red)方法,下面的同理可见.
      

  4.   

    小的鲁钝,到Graphics2D里还是没看到哪里实现了那些抽象方法。还有,运行发现线条不是红色,是黑的。怎么回事?
    import java.awt.*;
    import java.awt.event.*;
    public class DrawLine
    {
    Frame f= new Frame("啦啦啦");
    public static void main(String [] args)
    {
    new DrawLine().init();
    }
    public void init()
    {
    f.setSize(300,300);
    f.setVisible(true);
    f.addMouseListener(new MouseAdapter()
            {
            int orgX;
            int orgY;
                public void mousePressed(MouseEvent e)
                {
            orgX=e.getX();
            orgY=e.getY();
                }
                public void mouseReleased(MouseEvent e)
            {//Graphics g=f.getGraphics();f.getGraphics().setColor(Color.RED);
    //设置绘图颜色为红色
        f.getGraphics().drawLine(orgX,orgY,e.getX(),e.getY());
    }
        });
    }
    }
      

  5.   

    我自己找到答案了,Graphics的子类DebugGraphics覆盖了drawLine和setcolor方法。另外最后两行产生的是两个不同的对象,所以画的是黑色。