代码如下:
class name
{
}
编译后运行,以上为了简化代码,没有main函数,运行提示需要main函数(有main的代码我也试过的),编译生成的字节码文件为
name.class,更改为,nameaaa.class,无法运行,我用的是sun java sdk 1.6.0_13
谢谢
class name
{
}
编译后运行,以上为了简化代码,没有main函数,运行提示需要main函数(有main的代码我也试过的),编译生成的字节码文件为
name.class,更改为,nameaaa.class,无法运行,我用的是sun java sdk 1.6.0_13
谢谢
这个本来就不能改的呀!会出现“java.lang.NoClassDefFoundError”异常!加油啊 楼主!一起努力!
类修饰必须为public
编译后的文件名应该可以该,它是用来查找该文件的,那你 运行时名称也是nameaaa.class
是的我用命令行运行,java nameaaa,并不用加扩展名.class
我想知道为什么,我用c语言编写代码,生成.exe文件,无论我改什么名字都是可以执行的,不能改岂不是很不方便.
要运行java程序,必须要有主方法main()
照你这么说,我把cs1.5.exe改成cs1.5aaa.exe,操作系统(教务处)是不是要告诉我,我出错了,你不能玩反恐了
是java规范中的规定。不能改是因为jvm在运行时是按类名来载入的,而且大小写敏感的。如果你代码中的类名是name,在运行时jvm会在classpath中找名子叫name的文件。如果更改会导致无法加载类。总之,类名和文件名要相同。
你以后.class 文件打包成 jar文件。。
你随便也下名字也是可以运行的啊一样啊。~`只是我不知道你把.c文件改下名字能不能运行啊。
对与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文件的。
有main的类运行不一定正确,但没有main的类一定是错误的,因为main是静态的方法,它独立于每个类,是jvm直接调用的开始方法。所以没有它jvm根本找不到程序的入口。
类文件中的类名不一定必须与类文件名相同,除非类前有public关键字,这个类才必须与类文件名相同,而且每个类文件中只能有一个public类。楼主可以验证一下,至于你的问题可以解释如下:
你一开始编译name.java成name.class,如果这时运行是正确的,那么当你把name改成nameaaa后,需要重新编译
(javac 你的类文件名.java)。这时会生成新的class文件——nameaaa.class,这是运行java nameaaa即可
注意:nameaaa类中必须有main方法。
或者说通过这个类声称对象了,那么jvm会开始找相关的累也就是你的name.class,这个
但是你把名字改了 在jvm看来.class文件里的类必须和程序里的类相同才可以来用,所以
在运行是就抛出了NoClassDefFoundError.
最后我想重申的是,我并没有说大道理更谈不上什么哲学,我只是觉得楼住很无知不吸取前者
的经验,我一再告诉你别钻牛角尖,说真的,如果你还不明白,真不用在这里问了,你该去sun
公司问问java语言开发者们,他们就这么定义的jvm在运行一个类的时候查找文件名必须和类
名一样的文件才能调用该类, 这就好比交通部门规定红等停绿灯停一样,你非要找个路人问
为什么红灯就不能行非要停一样,那么你该问的人是交通部的他们为什么定义,明白?
学java 你必须记得一些规定的东西因为这是每必要问的,在java被开发好前,开发人员
就是用这个机制来定义 jvm工作原理的,你非要问 这里楼上很多人很多人已经解释的可以了
你再钻,就去问问sun公司的开发人员吧,祝你好运!
用小沈阳的话,这个真不该问!
能问出这个问题看来连c都没学好就用c和java来做比较,这哪行,试问你用c在多个操作系统下运行比较过吗?看你这么问感觉
你也就是在学校初学了下c而已,对c有个大概的基础性了解.汗死!
借用赵本山的话,你说你连1和2都分不清楚了,你都2到啥程度了
我举例子的意思其实很好办,我只所以举交通等来说明,是因为那个不用问为什么,是定义好的,作为程序员我们既然用
sun公司开发出来的语言,那就要遵循他们的规则,并且我强调你可以通过后面学习到的知识来自己回答你提出的这个问题
不要在规则上去钻研!
学到新东西不搞明白来龙去脉我是不罢休的,但是从学习java开始通过自己的失败和别人那里老师那里得来的经验发现,
java的学习方法用你那样的 是真的不可行,我只所以回复你那么多帖子,写那么多是真正想帮你,我也是从这个路走来的人,
我了解其中的过程,很多人回帖一句话带过,而我却回复了这么多,帮人返被误解!
呵呵 楼主钻研精神很好。个人认为很适合往C和C++方向发展。
C编译后的是EXE文件 操作系统直接识别执行 只要有main()人口就行。
java字节码文件 是要由JVM执行,JVM得根据文件名来执行对应的类。 所以文件名不能改。
至于JAR文件 想必跟EXE接近了 改名字后 依然能正确执行。
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!
试试用javap命令反编译下。
麻烦给初学者说清楚好吗?别误人子弟,类中当然可以没有main方法只要这个类编译后别运行作为以后来调用就可以了;
教人也加点修饰吧,直接说类中必须有main否则要出错!太误导了吧!
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这个找类文件的方法!
谢谢。
但是必须给初学者指出在学java时不该有的一些想法,你的这个回复没有什么必要发,这里很多人都是初学者,大家
要互相帮助互相解答,不要认为自己是个老鸟,就用看不起的语气来说教别人,你一样从无知走向成熟,请尊重初学者
既然是老鸟,那就把精力方在摆正他们的学习方向上,不要反问也不要只质问!
首先我要告诉楼主的是,比如你的*.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不知你明白不?
问问题的人不懂 某些人也把短的说成长的看报错就知道了 jvm以文件名来匹配类的
Hello.class 改成 Hello1.class
提示找不到Hello1 这个类 只找到Hello这个类把Cs.exe文件夹中的某个dll名字改了 也一样报错的
把Hello.class打包成Hello.jar 名字随便你改实现机制不一样而已书本上没说的多的去了 你知道你们市有几口人不