如题,我看到这句话,表示不能理解
我们新建一个对象是不是调用构造方法呢?
Test t=new Test();
那为什么说构造方法不能由编程人员调用,而要系统调用?

解决方案 »

  1.   

    new Test()
    并不是单单执行了一个构造方法它包括:
    实例变量内存分配
    构造方法调用
    如果类没加载,还存在类装载、连接、初始化--------------
    你无法这样调用:
    Test t = new Test()
    t.Test();//error 调用构造方法
      

  2.   

    再论构造函数有没有返回值??    在这个帖子里有人归纳的构造方法的特点http://topic.csdn.net/u/20080901/22/f44c4818-9a39-46c2-8a24-0e6dce9dc800.html
      

  3.   

    好像有点懂了,所以new这个操作,并不是调用构造方法的意思。new这个语法是告诉编译器我需要一个对象,具体怎么做则由jvm负责,我这么理解对不对?
      

  4.   

    再论构造函数有没有返回值?? 在这个帖子里有人归纳的构造方法的特点http://topic.csdn.net/u/20080901/22/f44c4818-9a39-46c2-8a24-0e6dce9dc800.html
    构造方法你可以说有返回值,也可以说没有,定义构造方法的时候是 public 类名(){} 这样看是没有返回值的,但是从根本上来说,有返回值,返回的是对象本身。
      

  5.   

    这个问题那篇帖子已经讨论炸了,不过书上在介绍构造方法时都说是没有返回值的。这就好像那个问题一样:java中有没有指针
    呵呵
      

  6.   


    首先说明下JAVA中处处都有指针。只是我们不接触罢了。
    说没有指针都是初学者。还有就是程序员不能new那个类是因为有的类是java虚拟机启动时候由java虚拟机来创建的
    比如:public final
        class Class<T> implements java.io.Serializable, 
          java.lang.reflect.GenericDeclaration, 
          java.lang.reflect.Type,
                                  java.lang.reflect.AnnotatedElement {
        private static final int ANNOTATION= 0x00002000;
        private static final int ENUM      = 0x00004000;
        private static final int SYNTHETIC = 0x00001000;    private static native void registerNatives();
        static {
            registerNatives();
        }    /*
         * Constructor. Only the Java Virtual Machine creates Class
         * objects.
         */
        private Class() {}这个Class是java虚拟机在加载一个类的时候在堆中创建的,这时候JVM会创建一个.class对应的Class对象
    里面封装了该类在方法区的数据结构。并且给程序员提供访问方法区数据结构的接口。楼主可以看看源代码。还有下面就是解释下楼主以及那个帖子的:
    String str = new String("test");
    这时候是把该String对象的内存地址用String类型来接受
    不是返回值。