首页 > 代码库 > java 构造函数
java 构造函数
1、public className(){}。
2、名称与类名相同,无返回值,无返回类型,void也不行。(就是上边的形式,除了可以有参数)。
3、有0个或多个参数。
4、每个类都至少有一个constructor。如果没有显示的写,系统会默认构造一个方法体为空的空参构造函数。如果类有显示声明的构造函数(不一定是空参的,那么系统就不会默认构造一个空参constructor,进而若声明的函数正好不是空参的,那么该类就没有空参构造函数,而空参构造函数始终是一个类的默认构造函数)。
5、每个类可以有多个constructor,即重载,其参数不同。默认的constructor是空参构造函数。
6、constructor用于new一个新的对象。
7、继承:
1)子类继承父类,子类构造器中,如果要显示的调用父类构造器,必须在其第一行中写super(),eg:
public class Son{ public Son(<参数>){ super(<参数>); ... } }
2)子类继承父类,子类构造器中如果没有显示的调用父类构造器,那么我们在调用执行子类构造器时,系统会默认先调用父类默认构造器(空参构造器),即会在子类构造器的第一行默认加上super()。如果父类显示声明了带参构造器,而没有声明空参构造器,那么编译器就会报错了。 即不管怎样,都是要先执行父类的构造函数,以把父类的东西继承下来,然后才执行子类本身。 另外这个调用是从父层往下一层一层调用的,即先调用执行父父层的默认构造器,然后父层的默认构造器,然后子类构造器,依此类推。eg:
1 public class Grandfather { 2 3 public Grandfather(){ 4 System.out.println("This is Grandfather!"); 5 } 6 7 public Grandfather(String s){ 8 System.out.println("This is Grandfather"+s); 9 } 10 } 11 12 public class Father extends Grandfather { 13 14 public Father(){ 15 System.out.println("This is Father!"); 16 } 17 public Father(String s){ 18 System.out.println("This is Father!"+s); 19 } 20 } 21 22 public class Son extends Father { 23 24 public Son(){ 25 System.out.println("This is Son!"); 26 } 27 public Son(String s){ 28 System.out.println("This is Son"+s); 29 } 30 } 31 32 public class Construct { 33 34 /** 35 * @param args 36 */ 37 public static void main(String[] args) { 38 39 Son son = new Son(); 40 System.out.println("**********************************"); 41 Son son1 = new Son("**==**"); 42 43 } 44 }
执行结果:
This is Grandfather!
This is Father!
This is Son!
**********************************
This is Grandfather!
This is Father!
This is Son**==**
从控制台打印的结果可以看出,当执行子类时,都是去找它的父类的默认的构造函数,先执行父类的构造函数,再执行子类的本身。
针对以上情况,我们现在做个修改,改其中的一个类的代码如下:把Grandfather类显式写出的缺省构造函数注释掉:
1 public class Grandfather { 2 3 // public Grandfather(){ 4 // System.out.println("This is Grandfather!"); 5 // } 6 // 7 public Grandfather(String s){ 8 System.out.println("This is Grandfather"+s); 9 } 10 }
此时,Father类就会报错了。即子类没有显示调用的情况下,父类要么没有声明任何构造器,要么有一个显示声明的空参构造器。
上述若想不报错,也可以在Father类中显示声明对父类构造器的调用:
1 public class Father extends Grandfather { 2 3 public Father(){ 4 super("**ss**"); 5 System.out.println("This is Father!"); 6 } 7 public Father(String s){ 8 super(s); 9 System.out.println("This is Father!"+s); 10 } }
执行Construct.java
控制台输出为:
This is Grandfather**ss**
This is Father!
This is Son!
**********************************
This is Grandfather**ss**
This is Father!
This is Son**==**