一、构造器为何不能用void修饰?java
简单地说,这是java的语法规定。构造器不能定义返回值类型声明,也不能使用void定义构造器没有返回值。若是为构造器定义了返回值类型,或使用void定义构造器没有返回值,编译时不会报错,但java会把这个所谓的构造器当成方法来处理。程序员
// JDK 8
public class Constructor { public static void main(String[] args) { Constructor c = new Constructor(); System.out.println(c.Constructor()); } public Constructor() { System.out.println("this is constructor!"); } // This method has a constructor name
public int Constructor() { System.out.println("this is method!"); return 520; } // This method has a constructor name
public void Constructor() { System.out.println("this is method!"); return ; } }
输出:this
this is constructor!
this is method!
520
二、构造器有返回值吗?spa
实际上,类的构造器有返回值,返回的是该类的实例,所以类的构造器返回值类型是当前类,所以无需定义返回值类型。但注意:不能在构造器里显示使用return来返回当前类的对象,由于构造器的返回值是隐式的。只写return;不会报错。线程
// JDK 8
public class Constructor { public static void main(String[] args) { Constructor c = new Constructor(); } public Constructor() { System.out.println("this is constructor!"); return this; // Void methods cannot return a value // return; // 不会报错
} }
三、构造器是建立java对象的途径,是否是说构造器彻底负责建立java对象?设计
答:不是!构造器是建立java对象的重要途径,经过new关键字调用构造器时,构造器也确实返回了该类的对象,但这个对象并非彻底由构造器负责建立的。实际上,当程序员调用构造器时,系统会先为该对象分配内存空间,并为这个对象执行默认初始化,这个对象已经产生了——这些操做都在构造器执行以前就完成了。也就是说,当系统开始执行构造器的执行体以前,系统已经建立了一个对象,只是这个对象还不能被外部程序访问,只能在该构造器中经过this来引用它。当构造器的执行体结束后,这对象做为构造器的返回值返回,一般还会赋给另外一个引用类型的变量,从而让外部程序能够访问该对象。code
本身总结:之因此会存在系统提供的空构造器,是由于在执行构造器以前对象已经存在,可是不能直接返给程序,须要借助中间体拿到这个对象的地址,而这个中间体恰好就是构造器,因此空构造器只是完成最重要的事,就是拿到这个对象的地址。而非空构造器恰好能够给该对象初始化。对象
四、static、final、synchronized、native能否修饰构造器?blog
static不能修饰构造器:static方法只能访问static变量,类中所有变量设为static?继承
final不能修饰构造器:final方法能够继承但不能重写,构造器不能被继承。
synchronized不能修饰构造器:没有实际的须要把构造器定义成同步的,由于它将会在构造的时候锁住该对象,直到全部的构造器完成它们的工做,这个构造的过程对其它线程来讲,一般是不可访问的。
native不能修饰构造器:没有本地的构造器是任意一种语言的设计选择,这样会使得在建立对象的过程当中JVM实现很容易去校验父类的构造器是否老是被正确地调用了。
(本地化的方法状况特别复杂,因此JVM调用起来很是麻烦,须要考虑不少种状况,没有native关键字的状况下,JVM实现起来比较容易。)