黑马程序员技术交流社区
标题:
静态求解
[打印本页]
作者:
陈苓
时间:
2012-4-7 00:44
标题:
静态求解
问题是这样的,不是说静态的成员函数和成员变量加载在方法区吗?为什么图上这个setName不是静态为什么画图画在方法区啊?
该贴已经同步到
格式化的微博
~43_QWS@S26U@2@3}9V4(3B.jpg
(110.77 KB, 下载次数: 52)
下载附件
2012-4-7 00:42 上传
作者:
李晓旭
时间:
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