CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Java >  J2SE / 基础类

关于Graphics这个抽象类的疑问

楼主csdnlady()2006-05-04 19:21:38 在 Java / J2SE / 基础类 提问

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

相关问题

关键词

得分解答快速导航

  • 帖主:csdnlady

相关链接

  • CSDN Java频道
  • Java类图书
  • Java类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo