public class test
{
    public static void main(String[] args)
    {
        test t1 = new test();
        test t2 = new test();
    }
}为何在定义test类里面可以创建test的对象了,那时test还没有定义完了?这是JAVA的一种什么机制了?

解决方案 »

  1.   

    在jvm环境下有个区域叫“持久代”,所有被用到的类都会被加载到这里(通过Classloader),当系统的任何地方要创建对应的类对象时,它会到“持久代”里找到对应的类体,并创建。不存在你说的“那时test还没有定义完了?”,是先有类体,再有调用。
      

  2.   

    既然你都能new Test()了,自然JVM已经加载了Test.class,也就不存在你说的test还没有定义完的事情。
      

  3.   

    每当编写一个java类的时候 在编译期间就会生成一个Class对象(就是同名的.class文件),所有的类在第一次运行的时候都会动态的加载到jvm虚拟机里面的被称为"类加载器"的子系统里面,然后类加载器查找这个Class文件是否存在,如果不存在,默认的类加载器就会根据类名去查找class文件,在这个类的字节码加载的时候进行验证,一旦加载完成  就创建这个对象。  所以说你刚才说的那个类在运行的时候,编译器已经加载好了你定义的这个类。main是静态方法 会被程序直接调用。
      

  4.   

    main是静态方法,不用创建类的实例,这个方法已经存在内存当中了!自然可以再里面创建类的实例了!
      

  5.   

    java通过编译器把源代码转化成字节码,然后把类加载到JVM上,加载到虚拟机上的这个代码,接下来就要实例化这个类,实例化的过程就是生成对象的过程。这是java 反射机制里面的内容
      

  6.   


    +1
    java是编译语言,所以运行前先会把代码编译成.class文件,然后再执行,所以执行的时候类肯定已经加载好了。
    所以不存在定义不完整的问题!  楼主的意思是不是面向过程的想法啊?
      

  7.   

    当你生成一个test类时,jvm会给你默认一个test()的构造方法, 执行这行语句时test t1 = new test();这个类会主动加载到jvm中,而你说的test还没有定义完,说明你还是把java语言看成了面向过程的编程语言,显然是不正确的