我刚查资料了的,构造器其实就是static的
java编程思想上说
Even though it doesn’t explicitly use the static keyword, the constructor is actually a static method. So the first time an object of type Dog is created, or the first time a static method or static field of class Dog is accessed, the Java interpreter must
locate Dog.class, which it does by searching through the classpath. 那这个问题就变成了:为什么我们能在static的构造方法里调用非static的字段和方法?
java编程思想上说
Even though it doesn’t explicitly use the static keyword, the constructor is actually a static method. So the first time an object of type Dog is created, or the first time a static method or static field of class Dog is accessed, the Java interpreter must
locate Dog.class, which it does by searching through the classpath. 那这个问题就变成了:为什么我们能在static的构造方法里调用非static的字段和方法?
看你怎么理解这里所说的static
如果是从导致类加载的角度来看,那么算static的,因为访问类的static方法或static属性,或者调用构造函数会导致类被加载。
如果从static的访问限制来看,那么不是static,构造函数会把this指针压栈,也就是说需要this对象,所以不是static,因为static和对象无关,只和类有关。
1.如果你是在类被加载的时候看待,那么它是static的。因为在JVM加载类时首先会初始化static属性为默认值,在这里构造器会被调用。
2.如果你是在创建对象的时候看待,那么它不是static的,构造器在里就如对象引用调用成员方法一样。类名后的这个括号“()”就表示调用构造器。通过楼上的指点,个人理解。。
static只是用来描述普通的方法是否静态
构造函数比较特殊,并不能说他是static的从访问方式来说
构造函数在没有对象的情况下,可以被new关键字执行,构造代码有静态的方面
从调用方面来说
构造函数并不是静态的,因为它并不是在进程初始化时加载的,这和static函数是根本区别
每个构造函数依然是依赖于它所处的对象的
从java源代码的角度来看这个问题,构造函数即不是静态方法也不是动态方法,他属于自己的函数体系——构造函数,从这个方面来看它肯定不是什么static方法。
从虚拟机运行角度来看,方法都存在于方法区,并且都属于类,无论动态还是静态,那么这样来说,jvm并不区分什么静态方法或者动态方法,总体来说,方法在虚拟机域存在一个,但是作为源码的动态和静态的区别在运行时有一个重要的区别,就是所有动态方法都包含一个隐式参数,就是this(指代当前对象),而静态方法没有这个参数;而构造函数是有this这个参数的,在虚拟机内构造函数的名称为"<init>"。隐藏可以断定构造函数根本就不是静态函数,而且就构造函数本身而言,可以使用jni或者sun 的一些内部不安全包,像调用普通的动态方法一样去调用构造函数。如果把构造函数视为普通动态函数其实比视为静态函数更合理一些。
我想think in java吧构造函数视为静态函数,可能是调用静态函数的指令与构造函数一直,因此才说应该把构造函数视为静态函数,但是这样也是不正确的,因为调用私有动态函数与静态函数的调用指令也是一样的,这并不能说明私有函数是静态的。