首页 > 代码库 > 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**==**