jvm的类加载疑惑求解
类的加载是指将类的.class文件中的数据读入到内存中,将其放在运行时数据区的方法区里面,然后在堆区创建一个java.lang.Class的对象,用于封装类在方法区内的数...
类的加载是指将类的.class文件中的数据读入到内存中,将其放在运行时数据区的方法区里面,然后在堆区创建一个java.lang.Class的对象,用于封装类在方法区内的数据结构!我们知道我们对于一个类可以创建很多个对象,但是这些对象共享同样的数据结构,而这个数据结构就是在加载过程中创建的.我们可以通过类名.class或者对象名.getClass()获取这个对象!无论创建了多少个实例对象,这个class的对象始终只有一个,类里面所有的结构都可以通过class对象获取,因此class对象就像一面镜子一样,可以反射一个类的内存结构,因此class是整个反射的入口!通过class对象我们可以反射的获取某个对象的数据结构,访问对应数据结构中的数据!
疑问1:放在方法区的数据结构我们是否可以理解为描述一个类的结构组成的信息码?
疑问2:在堆区中创建的不是一个类的实例吗?如Test类 放在堆区中的应该是new Test()吧? 展开
疑问1:放在方法区的数据结构我们是否可以理解为描述一个类的结构组成的信息码?
疑问2:在堆区中创建的不是一个类的实例吗?如Test类 放在堆区中的应该是new Test()吧? 展开
2013-03-21
展开全部
类加载完毕后确实会在 堆区创建一个相应 Class 实例,这个 Class 描述了该类的数据结构,属性,方法等,通过反射可以实现
创建对象并实例化类是,首先会在栈中创建对象,并在堆区中实例化该类,并将在堆区的对象的引用赋给栈中的对象,堆中,方法区是共享的,数据区是私有的,每个对象一个
创建对象并实例化类是,首先会在栈中创建对象,并在堆区中实例化该类,并将在堆区的对象的引用赋给栈中的对象,堆中,方法区是共享的,数据区是私有的,每个对象一个
追问
嗯 首先 谢谢你 但是你概念的理解有问题 你百度下
展开全部
不知道你有没有理解java类加载的过程
这里是有个加载器的概念的 比较复杂并非你说的那么简单
类的加载通常是封装在java.lang.ClassLoader方法里的
java有继承关系那么类的加载也有继承关系 java是有父类加载优先的
类的加载是初始化类的过程 这里又有很多知识 比如类变量 局部变量等等 以及这些变量的加载顺序等
疑问1:
放在方法区的东西是类信息 也就是java代码通过转义成jvm的可识别的代码
包含类的各种信息 比如类完整名称 、父类完整名称 、类的变量 、方法、等等
疑问2:
new一个对象是 对象的引用是在栈中 ,对象本身放堆中
这里是有个加载器的概念的 比较复杂并非你说的那么简单
类的加载通常是封装在java.lang.ClassLoader方法里的
java有继承关系那么类的加载也有继承关系 java是有父类加载优先的
类的加载是初始化类的过程 这里又有很多知识 比如类变量 局部变量等等 以及这些变量的加载顺序等
疑问1:
放在方法区的东西是类信息 也就是java代码通过转义成jvm的可识别的代码
包含类的各种信息 比如类完整名称 、父类完整名称 、类的变量 、方法、等等
疑问2:
new一个对象是 对象的引用是在栈中 ,对象本身放堆中
追问
我的疑惑主要是第二点 即 你所说的对象本身在堆中 这句话有点抽象 以我的理解 放在堆中的并非是"对象" 应该是 类名.class 即该类的Class对象 不知道这对不
追答
new 关键字产生的是类的实例 也就是说 源类 可以看成是一个模版 new相当于用这个模版来生产实例 也就是说实例对象实际上跟源类在内存存放方面是没有必然联系的 在java中所有对象的引用都是存放在栈中 对象本身放堆中 所谓引用就是该对象在堆中的内存地址 跟c中说的指针一样 java访问对象时先访问该对象在栈中的引用 再通过引用访问堆中的对象
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询