黑马程序员技术交流社区

标题: 静态求解 [打印本页]

作者: 陈苓    时间: 2012-4-7 00:44
标题: 静态求解
问题是这样的,不是说静态的成员函数和成员变量加载在方法区吗?为什么图上这个setName不是静态为什么画图画在方法区啊?

该贴已经同步到 格式化的微博

~43_QWS@S26U@2@3}9V4(3B.jpg (110.77 KB, 下载次数: 52)

~43_QWS@S26U@2@3}9V4(3B.jpg

作者: 李晓旭    时间: 2012-4-7 01:05
静态的成员函数和成员变量随着类的加载存在于方法区中,这是没有问题的,但是不代表方法区中只存在这些东西

jvm在运行时要大量使用存储在方法区中的类型信息。而且方法区是被所有线程共享的。

方法区的大小不必是固定的,jvm可以根据应用的需要动态调整。同样方法区也不必是连续的。方法区可以在堆中分配。

jvm可以允许用户和程序指定方法区的初始大小,最小和最大尺寸。

方法区同样存在垃圾收集,因为通过用户定义的类加载器可以动态扩展java程序,一些类也会成为垃圾。

我认为方法区是jvm运作的核心,所有的静态方法在加载类的时候已经加载好,而当你需要调用那个方法,或者对某个对象进行操作的时候,又会把方法加载到方法区进行调用


作者: 贠(yun)靖    时间: 2012-4-7 02:10
方法区  是存放   静态方法  对象的方法  还有常量的    你的set  get方法是属于对象的  所以是没问题的
  
作者: 刘_浩    时间: 2012-4-7 02:12
setName带方法(也就是说有明确的执行语句,是在方法中的),当作为一个方法名的名的时候是在栈的,就像main一样,是在栈中一样的。栈中不是只有一个setName()名字吗?而方法区中的不是带有明确的方法执行语句吗?
作者: 吴玉辉    时间: 2012-4-7 08:02
对于被装载的每个类,虚拟机都会把这个类的类型信息存储在方法区,方法区中存储以下信息:eg: public class Test extends superclass implements interface1, interface2

1,  类的全限定名

2,  类的超类的全限定名

3,  这个类是类型还是接口

4,  类的访问修饰符

5,  超接口的权限定名的有序类表

6,  该类的常量池,

     该类型所使用常量的一个有序集合,包括直接类型和对其他类的,字段和方法的符号引用。

7,  字段信息

字段名,字段类型,字段的修饰符(eg:private String field)

8,  方法信息

方法名,方法的返回信息,方法的修饰符(eg:public  void method),如果一个方法不是抽象的和本地的还将保存一下信息:方法的字节码,操作数栈和方法的栈帧中的局部变量的大小,异常表

9,  除了常量以外的所有类变量

类变量是多有类实例共享的,但是没有类实例也可以访问,只与类有关,编译时常量

10,             一个到classLoader的应用

11,             一个到class类的引用

12,             方法表(为了尽可能的提高访问效率,大部分虚拟机对每个装载的费抽象类,都生成一个方法表,把他们当做类型信息放在方法去类。)

方法区同样可以被垃圾回收。

作者: 孙国军    时间: 2012-4-7 10:13
问题是这样的,不是说静态的成员函数和成员变量加载在方法区吗?为什么图上这个setName不是静态为什么画图画在方法区啊?

方法区通常情况下,可以分为静态方法区,非静态方法区;

所以非静态方法是放在方法区中的非静态方法区
作者: pray    时间: 2014-4-26 03:45
让人奔走相告曰须阅读的好帖




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