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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 高鑫 中级黑马   /  2012-7-30 11:06  /  1535 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 高鑫 于 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了,已经更正

4 个回复

正序浏览
本帖最后由 陈汉维 于 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就出栈了。
回复 使用道具 举报
我也觉得你的代码会报编译错误。。
静态方法,静态属性在运行jvm的时候就已经加载上了,所以那些静态属性,静态方法可以直接通过类名点出来,而不是通过实例点。所以你的代码中,age和show方法必须通过实例才能调用。
回复 使用道具 举报
实在看不懂!这程序在我理解范围内!我觉得编译会错误!
回复 使用道具 举报
加载,是将类文件中的一行行内容存放到了内存当中,并不会执行任何语句。加载时期,即使有输出语句也不会执行。那么就会加载静态成员变量(类变量),在方法区的静态部分静态方法,方法区的非静态部分非静态方法(包括构造函数)。

所以非静态的show会加载到了方法区,至于age作为类的成员变量,没有new出对象,不会加载。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马