1:  在类中把自己实例化class a{  public main(args []){new a();
}
...
}
经常见到这样的情况,是不是MAIN函数里面的东东不算是这个类的内容啊? 这样解析好象行得通,但是它的代码确实在类定义里面啊!2:   继承Frame 类,然后把paint方法覆盖掉,这时候这方法还有啥用的啊 ?...
paint(Graphics g){
g.drawXX;
}这样
跟直接的一条
g.drawXX 这样的代码
有什么区别? 
Graphics既然是一个抽象类那为什么可以得到实例? 
还有这接口什么用的? 都是一些空方法阿最后一个问题就是题目所提的
类库跟API有什么区别啊? 
我的理解是:API是一些由SUN用汇编或者其他什么鸟语言编写好的一些函数,专供程序员调用.程序员看不到里面的代码,也不能用JAVA语言编写出另外一些API.
类库则不同,它们是用现成的API写成的一些大多数程序都会用到的公共代码,避免重复的劳动.我的疑惑是:
举个例吧,class Frame{
            Frame(){..
                      }
            Frame(){..
                      }
           .....
                    }
这明明就是一个类啊,但为什么会是API呢?
如果不是API,那么这么简单几句话是无论如何也不会有那么强大的功能吧? 
就算是继承与WINDOWS类,但是WINDOWS类又去哪里来的功能呢?
如果不去继承这些类,我想程序员无法编写一些这样的类.写得很乱,感谢你把我写的都看完了.希望有心人,提点提点! 谢谢

解决方案 »

  1.   

    开始总是很乱的,要是能耐心读完一本java初级教程基本可以解决,答案都在上面。试着解释几个吧:
    1:不是public main(String arg[])
       而是public static void main(String arg[])
       即main是静态方法,独立于class的,查些有关静态的概念把,至于为什么要放在class中,那是因为java语法中,方法必须定义在一个类中,就是说规定如此吧。2:涉及方法覆盖、继承、接口、抽象类等概念,一句话说不清了,看书或者以前帖子吧3:此api非彼api
    api本身是个抽象的概念,称为应用程序接口。在微软概念里有两个,一个就是windows api,为程序员提供了访问window系统的通用接口函数,可以被c、delphi、vb等调用,另一个就是类库,如mfc,
    而在java里api就是类库,只是用了这个名字而已。
    计算机里很多概念是没有明确定义的,甚至是交错的,典型的还有线程和进程问题,所以如果仅是做应用程序不要太钻概念了。概念的东西说多了就糊涂,也有些乱,不当之处希望指正
      

  2.   

    我认为main()方法不属于类的一部分,但它又不能单独存在,只能依附于类而存在。Frame类的paint()方法是由VM来调用的,VM不可能直接调用g.DrawXXX,Graphics本身是抽象类,但可以通过继承而得到它的子类,这个子类(如上面的g)是VM构造出来的,你也不用管它什么“空方法”,虚拟机在构建子类时就会实现这些方法的。什么是API?什么是类库?还真不好说,简单的理解,类库是代码,API是代码实现的功能。没有类库,API就不能存在。“API”是“应用程序接口”,大概就是“应用程序与类库之间的接口”吧,不知说的对也不对,还需要高人指点。
      

  3.   

    “API”是“应用程序接口”类库就是“类的集合”——这是不是有点牵强?所以一般来说“API”是指一个应用提供给另外的应用使用的契约,也就是说别的应用应该怎样使用该应用。
      

  4.   

    哈哈,楼主还是自己先看一看JAVA的入门书籍吧,这样就会了解的多一点,也不会像现在这样抓瞎了。
      

  5.   

    感谢各位的赐教,使我又学到了一些东西.
    但是还是有很多不明白,书上一般都只是讲如何去用这些API(或者什么),却没有说这些API如何得来,没有个依据,用起来就象在抄袭代码一样.去图书馆看了一些JAVA技术精髓之类的书,看不懂,就象看天书! trumple说的:Graphics本身是抽象类,但可以通过继承而得到它的子类,这个子类(如上面的g)是VM构造出来的,你也不用管它什么“空方法”,虚拟机在构建子类时就会实现这些方法的。
    这说出了得到Graphics实例的可能性,但是还是很难明白具体如何来的.难道JAVA里面的有些现象不能用JAVA语言本身的规则去解析吗? 例如在Frame的某个子类定义里, 
     
    ....
    paint(Graphics g){
    g.drawXX;
    }
    ...这不是把本身的paint方法覆盖掉了,原来定义的代码全部都被冲掉了吗?
    那么这跟下面的代码有何区别呢?
    ....
    shit(Graphics g){
    g.drawXX;
    }
    ...
      

  6.   

    Graphics是抽象类你不可能得到它的实例,但是如果你继承了Graphics,实现了这个类,你就可以得到这个子类的实例。此时,你可以用Graphics父类来保存这个实例。记得吗,Object是所以类的父类,你可以用Object来保存任何类。
    至于paint方法,如果你的子类的paint方法与父类不同,你可以重新定义你的paint方法,这是方法重载。这在有多个子类时很有用。
    这两个问题都是与继承有关,你看来对面向对象还不了解,应该再找本书仔细看看。
      

  7.   

    main方法是一个入口,当你用javac运行某个类时,这个是方法首先被调用,所以它是这个类的内容。应该main方法是static的,所以不用实例化这个类就可以访问这个方法。
    new a();实例化一个类,这时,你就可以访问这个实例里其它不是static的方法。
      

  8.   

    咳,《thinking in java》,
      

  9.   

    to wheee(游魂):  既然main方法是这个类的内容,那么调用NEW
      

  10.   

    to wheee(游魂):  既然main方法是这个类的内容,那么调用NEW A的时候不是生成了一个也包含MAIN方法的类吗?  好象这很混乱呀.还有你说的"用Graphics父类来保存这个实例"是不是指 Graphics g=new SupGraphics() 这类的看起来很很难理解的方法?
      

  11.   

    我并没有说“可以得到Graphics的实例”,我是说可以得到“Graphics的子类”的实例,子类是由VM创造的,并且将Graphics里的抽象方法一一实现。就是说:g实际上是Graphics的子类的实例,而不是Graphics的实例! 至于这个子类的类名是什么,无法知道,也不需要知道,我们只知道这个子类的一个实例的名称是g。 Graphics是g的父类,想要操纵子类,可以通过使用父类的方法进行。paint()方法是从Container继承而来的,用于画出容器类的形象的,你覆盖这个方法是很正常的,因为Container并不知道你要怎样画,也不知道你要画什么。当然你可也写一个shit方法,但如果把g.drawXXX写到了shit里边,VM并不知道这个情况,所以还要写一个public void paint(Graphics){shit(g);}来调用你的那个shit方法,因为API里规定了,VM就要调用paint()方法才能画出容器类。
      

  12.   

    谢谢你的指点,我有这样的一种理解: 静态方法不能访问非静态成员,因为main是静态方法,所以它不可以访问非静态成员.也因为它是静态方法,所以在构造一个对象时没有特别制造另外的main方法,只是公用类的main方法,这样的话很多疑团就解开了.不知道这样理解对不对呢?
      

  13.   

    线程和进程,谁说没有严格区别?类库和API则确实可以当做是同一个概念。而且并不是什么重要的概念。我本人写过N个软件,也是最近几天才第一次听说"类库"这个词汇,第一次明白API究竟是什么意思