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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杜佳瑞 中级黑马   /  2012-8-6 20:42  /  1589 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

我知道创建对象时首先将这个类加载到内存中,也知道程序分为编译时期和运行时期.
我的问题是 1,加载是在什么时期加载的呢?编译时期就加载了还是运行时再加载?
2,静态方法随着类的加载而加载,先于对象,下面程序当A类加载时,成员变量a和成员函数show也会加载,那么当程序运行时刻,A.show()调用时,a=new A()这个初始化什么时候执行呢?是方法一调用就执行吗?
class A
{
      static A a=new A();
      public static A show()
     {
      return a;
     }
}
class B
{
      public static void main(String[] args)
     {
         A a=A.show();
     }
}

评分

参与人数 1技术分 +1 收起 理由
杨志 + 1

查看全部评分

5 个回复

倒序浏览
方法调用后就执行。 你可以加断点 调试一下,就知道了
回复 使用道具 举报
1.首先,编译时和运行时是针对多态来说的,例如:
List list = new ArrayList();
其中,对象list的编译时类型是List,运行时类型是ArrayList。
2.类的加载指的是系统将class文件读入内存,并为之创建一个java.lang.Class对象。接着在类的初始化阶段,java虚拟机主要进行静态field的初始化。
3.当调用A类的静态方法时,系统会初始化A类,首先会初始化静态field,这时会创建A类的对象,然后执行方法show。
可以通过如下程序进行测试
  1. class A
  2. {
  3.       static A a=new A();
  4.       A(){
  5.               System.out.println("A constructor");
  6.       }
  7.       public static A show()
  8.      {
  9.       System.out.println("A show");
  10.       return a;
  11.      }
  12. }
  13. class B
  14. {
  15.       public static void main(String[] args)
  16.      {
  17.          A a=A.show();
  18.      }
  19. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
杨志 + 1

查看全部评分

回复 使用道具 举报
黑马王冬冬 发表于 2012-8-6 22:13
1.首先,编译时和运行时是针对多态来说的,例如:
List list = new ArrayList();
其中,对象list的编译时类 ...

非常感谢,我好像懂了,可是你能告诉我编译时期,虚拟机主要做了哪些工作吗
回复 使用道具 举报
在编译时期虚拟机会将java文件通过编码的形式将字符文件编码成计算机能够识别的字节码文件,
也就是class 文件。并将类中的代码都封装到了这个class 文件中,
而在运行的时候虚拟机会将该class文件加载进内存,然后才运行代码中的内容。
回复 使用道具 举报
谢谢,问题解决了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马