黑马程序员技术交流社区
标题:
方法的加载问题
[打印本页]
作者:
HM马明宇
时间:
2013-4-1 03:52
标题:
方法的加载问题
本帖最后由 HM马明宇 于 2013-4-1 22:21 编辑
问题在注释里:
/**
* 近日对类中方法的加载有些疑问:
* 通过实践发现,方法无论是否静态,皆可调用(编写时)在其位置之下的方法
* 不过,据我所知程序是按照从上往下的顺序进行执行的(循环等特殊条件除外)
* 那么,问题就来了(当然,类的加载顺序是先加载静态对象(变量和函数)再加载非静态对象的(变量和函数))
*
* 首先我们知道通过静态方法中不能使用非静态对象
* 据此我可以推断方法中的方法体在加载时肯定也要被检验
* 但是为何(普通静态都一样)方法1可以调用方法2?
* 按照程序的执行顺序,(此处以静态方法举例)虽然静态方法2也是静态方法,但是其位置在方法1之下啊
* 加载到方法1的时候,在平常看来方法2还没加载,为什么这样不报错?
* 类中同种(即要么都静态,要么都不静态)方法的的加载是一个什么机制?
*/
class Test {
/**
* 普通方法1
*/
void pumethod1() {
this.pumethod2();// 普通方法中,方法1可以调用方法2
}
/**
* 普通方法2
*/
void pumethod2() {}
/**
* 静态方法1
*/
static void method1() {
/**
* 此处在编译中会报错,因为加载本静态方法(method1())时,
* 还没有加载下面这个非静态方法,所以编译报错,
* 由此可判断, 编译时方法中的方法体也是要经过检验的
*/
pumethod1();
method2();// 静态方法中,方法1可以调用方法2
}
/**
* 静态方法2
*/
static void method2() {}
}
复制代码
作者:
刘策
时间:
2013-4-1 07:11
当jvm加载类文件的时候,用static的成员就已经存在了,是不按顺序,同时加载进内存的方法区内,所以不论方法是在上还是在下面,它都能找到,你还可以这么想,如果 是按顺序的话,方法一先进来了,在调用方法二,这时方法二也就进来了,它就可以调用了,其实是同时加载进内存的,
作者:
杨玉辉
时间:
2013-4-1 07:24
建议多看看构造代码块,静态代码块,以及静态方法的加载,
非静态方法的执行一般是涉及到被调用的时候,就会先加载并执行一遍,没有什么先后的
作者:
汪平乐
时间:
2013-4-1 09:08
非静态方法用来被对象调用的,即建立对象后才会存在该方法。而静态方法是随着类加载而加载,即只要类存在静态方法就有....
作者:
邵彩华
时间:
2013-4-1 09:48
你说的是编译过程报错,因为编译过程是检验文件的语法是否正确,并把相关的java问价编译成类文件。而类的加载时在运行时。
当用java命令运行一个文件时,虚拟机先把java命令后的那个类的加载到内存中,加载完成后才开始运行的;先运行类中的静态代码块(若有多个,则按照代码出现的先后顺序执行),然后才运行主函数;若主函数调用的是本类中的成员,则直接在本类中寻找即可,若调用其他类的成员,则此时就先开始把那个类加载到内存中,然后才使用它的成员(包括使用其构造方法构造一个该类对象)。
若还有疑问,可看下java虚拟机执行机制http://wenku.baidu.com/view/2e68354a852458fb770b56c5.html
作者:
邵彩华
时间:
2013-4-1 09:52
你说的是编译过程报错,因为编译过程是检验文件的语法是否正确,并把相关的java文件编译成类文件。而类的加载过程是在运行时。
当用java命令运行一个文件时,虚拟机先把java命令后的那个类的加载到内存中,加载完成后才开始运行的(先加载后运行);先运行类中的静态代码块(若有多个,则按照代码出现的先后顺序执行),然后才运行主函数;若主函数调用的是本类中的成员,则直接在本类中寻找即可,若调用其他类的成员,则此时就先开始把那个相关的类加载到内存中,然后才使用它的成员(包括使用其构造方法构造一个该类对象)。
若还有疑问,可看下java虚拟机执行机制http://wenku.baidu.com/view/2e68354a852458fb770b56c5.html
作者:
邵彩华
时间:
2013-4-1 09:58
细节加载和执行先后顺序,也可以加我QQ私聊。
作者:
贺靖轩
时间:
2013-4-1 11:42
编译过程中 加载类
运行过程中 执行类
时间上有先后顺序 所以无关空间顺序
作者:
HM马明宇
时间:
2013-4-1 16:38
刘策 发表于 2013-4-1 07:11
当jvm加载类文件的时候,用static的成员就已经存在了,是不按顺序,同时加载进内存的方法区内,所以不论方 ...
同时加载的是方法名么?方法体中的内容呢?总得有个加载时间吧?
作者:
HM马明宇
时间:
2013-4-1 16:50
各位楼上的亲们,解释的有点空泛啊,没有说道点子上
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2