代码如下:
class name
{
}
编译后运行,以上为了简化代码,没有main函数,运行提示需要main函数(有main的代码我也试过的),编译生成的字节码文件为
name.class,更改为,nameaaa.class,无法运行,我用的是sun java sdk 1.6.0_13
谢谢

解决方案 »

  1.   

    java规定类名要和文件名相同,所以不能改名。太基础的问题了,请遇到类似问题时先查一下书。
      

  2.   

    呵呵!@
    这个本来就不能改的呀!会出现“java.lang.NoClassDefFoundError”异常!加油啊 楼主!一起努力!
      

  3.   

    这事基本的语法问题,
    类修饰必须为public 
    编译后的文件名应该可以该,它是用来查找该文件的,那你 运行时名称也是nameaaa.class
      

  4.   

    我问的问题是关于字节码文件的啊,请你看清楚啊好吗,而且你说的"java规定类名要和文件名相同,所以不能改名",我虽然新学,但知道java并没有这么规定,java规定(只在我用的编译器上是这样,不知道是不是java规范)带public 修饰符的类名必须与源文件名相同,而且你所说的问题就算成立,也只在编译阶段,我是在运行字节码文件出现的问题,虽然扩展名是.class,但跟你回复里的”类“显然是不同的概念。
      

  5.   


    是的我用命令行运行,java nameaaa,并不用加扩展名.class
      

  6.   


    我想知道为什么,我用c语言编写代码,生成.exe文件,无论我改什么名字都是可以执行的,不能改岂不是很不方便.
      

  7.   

    不能改啊,这个规则
    要运行java程序,必须要有主方法main()
      

  8.   

    那就main好了,我已经说过了,加main也是一样的
      

  9.   

    机器给你编译生成class文件为什么要去改变?
      

  10.   

    大哥 你先往后看就明白了 编译是为什么?你懂吗 编译是为了生成jvm能认识的字节码,声称.class;那么你知道.class是什么意思吗? 这个类以后是通过你的class的文件名来调用,那么你把名字和程序本身的累名改了,那这个类还有什么意义?生成的类是为了以后来调用 根据文件明来找. 学java最怕想你这么钻,钻的地方都不对,你要是钻下面向对象或者继承或者多态那还有情可原,单你钻这个就太不对了,在后面的学习中你会慢慢了解这个命名规则的意义所在.你要在象这样钻牛角尖奉劝你别学了,学不好的!过来人的经验希望你能明白.
      

  11.   

    给你打个比方,你入学前要拿你的毕业证书吧加入毕业证书上写的是张三,那你却叫李四,教务处会告诉你这个是错误的,那么java一样 .class文件名 就代表着程序里的类名, 2个不一直jvm就相当于教务处来告诉你出错了!明白吗?
      

  12.   

    不要讲那些空泛的,相当然的东西,在计算机世界里,请你用数据,标准说话,我只相信数据,别跟我讲大道理,我来是学java的,不是来学哲理的,别动不动就说别人钻牛角尖,在我看来这个问题,包涵了jvm是怎样运行文件的,应该是要知道的
      

  13.   

    你打的比方跟我说的事情有可比性吗?
    照你这么说,我把cs1.5.exe改成cs1.5aaa.exe,操作系统(教务处)是不是要告诉我,我出错了,你不能玩反恐了
      

  14.   


    是java规范中的规定。不能改是因为jvm在运行时是按类名来载入的,而且大小写敏感的。如果你代码中的类名是name,在运行时jvm会在classpath中找名子叫name的文件。如果更改会导致无法加载类。总之,类名和文件名要相同。
      

  15.   

    class 文件只是编译得到的文件。。`  就像是.c的文件吧。 你变成exe文件。。改下名字还是可以运行。。
     你以后.class 文件打包成 jar文件。。
    你随便也下名字也是可以运行的啊一样啊。~`只是我不知道你把.c文件改下名字能不能运行啊。
      

  16.   

    关于public的那个约定是关于“源文件的”
    对与class文件,每个实际的类class都会生成一个.class文件,这个类名必须和文件名相同。这点也很容易理解,比如你用java启动一个类时,使用的是
    java HelloWorld
    而不是java HelloWorld.class,java看到你用的类是HelloWorld,它就去找HelloWorld.class这个文件。比如你程序里面用到了
    Test t = new Test();
    执行到这的时候也是根据这个Test类名信息去加载Test.class类,你把文件名改了jvm只能报错了。不要拿.exe的问题来比较,你点击一个文件名,操作系统只要去解析这个PE文件的格式就可以了,这个文件名跟程序没有关系。而java虚拟机是根据类名去找相应的类名.class文件的。
      

  17.   

    打个比方吧,比如你家的门牌是5号,C好比是你楼下的邻居,运行C程序的时候,门牌号对于系统来说不重要,他可以直接找到你;Java好比是邮递员,因为Java程序是运行在JVM上的,JVM是要通过你的门牌号才能找到你。你把门牌号改成20号,对于JVM来说就会晕了。
      

  18.   

    我支持楼主~~~~~ 我之前也没想过这个问题,现在想想到底是为什么呢?下面是我的结论,可以大家讨论。首先,要了解JVM类加载机制。当JVM遇到一个类的时候,会去查找类路径下所以目录和jar文件。这里,我假设类的名字和文件名字可以不一样的,甚至包名和类所在的包也可以不一样,那JVM除啦要读文件名字之外,还得把类文件的内容也读出来。如果有上万个类那JVM为啦找一个类,而要把进上外的类都读出来。明显这样是十分低效率的。这就是为什么java规范里面有这个规则,其实和main函数为什么一定是main一样,就是为了减少检索消耗资源。回头说灵活文件性的问题。java可以把很一个,或者多类打包成一个jar包,这个包可以指定一个含main函数类作为程序的入口。这样java直接运行这个包。而这个jar包的名字你想怎么改都没问题
      

  19.   

    楼主,首先告诉你,类名是可以改的,但你这样改是有问题的
    有main的类运行不一定正确,但没有main的类一定是错误的,因为main是静态的方法,它独立于每个类,是jvm直接调用的开始方法。所以没有它jvm根本找不到程序的入口。
    类文件中的类名不一定必须与类文件名相同,除非类前有public关键字,这个类才必须与类文件名相同,而且每个类文件中只能有一个public类。楼主可以验证一下,至于你的问题可以解释如下:
    你一开始编译name.java成name.class,如果这时运行是正确的,那么当你把name改成nameaaa后,需要重新编译
    (javac 你的类文件名.java)。这时会生成新的class文件——nameaaa.class,这是运行java nameaaa即可
    注意:nameaaa类中必须有main方法。
      

  20.   

    如果不调用这个类那么 这个类就是一堆代码jvm并没有将其导入内存区,一旦你调用这个类.
    或者说通过这个类声称对象了,那么jvm会开始找相关的累也就是你的name.class,这个
    但是你把名字改了 在jvm看来.class文件里的类必须和程序里的类相同才可以来用,所以
    在运行是就抛出了NoClassDefFoundError.
    最后我想重申的是,我并没有说大道理更谈不上什么哲学,我只是觉得楼住很无知不吸取前者
    的经验,我一再告诉你别钻牛角尖,说真的,如果你还不明白,真不用在这里问了,你该去sun
    公司问问java语言开发者们,他们就这么定义的jvm在运行一个类的时候查找文件名必须和类
    名一样的文件才能调用该类, 这就好比交通部门规定红等停绿灯停一样,你非要找个路人问
    为什么红灯就不能行非要停一样,那么你该问的人是交通部的他们为什么定义,明白?
    学java 你必须记得一些规定的东西因为这是每必要问的,在java被开发好前,开发人员
    就是用这个机制来定义 jvm工作原理的,你非要问 这里楼上很多人很多人已经解释的可以了
    你再钻,就去问问sun公司的开发人员吧,祝你好运!
    用小沈阳的话,这个真不该问!
      

  21.   

    你学的是 java啊 不是c啊大哥,java优于c的重要表现就是可移植性强,这也就是jvm的存在所在.居然那c来问这个问题
    能问出这个问题看来连c都没学好就用c和java来做比较,这哪行,试问你用c在多个操作系统下运行比较过吗?看你这么问感觉
    你也就是在学校初学了下c而已,对c有个大概的基础性了解.汗死!
      

  22.   

    看了你的回帖,你叫了我两次大哥,我不是你的大哥,我也没有你这样的小弟。我拿c和java做个比较,打个比方,纵使相差很远,也比你什么教务处,交通灯的比方好吧,这什么跟什么啊,套用你的话,这哪行,看你这么说感觉你的社会经验很差,你以为红灯停就真的没原因了,像你这样凡事不求甚解的人,我真地懒得理你,这是我最后一次回复你的帖子,仔细看看你自己的回帖,从头到尾都是你自个儿在那里想当然,汗死~~~~~
    借用赵本山的话,你说你连1和2都分不清楚了,你都2到啥程度了
      

  23.   

    不如这样吧我说'大哥'是我真的很着急,这是我的qq号14990544,我不想看到初学的人在这些问题上绊脚,如果你能理解
    我举例子的意思其实很好办,我只所以举交通等来说明,是因为那个不用问为什么,是定义好的,作为程序员我们既然用
    sun公司开发出来的语言,那就要遵循他们的规则,并且我强调你可以通过后面学习到的知识来自己回答你提出的这个问题
    不要在规则上去钻研!
      

  24.   

    你还是加我qq说吧!说句实话你说我不求甚解,真的是我自己感觉很愿望,从高中到大学,所有我的同学都知道我是个问题狂,
    学到新东西不搞明白来龙去脉我是不罢休的,但是从学习java开始通过自己的失败和别人那里老师那里得来的经验发现,
    java的学习方法用你那样的 是真的不可行,我只所以回复你那么多帖子,写那么多是真正想帮你,我也是从这个路走来的人,
    我了解其中的过程,很多人回帖一句话带过,而我却回复了这么多,帮人返被误解!
      

  25.   


      呵呵  楼主钻研精神很好。个人认为很适合往C和C++方向发展。
      C编译后的是EXE文件 操作系统直接识别执行  只要有main()人口就行。
      java字节码文件 是要由JVM执行,JVM得根据文件名来执行对应的类。 所以文件名不能改。
      至于JAR文件 想必跟EXE接近了  改名字后 依然能正确执行。
      

  26.   

    假设 那么现在需要在另一个类里面创建一个name类的对象,当开始运行程序时,jvm开始按顺序看代码,当他看到创建了一个
    name的对象时,jvm就在当前目录里开始寻找了(创建一个对象,jvm需要知道name类里的成员,所以开始寻找name.class这个
    文件了),可是这就是关键的问题所在了,jvm是通过.class的名字找name类,那么jvm开始寻找整个目录都没有找到name.class
    这个文件,虽然你这个当事人知道nameaa.class文件了装的就是class name{}这个类,但是jvm他不知道啊,jvm遵循他的开发者
    给他的定义,开发者告诉jvm你要找类的成员,就通过.class文件开始找吧.也就是jvm知道如果找到了name.class,就能找到该
    类里的字节码了,但是很遗憾,jvm没有找到name.class原因是名字被当事人改成了nameaa.class,其实原因就在于jvm本身
    所遵循的规则!
    假如你这样做下 新建后你写代码class name {}; 把这个文件取名为nameaaa.java,
    然后你命令行输入 javac nameaaa.java 
    那么目录中立刻会生成  name.class而不是nameaaa.class,这个过程并不是jvm在操作其实是系统操作,因为系统知道我必须
    生成一个和自己码中类名一样的 .class文件,因为这样操作后,当该.class文件在需要运行时jvm可以找到它
    系统在帮jvm要运行前最好在准备,而你却把这个名字改了,那么ok你改吧,jvm永远不会找到name类了,
    java语言的开发人员在开发时已经设想到有人会做这件事了就向楼主一样,所以在开发时专门最了个异常,而异常是在jvm在运行
    时才会生成的,那么好了现在开发人员都告诉你了noclassdeffounderror这个异常,楼主还问这是为什么,不能改,其实就没有
    什么必要了!我不知道我对jvm的讲解能否让楼主看明白!我已经努力了,希望楼主能明白!祝你学好java!
      

  27.   

    没注意到这个问题,
    试试用javap命令反编译下。
      

  28.   

    谁告诉你的,类中必须有main方法!
    麻烦给初学者说清楚好吗?别误人子弟,类中当然可以没有main方法只要这个类编译后别运行作为以后来调用就可以了;
    教人也加点修饰吧,直接说类中必须有main否则要出错!太误导了吧!
      

  29.   

       之所以我说你先看后面的,这个问题慢慢你就可以了解了,是因为以后你写完一个大的程序,里面会包含很多的类,这也就是区别
    c思想的原因,java是面向对象编程,要写很多的类准备调用,那么到了这个时候在你写完一个项目后,自己会做一个文挡注释
    生成一个类似于API文挡的东西,这个是为了给你小组或者后面要升级这个程序的其他程序员看的,里面包含了你这个程序里
    都有什么类,和这个类的成员函数提供了什么方法,那么他们看到的是class name而不是name.class,而这个是规范,当其他
    程序员要用你这个类的时候会写import XX.XX.Name; 可如果你改了 那么完蛋了其他程序员在也找不到你这个类了,因为
    在以后的工作中别人是不可能把源代码给你看的,只有class文件,这样来说.class文件就必须和class name名字一样,
    所以我说不比问了,sun公司开发java是为了以后工作中更方便程序员而专门给jvm设置的机制那就是在寻找类是找类.class
    找到后在看这个文件里的字节代码,现在把名字改了,jvm都没找到目标文件更谈不上去看你的.class文件(其实里面装的就是
    jvm要找的东西,但是jvm他不知道,它只找.class,找到后在看里面的内容).
    你看 如果你是jvm,你要去买书 你想买java的书,你到了书店会先找书名是java的才会看其中的内容,那么如果有本书是java经典中的经典,这本书就是你要找的,但是这书皮被出版社误写成是c语言,那你会去看这本书里面的内容吗?你肯定不会了。这些东西
    其实不用讨论,就想你对这个世界的认知一样,你就知道我要找书就必须这么找,那么jvm也知道它要找类就找类文件名!这是
    发明jvm的人在jvm诞生的时候就告诉它的(这句说的有点大白话,只是为了方便理解);所以我才一再强调如果非要问为什么,
    这个真不该问,要问就问jvm的创始人为什么要教给jvm这个找类文件的方法!
      

  30.   

    看了你的回复,感到你是个非常热心的人(现在这样的人很少了)我对之前有些冒犯的言辞表示诚恳的道歉。Edwin603 老弟,请原谅我对你的误解。另外关于本帖的问题,在论坛这么多人的帮助下,我已经有点头绪了,稍后会来结贴。
    谢谢。
      

  31.   

    貌似楼主他知道 书上都说不能改类名,楼主就是想知道为什么书上这么规定,的确这个其实不用问,后面自己会慢慢了解,
    但是必须给初学者指出在学java时不该有的一些想法,你的这个回复没有什么必要发,这里很多人都是初学者,大家
    要互相帮助互相解答,不要认为自己是个老鸟,就用看不起的语气来说教别人,你一样从无知走向成熟,请尊重初学者
    既然是老鸟,那就把精力方在摆正他们的学习方向上,不要反问也不要只质问!
      

  32.   

    我晓得楼主的这个问题可能已经结贴了,但我忍不住还是要说两句!
    首先我要告诉楼主的是,比如你的*.java文件里的public class *, *名为MyClass,通过命令javac MyClass.java 编译成为一个MyClass.class文件,这里的.class文件并不是c或c++编译后的可执行文件,而是一种被JVM识读的字节码文件。
    JVM的运行机制我就不再跟你列举,说下你改过名字后出现的问题原因,你先看下面这个类,这是我简单给你模拟出来的一个类似你用的java命令的模拟类,数字代表行号:
    public class Java{
       public static void main(String[] classFileName){
        1:  Class c = Class.forName(classFileName[0]); //记得java MyClass吗?
                                    //classFileName[0]就是你的MyClass.class 的名称
                  //上面这行代码是类似虚拟机根据你这个class文件名称查找到你的这个class文件
                  //并在这个文件中搜索访问修饰符为public的MyClass类
                  //如你所述你的类名为name,那么你用java命令运行该类时,就必须输入name
                //否则他就找不到nameaaa,明白不?
         2:    java.lang.reflect.Method method = c.getMethod("main", String.class);
                //关于上面这行代码建议你查找API去理解他的用法
                  //这句作用是在查找到类里面去查找一个叫做main并有一个String类型参数的方法
        3:    method.invoke(null, args);
                //执行找到的方法,第一个参数为对象(也就是你的类的实例化),这里调用静态方法所以留空
       }
    }
    再回来说你的问题:
    1,class 不带public修饰符,但不影响Class.forName()方法的运行,所以第一行会通过
    2,只有类声明,没有public static void main方法,相当于上面第2行出现运行时异常
    3,*.class文件被改名,相当于第一行出现NoClassDefException不知你明白不?
      

  33.   

    .....................................
    问问题的人不懂 某些人也把短的说成长的看报错就知道了 jvm以文件名来匹配类的 
    Hello.class 改成 Hello1.class
    提示找不到Hello1 这个类 只找到Hello这个类把Cs.exe文件夹中的某个dll名字改了 也一样报错的
    把Hello.class打包成Hello.jar  名字随便你改实现机制不一样而已书本上没说的多的去了 你知道你们市有几口人不