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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 胡威 黑马帝   /  2011-11-13 19:42  /  3015 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

坚强 黑马帝 2011-11-14 08:52:15
楼主
肖瑞军 发表于 2011-11-13 23:33
静态变量和静态方法随类得加载而加载到栈内存中,非静态方法会存在方法区,new的对象会放在堆内存中,对象 ...

  我看毕老师的视频记录是这样的:
  静态变量和静态方法是存在方法区中,而非静态成员是随着对象的建立而存在堆内存中。
回复 使用道具 举报
class Person
{
   private static int age=5;
   void show()
   {
      System.out.println(age)
   }
}
Person p=new Person();
p.show();
请问在加载person.class文件时,static会随着类的加载而加载,那么show()也会同时加载到方法区的非静态区吗?还是在类加载完毕之后创建对象的时候加载到方法区?还是在对象创建完毕之后在对象调用show()的时候加载到方法区?

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

7 个回复

倒序浏览
show()不会加载,show方法会在建立对象的时候在堆内存建立   只有静态方法才会加载到方法区
回复 使用道具 举报
静态变量和静态方法随类得加载而加载到栈内存中,非静态方法会存在方法区,new的对象会放在堆内存中,对象的引用P会放在栈内存中,且P指向new Person()对象。
回复 使用道具 举报
是的,在Person.class文件加载时,静态方法和非静态方法都会加载到方法区中,只不过要调用到非静态方法时需要先实例化一个对象,让对象才能调用非静态方法。如果让类中所有的非静态方法都随着对象的实例化而建立一次,那么会大量消耗内存资源,所以才会让所有对象共享这些非静态方法,然后用this关键字指向调用非静态方法的对象。
回复 使用道具 举报
杨强 黑马帝 2011-11-14 09:56:51
地板
quanhui 发表于 2011-11-14 09:49
是的,在Person.class文件加载时,静态方法和非静态方法都会加载到方法区中,只不过要调用到非静态方法时需 ...

我同意这个
回复 使用道具 举报
高双武 黑马帝 2011-11-14 09:57:26
7#
类加载过程如下
Person p=new Person(“张三“,20);
1、jvm将Person.class文件从硬盘加载到内存,
2、静态代码块执行
3、开辟空间,分配内存地址
4、建立对象属性默认初始化,字符串为类型为null,整型为0
5、显示初始化  及声明类时的初始值
6、对对象进行构造代码块执行
7、对对象进行对应的构造函数初始化
8、将内存地址赋给栈内存中的p变量
比老师视频笔记
回复 使用道具 举报
看被加分来看看,学习学习
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马