public class A{ 
  A a = null; 

这里为什么可以这样定义A a= null;都还没有A类型,内存中还有没A的数据结构吧 
这个问题问过几次,但每次都不是很理解,哪位大侠可以解释解释这段代码在编译器和执行期的内部过程到底是怎样的呢?

解决方案 »

  1.   

    没有A类型?你不是定义了类A吗,怎么没有A类型?把一个类的对象初始为null怎么了?
      

  2.   

    对于你的这段代码 编译期没做任何事情 因为没有静态变量或者静态块 A和a都是不存在的执行期间,初始化了A的实例a为null a这个对象存在于内存中 一直到gc回收
      

  3.   

    public class A
      A a = null; 

      

  4.   

    这只说明jvm在执行这段代码的时候是顺序执行的,内存中肯定已经有了A的数据结构,然后声明了个类型为A的变量a,并指向null。
    难道这就是传说中的“挥刀自宫”?
      

  5.   

    其实也好理解。编译期: 编译器中知道的Class A在读到 public class A {}的时候,就知道了A是一个class。 在检测到变量 A a = null;定义的时候,它就声明了一个引用,这个引用是A类型的就完了。运行期: 在JVM中,类到底是什么?它就是一段代码和数据的混合体,主体是代码段。那么,JVM中识别的Class A就是这个类A的代码段在内存中存放的起始位置,它是一个内存地址,仅此而已。然后,在生成Object的时候,JVM给分配一个A a这样的引用,这个引用的类型,就是刚才我们说的那个内存地址。希望能打消楼主的疑虑。有时候坐沙发的那位朋友说的对,别太钻牛角尖,的确挺伤神~~,^_^。
      

  6.   

    不用迷茫,再给你举一个有Java那年就有的问题,你可能更迷茫:
    java.lang.Object是所有类的根,按照您的思路,如果它还没编译通过,其他人当然不能编译通过,但问题是,编译它需要用到java.lang.String, java.lang.Class