如果我們定義一個與類名相同的函數就是構造函數,我們可以在一個類中定義多個構造函數,但是這些構造函數的列表參數必須不同(個數或者數據類型)。如果我們沒有定義一個構造函數,系統就會給這個類定義一個默認的構造函數,這個構造函數沒有參數。如果我們定義了構造函數那么系統定義的構造函數就會被覆蓋。下面用程序來說明。
程序1:
class YuanGong{
private int id;
private String name;
private float salary;
private String depart;
public void say(){
System.out.println("員工號:"+'\t'+id);
System.out.println(" 姓名:"+'\t'+name);
System.out.println(" 薪水:"+'\t'+salary);
System.out.println(" 部門:"+'\t'+depart);
}
public void setId(int id){
this.id=id;
}
public int getId(){
return id;
}
public void setName(String name){
this.name=name;
}
public String getName(){
return name;
}
public void setSalary(float salary){
this.salary=salary;
}
public float getSalary(){
return salary;
}
public void setDepart(String depart){
this.depart=depart;
}
public String getDepart(){
return depart;
}
}
public class Test1{
public static void main(String args[]){
YuanGong p=new YuanGong();
p.say();
p.setId(50);
p.setName("哈哈");
p.setSalary(2000);
p.setDepart("商務");
p.say();
}
}
上面程序的輸出結果如下圖所示:

我們看到在程序并沒有定義構造函數YuanGong(),這是系統定義的,而且還沒有參數。
程序2:
class YuanGong{
private int id;
private String name;
private float salary;
private String depart;
YuanGong(int id){
this.setId(id);
this.setName("未確定");
this.setSalary(1000);
this.setDepart("后勤");
}
YuanGong(int id,String name){
this.setId(id);
this.setName(name);
this.setSalary(3000);
this.setDepart("技術");
}
YuanGong(int id,String name,float salary,String depart){
this.setId(id);
this.setName(name);
this.setSalary(salary);
this.setDepart(depart);
}
YuanGong(){
}
public void say(){
System.out.println("員工號:"+'\t'+id);
System.out.println(" 姓名:"+'\t'+name);
System.out.println(" 薪水:"+'\t'+salary);
System.out.println(" 部門:"+'\t'+depart);
}
public void setId(int id){
this.id=id;
}
public int getId(){
return id;
}
public void setName(String name){
this.name=name;
}
public String getName(){
return name;
}
public void setSalary(float salary){
this.salary=salary;
}
public float getSalary(){
return salary;
}
public void setDepart(String depart){
this.depart=depart;
}
public String getDepart(){
return depart;
}
}
public class Test2{
public static void main(String args[]){
YuanGong p1=null;
YuanGong p2=null;
p1=new YuanGong(10);
p2=new YuanGong(20,"張三");
p1.say();
p2.say();
p1=new YuanGong(30,"李四",5000,"財政");
p2=new YuanGong();
p1.say();
p2.say();
}
}
此程序的輸出結果如下圖所示:

在此程序中我們定義了四個構造函數,分別是單參、雙參、四參和沒有參數。我們可以看到最后沒有參數的構造函數的結果和程序1初始化的結果一樣。
看程序3:
class YuanGong{
private int id;
private String name;
private float salary;
private String depart;
YuanGong(int id){
this.setId(id);
this.setName("未確定");
this.setSalary(1000);
this.setDepart("后勤");
}
YuanGong(int id,String name){
this.setId(id);
this.setName(name);
this.setSalary(3000);
this.setDepart("技術");
}
YuanGong(int id,String name,float salary,String depart){
this.setId(id);
this.setName(name);
this.setSalary(salary);
this.setDepart(depart);
}
public void say(){
System.out.println("員工號:"+'\t'+id);
System.out.println(" 姓名:"+'\t'+name);
System.out.println(" 薪水:"+'\t'+salary);
System.out.println(" 部門:"+'\t'+depart);
}
public void setId(int id){
this.id=id;
}
public int getId(){
return id;
}
public void setName(String name){
this.name=name;
}
public String getName(){
return name;
}
public void setSalary(float salary){
this.salary=salary;
}
public float getSalary(){
return salary;
}
public void setDepart(String depart){
this.depart=depart;
}
public String getDepart(){
return depart;
}
}
public class Test3{
public static void main(String args[]){
YuanGong p1=null;
YuanGong p2=null;
p1=new YuanGong(10);
p2=new YuanGong(20,"張三");
p1.say();
p2.say();
p1=new YuanGong(30,"李四",5000,"財政");
p2=new YuanGong();
p1.say();
p2.say();
}
}
這個程序編譯的時候就會出現如下圖所示的錯誤:

程序3與程序2的區別就是少了一個無參的構造函數,這樣做就驗證了“如果類中定義了新的構造函數就會覆蓋系統定義的構造函數”。程序2同樣也覆蓋了系統定義的構造函數只不過我們又新建了一個無參的構造函數,這就造成了程序2中無參函數的輸出結果與程序1初始化的輸出結果相同。