黑马程序员技术交流社区

标题: 类加载的问题?? [打印本页]

作者: 高鑫    时间: 2012-7-30 11:06
标题: 类加载的问题??
本帖最后由 高鑫 于 2012-7-30 12:24 编辑
  1. class Demo {
  2.         public static void main(String args[]){
  3.     String s=Person.name;
  4.         }
  5. }
  6. class Person{
  7.         static String name="lisi";
  8.         int age=10;
  9.         public void show(){
  10.                 System.out.println(s);
  11.         }
  12. }
复制代码
程序中String s=Person.s;这句执行的时候,要先加载Person类, static 修饰的name直接加载到方法区,请问那非静态的show会加载到方法区吗?因为没有创建对象,age应该不会加载到堆内存的吧?写的时候把name写成s了,已经更正
作者: 周坤    时间: 2012-7-30 11:20
加载,是将类文件中的一行行内容存放到了内存当中,并不会执行任何语句。加载时期,即使有输出语句也不会执行。那么就会加载静态成员变量(类变量),在方法区的静态部分静态方法,方法区的非静态部分非静态方法(包括构造函数)。

所以非静态的show会加载到了方法区,至于age作为类的成员变量,没有new出对象,不会加载。
作者: 罗磊    时间: 2012-7-30 11:31
实在看不懂!这程序在我理解范围内!我觉得编译会错误!
作者: 李东升    时间: 2012-7-30 11:59
我也觉得你的代码会报编译错误。。
静态方法,静态属性在运行jvm的时候就已经加载上了,所以那些静态属性,静态方法可以直接通过类名点出来,而不是通过实例点。所以你的代码中,age和show方法必须通过实例才能调用。
作者: 陈汉维    时间: 2012-7-30 12:14
本帖最后由 陈汉维 于 2012-7-30 12:19 编辑
  1. class Demo {
  2.         public static void main(String args[]){
  3.     String s=Person.s;
  4.         }
  5. }
  6. class Person{
  7.         static String name="lisi";
  8.         int age=10;
  9.         public void show(){
  10.                 System.out.println(s);
  11.         }
  12. }
复制代码
什么叫String s = Person.s;
Person里面哪里来的s?
Person类中的age是成员变量,存在于堆内存中。
先加载Person类, static修饰的name直接加载到方法区。
而show方法加载到栈内存里,show输出后,show就出栈了。




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