由源代码的类abc.java编译成abc.class,这个abc.class还能叫类吗?

解决方案 »

  1.   

    abc.java不能叫类吧 只能叫一个java文件~!
    abc.class当然也部是类了
      

  2.   

    对不起,是我表达错误.我意思是由类 class vv{}编译成的vv.class文件还能叫类吗?
      

  3.   

    你还是在钻牛角尖。为什么要强调这个?    书上应该很明确的告诉你,由一个JAVA程序中的类,编译后形成的是类文件。你说的类歧义太多。        如果你真的要学一门语言。就应该把语言的重点放在接受承认,和如何继承它的思想上。
      

  4.   

    源程序中一个文件名为A.java的类 class A{...} 被编译成 A.class文件,我想问的是谁才是类模板,是A.java还是A.class?还是两个都是?
      

  5.   

    呵呵,楼主这个问题看似抠字眼,不过,确实跟Java里一些基本概念有关,有必要澄清一下:abc是一个类,abc.java叫做Java源文件,abc.class叫做abc类的类文件.这三者不是一回事儿.请注意,为什么源文件abc.java不等于类abc呢?原因是,Java的源文件里可以包含有多个类的定义,源文件的文件名只需要和其中的public 类的名字相同(如果其中没有一个public类,则和任意一个类的名字相同即可),扩展名是java.而abc.class 是源文件编译之后生成的字节码文件,注意,是每一个类对应一个class文件,而不是源文件对应字节
    码文件,也就是说,如果abc.java 中有多个类,则每一个类对应一个class文件,它们是互相独立的。在运行的时候,是abc.class文件在Java虚拟机上执行的。Java虚拟机不会和源文件abc.java打交道。在这个意义上,你可以说,对于Java虚拟机来说,实际上abc这个类就是abc.class文件里的字节码。^_^
      

  6.   

    谢谢11楼的耐心解答,不过还没有切中我的主要意思,也许我说的不够明白吧,我这主要是跟c++语言对比来说的,因为我从java看出编译为字节码后的.class类文件本身好象就是类模板,因为它可以在源文件里表现出类的特性,也就是它可以跟未编译的源文件中的类一样作为类原型模块来提供服务,比如提供继承、多态、生成对象等,所以我的意思是:是不是.class类文件实际还保留源文件类的原型信息,意思也就是只是从原码改为字节码而已,在内容上还保持原样,所以要编译为字节码是为了JVM解释时快一点而已,是这样吗?或者我想从c++角度来问的意思就是:c++类编译成二进制码后还会跟java一样生成一个个的.class类文件吗?如果是那么生成的二进制类文件还跟java的.class类文件那样还保持类模板的功能吗?因为在我印象中似乎c++编译成二进制码后就不存在什么类文件了,已变成纯粹的二进制级的存储逻辑布局了,我没具体学过c++,只是凭印象,麻烦诸位帮忙解答解答,酬谢!
      

  7.   

    我的主要意思是编译后的.class类文件好象跟编译前的源文件中的类具有一样功能啊,是这样吗?如果真是这样,那么它们就有换汤不换药的意思啊,对吧?意思是内容还一样,只是相当于把原来的中文换成用英文来表达而已.
      

  8.   

    实际上,.class文件里的东西就是JVM的机器码,就好象.exe文件里的东西是物理机的机器码一样,不过编译的目的不是为了让JVM运行时更快,而是JVM根本不认识.java文件里的内容(正文内容),它只认识.class文件
      

  9.   

    楼上的回答很准确。Java的字节码的地位就相当于C++的编译后生成的机器代码,这里并没有啥不同之处。
      

  10.   

    大家可能还不明白我的意思,简单说吧,我意思是c++类编译后还能象java的.class类文件那样拿来在源程序里编程吗?
      

  11.   

    你的思路有些混乱。
    Java文件一旦编译之后,生成了class文件,运行时就和源文件毫无关系了。这里你再提到源文件,就没有
    丝毫意义了。在你编译之后,所有的类都已经生成了各自的class文件;运行时的逻辑顺序是这样的:首先被调入运行的是主类(含有main方法的类)的class文件,这个文件就是由一组字节码指令组成的,当执行到某一条指令时,需要创建另一个类的对象时,则JVM会调用相应的类的class文件来执行,创建该对象。程序的 编辑——编译——执行 这是三个不同的阶段,不要把它们混作一团。原则上讲,在类的代码加载上,C++和Java并无根本区别——只不过,C++程序中所有的类编译之后的代码都是放在一个可执行文件里,而Java把它们分别放在不同的文件里,仅此而已!
      

  12.   

    我知道运行时与源文件无关,我这里主要是说编程时期我们确实可在源程序里调用.class类文件,而且跟直接调用它的.java类文件是一样的.所以就感觉.class文件和.java文件似乎只是表达文字的不同(即一个是文本码,一个是字节码),它们包含的信息似乎是一样的,意思是.class类文件还包含着.java类文件完整的原型信息.而不象有些人说的那样程序编译后就变成了纯粹的变量和函数的调用关系,即内存布局关系,或者说二进制级的纯机器指令关系.
      

  13.   

    程序编译后就变成了纯粹的变量和函数的调用关系(纯粹的二进制机器指令关系)这应该是c++的编译模式,但我感觉java好象不是这样,它的.class文件是包含类原型信息的,也就是利用工具应该是可以将.class类文件还原为.java类文件的,这个我是假设而已,需要考证.而c++类编译成二进制码后应该不能还原为源程序码了,这是我的看法,请指教!
      

  14.   

    “主要是说编程时期我们确实可在源程序里调用.class类文件,而且跟直接调用它的.java类文件是一样的.”你就是错在这一句话上。在程序设计期间,你使用的只是一个类的名字而已,它和类的class文件没有任何关系。只有当编译的时候,编译器才会把它与一个class文件建立起关联。而在程序设计期间,“直接调用它的.java类文件”
    这个说法是毫无意义的。换句话说,当你在一个文件A.java里,使用另一个Java文件B.java里定义的类的时候,你仅仅是写下一些标识符而已(类的名字、类的成员名字),你根本就没有与文件B.java发生任何关系!只有在编译的时候,编译器其看到了这些标识符,它才会去查找该类的class文件,从而把你的指令翻译成字节码——如果此时该类还没有生成class文件,那就转而先编译该类,产生它的class文件。
    至于反编译的问题,本质上C++与Java也没有啥区别,只不过C++里的类编译之后的代码是都放进了可执行文件里,你没有办法看到而已,而Java里,每一个类生成一个互相独立的class文件,你能明显地看到它。
    实际上,一定条件下,C++程序也可以反编译,从而从可执行文件中获取类的源代码;同样,Java类文件也可以反编译得到代码,这也是一定的条件下的。在计算安全技术里,有个专门的领域,就是研究如何把你的源文件中进行某种处理,从而使反编译工具根据机器码(或者字节码)无法恢复出源代码。
      

  15.   

    .class文件的字符本身就是字节码对吧?
      

  16.   

    .class文件的字符本身就是字节码对吧?
      

  17.   

    .class文件的字符本身就是字节码对吧?
      

  18.   

    .class文件的字符本身就是字节码对吧?
      

  19.   

    注意:我是从编译层面说,而不是运行层面说.我意思是c++里一旦把一个原型类编译成二进制形式的"类",那么这个"类"就不能再用来给源程序继续编程了,除非它是com组件模型.但java就可以,它编译成的abc.class文件是可以继续用到源程序里的,这点我就感觉它很象com组件.
      

  20.   

    实在听不懂你要说些什么,我觉得你似乎一心想要把自己的某种看法强塞给Java或者C++。我只能说,就我所知,无论Java还是C++,都不是你设想的那个样子。
     
    算了吧。到此为止,不再讨论了。就算是求同存异吧。
      

  21.   

    JAVA C++ 技术群:45609427
    提出问题,挑战技术,呈请加入! 
      

  22.   

    敬请lixkyx麻烦登陆下 http://topic.csdn.net/u/20071217/14/837ea663-87cc-4c35-a2db-d1406585be65.html
    看看我们后几楼的说法,也许你从那可以更清楚看出我们的意思,进而戳合和修正我们的偏见.麻烦你了.先谢谢!
      

  23.   

    “c++里一旦把一个原型类编译成二进制形式的"类",那么这个"类"就不能再用来给源程序继续编程了,”问题还是在这里啊,编程阶段和编译阶段是分开的、依次进行的。你编程完毕之后,才谈得上编译,所以“编译之后,生成二进制形式”再来谈论编程是没有意义的。我想:你可能是觉得,在Java编程时,对于别人已经定义了的类,只要有了它的class文件,我们就不需要知道它的源文件,就可以使用这个类了,而在C++中好像不是这样的,你必须include它的源文件才能使用它。其实这个差别也只是表面的,只是编程时手续的不同,不代表Java和C++在类和对象使用上有什么根本区别。
    你回顾一下C++,就会发现,在C++中,你也可以一定程度上将类作为一个独立实体使用:C++中,你可以定义一个类,把它作为资源提供给别人使用,这样的程序是没有main函数,不能执行的,但是必须编译。
    在定义这个类的时候,类的声明和类的成员函数的实现可以是分开的,处于不同的文件里,即含有类的定义体的头文件和含有成员函数实现的cpp文件,前者不能编译,也不能运行,后者可以编译,不能运行。注意了,当你在其他程序里使用这个类的时候,你仅仅需要include它的头文件,而后者是不需要include的!而且,别人在发布这个类的时候,完全可以仅仅把后者编译之后的机器码文间给你,而不给你cpp文件本身!看到了吧?这里,C++中的类的使用,完全也可以类似Java中的使用方法,只不过,它不够彻底而已,只还是需要看到C++类的头文件,即类的声明,而不需要看到类的成员函数具体实现的源代码,只需要后者编译之后生成的机器代码。
    而在Java里,连类的声明和具体实现都一并合为一体,全都放入到class文件里了。你可以完全不需要类的源代码文件,只需要class文件。这个原因主要是Java里,类的声明和实现是不能分开的,所以不可能象C++那样分开。
      

  24.   

    “而在Java里,连类的声明和具体实现都一并合为一体,全都放入到class文件里了。你可以完全不需要类的源代码文件,只需要class文件。”
    这就对了,我其实就要你这句话的。你意思就是我完全可以不需要源代码,只需要.class文件即可提供代码复用的问题,对吧。这你看是不是有点象com等组件模型那样具有二进制复用特性?
      

  25.   

    呵呵,可以这样说。不过,严格地讲,你还是需要了解类对外部的接口的,例如它有哪些方法和哪些属性,否则你就不知道该如何使用它了。这些通常放在技术文档里。但是,在C++中,也是这样啊,你需要的只是包含类的声明的头文件,至于成员函数的具体实现的源代码,你也可以没有,只需要有它编译之后的机器码文件就可以了,这一点上,和Java是类似的。
    至于头文件,它里面只是类的声明,也就是成员变量和成员函数的声明,跟Java的技术文档读起来效果是一样的。哈哈!^_^
      

  26.   

    如果换.class类文件,会有象c++类那样可以只包含声明而未有实现实体的.class类文件吗?
      

  27.   

    那当然不会了,因为Java不允许把类的声明和实现分开。这是一个语法规则上的不同,但是没有啥本质上的区别。
      

  28.   

    如果是这样的话我还是愿意重复下,.class类模块是不是有点象com等组件的味道,即二进制级复用模块的味道呢?而且我觉得这样比c++要好得多啊,起码我复用一个.class类时不用担心会不会丢了一些未包含进来的函数体啊,这样说对吗?
      

  29.   

    “起码我复用一个.class类时不用担心会不会丢了一些未包含进来的函数体”这个我不懂,难道使用C++的类的时候会出现这样的问题吗?
      

  30.   

    有请lixkyx麻烦继续回答下我在38楼的问题:class类模块是不是有点象com等组件的味道,即二进制级复用模块的味道呢?意思也就是:它是不是象Win下的那些基于com技术的Activex等二进制级可重复使用的模块?
      

  31.   

    不好意思,也许形式上有些类似,但是我看不出来它们有什么起源上的关联,实质上的实现技术也是大异其趣的
    。这可能是我对com的理解太少的原因。
      

  32.   

    起源和实现技术肯定是不同,一是基于Windows平台的,一是基于java平台的.我是指它们功能上的相似性,就好比applet与Activex一样.