A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 刘源 于 2012-8-9 15:03 编辑

方法包括静态和非静态。
方法优先于对象存在。
静态随着类加载而加载,消失而消失
那非静态呢?什么时候加载,什么时候消失,生命周期多长?
我说的是方法区中的方法,不是栈中的方法。
“问题已经解决”。

2 个回复

倒序浏览
方法包括静态和非静态。
方法优先于对象存在。
静态随着类加载而加载,消失而消失
那非静态呢?什么时候加载,什么时候消失,生命周期多长?
我说的是方法区中的方法,不是栈中的方法。

首先说非静态方法加载
类在加载时类中的非静态方法已经存在,存在于方法区中,不过它们没有任何作用
相当于“睡眠”状态。
类加载结束后,调用到非静态方法,才将其唤醒,使用非静态方法。


然后其生命周期
严格来说,不能说方法的生命周期,实际上类中的非静态方法,
你可以认为,是在类中有一个引用,他指向方法区中的方法,在类中
执行到这个方法引用时,就调用方法区中的方法,调用结束后,引用消失
但是方法依然存在于方法区,直到类消失,方法区中的方法没有了引用
方法区中的方法自然就消失了
所以 ,你可以认为:方法是在类消失之后,也随之消失


最后解释一句:楼主说的栈中的方法,我表示不解
我认为栈中存放的只是方法中的成员变量和局部变量
方法可以存放在栈中吗?

回复 使用道具 举报
我也不知道非静态方法是什么时候进如方法区的。
不过可以自己做一个逻辑推理:
首先只有静态方法能类名调用,而非静态方法只能用对象调用,
    第一步推断   静态方法用类名调用是因为 他出现的时候已经有类的存在,所以类能调用。不存在对象,所以对象调用不了。
那么把这个原因套到非静态方法里的话,我门可以推出
    第二步     对象能调用非静态方法是因为非静态方法出来的时候,已经有对象的存在,所以对象才能调用该方法。
由此得出
    第三部推断   非静态方法应该在建立对象的过程中加载进内存的。
但究竟是哪一步加载进去的呢?
    对象实例化过程  首先 (1)编译程序 产生.class文件,-------》(2)然后 加载.class文件的同时加载了静态部分,-----------》 (3)再接着 给对象分配内存地址 ,——————》(4)进行默认初始化,--------》(5)然后再进行显示初始化,-------》(6)构造函数初始化--------》(7)对象创建成功。

做出推断4    非静态方法的建立过程必然 在(2)以后,这个很明显,不多说。
            也必须在(6)之前,因为构造函数也包含在 非静态函数中,这里不加载非静态函数 就调用不了构造函数。
第五步推断  经过默认初始化后  对象中才读取 class 中的内容对已经赋值的 成员属性进行显示初始化,也才涉及到 类中的非静态方法

所以最后 下结论,非静态方法 应该实在对象建立过程中进行 显示初始化时才 加载的。

这是我自己的思路,谁有更权威的资料的话,欢迎教导
   
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马