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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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

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

2 个回复

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

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

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

这是我自己的思路,谁有更权威的资料的话,欢迎教导
   
回复 使用道具 举报
方法包括静态和非静态。
方法优先于对象存在。
静态随着类加载而加载,消失而消失
那非静态呢?什么时候加载,什么时候消失,生命周期多长?
我说的是方法区中的方法,不是栈中的方法。

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


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


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

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马