黑马程序员技术交流社区

标题: 加载到内存的先后顺序 [打印本页]

作者: 胡威    时间: 2011-11-13 19:42
标题: 加载到内存的先后顺序
class Person
{
   private static int age=5;
   void show()
   {
      System.out.println(age)
   }
}
Person p=new Person();
p.show();
请问在加载person.class文件时,static会随着类的加载而加载,那么show()也会同时加载到方法区的非静态区吗?还是在类加载完毕之后创建对象的时候加载到方法区?还是在对象创建完毕之后在对象调用show()的时候加载到方法区?
作者: 宋文轩    时间: 2011-11-13 20:12
show()不会加载,show方法会在建立对象的时候在堆内存建立   只有静态方法才会加载到方法区
作者: 肖瑞军    时间: 2011-11-13 23:33
静态变量和静态方法随类得加载而加载到栈内存中,非静态方法会存在方法区,new的对象会放在堆内存中,对象的引用P会放在栈内存中,且P指向new Person()对象。
作者: 坚强    时间: 2011-11-14 08:52
肖瑞军 发表于 2011-11-13 23:33
静态变量和静态方法随类得加载而加载到栈内存中,非静态方法会存在方法区,new的对象会放在堆内存中,对象 ...

  我看毕老师的视频记录是这样的:
  静态变量和静态方法是存在方法区中,而非静态成员是随着对象的建立而存在堆内存中。
作者: quanhui    时间: 2011-11-14 09:49
是的,在Person.class文件加载时,静态方法和非静态方法都会加载到方法区中,只不过要调用到非静态方法时需要先实例化一个对象,让对象才能调用非静态方法。如果让类中所有的非静态方法都随着对象的实例化而建立一次,那么会大量消耗内存资源,所以才会让所有对象共享这些非静态方法,然后用this关键字指向调用非静态方法的对象。
作者: 杨强    时间: 2011-11-14 09:56
quanhui 发表于 2011-11-14 09:49
是的,在Person.class文件加载时,静态方法和非静态方法都会加载到方法区中,只不过要调用到非静态方法时需 ...

我同意这个
作者: 高双武    时间: 2011-11-14 09:57
类加载过程如下
Person p=new Person(“张三“,20);
1、jvm将Person.class文件从硬盘加载到内存,
2、静态代码块执行
3、开辟空间,分配内存地址
4、建立对象属性默认初始化,字符串为类型为null,整型为0
5、显示初始化  及声明类时的初始值
6、对对象进行构造代码块执行
7、对对象进行对应的构造函数初始化
8、将内存地址赋给栈内存中的p变量
比老师视频笔记

作者: 别让生命去等待_    时间: 2011-11-14 10:01
看被加分来看看,学习学习




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2