JAVA建構函式(方法)--部落格園
一、什麼是建構函式
java建構函式,也叫構造方法,是java中一種特殊的函式。函式名與相同,無返回值。
作用:一般用來初始化成員屬性和成員方法的,即new物件產生後,就呼叫了物件了屬性和方法。
在現實生活中,很多事物一出現,就天生具有某些屬性和行為。比如人一出生,就有年齡、身高、體重、就會哭;汽車一出產,就有顏色、有外觀、可以執行等。這些,我們就可以將這些天然的屬性和行為定義在建構函式中,當new例項化物件時,也就具有這些屬性和方法了,沒必要再去重新定義了,從而加快了程式設計效率。
建構函式是物件一建立就執行,給物件初始化,就包括屬性,執行方法中的語句。
而一般函式是物件呼叫才執行,用".方法名“的方式,給物件新增功能。
一個物件建立,建構函式只執行一次。
而一般函式可以被該物件呼叫多次。
二、建構函式的特點
1、函式名與類名相同
2、不用定義返回值型別。(不同於void型別返回值,void是沒有具體返回值型別;建構函式是連型別都沒有)
3、不可以寫return語句。(返回值型別都沒有,也就不需要return語句了)
注:一般函式不能呼叫建構函式,只有建構函式才能呼叫建構函式。
三、示例
1、無參建構函式中只定義了一個方法。new物件時,就呼叫與之對應的建構函式
package javastudy; public class ConfunDemo { public static void main(String[] args) { Confun c1=new Confun(); //輸出Hello World。new物件一建立,就會呼叫對應的建構函式Confun(),並執行其中的println語句。 } } class Confun{ Confun(){ //定義建構函式,輸出Hello World System.out.println("Hellow World"); } }
輸出:Hellow World
2、有參建構函式,在new物件時,將實參值傳給private變數,相當於完成setter功能。
package javastudy; public class ConfunDemo3 { public static void main(String[] args){ Person z=new Person("zhangsan",3); //例項化物件時,new Person()裡直接呼叫Person建構函式並轉轉實參,相當於setter功能 z.show(); } } class Person{ private String name; private int age; public Person(String n,int m){ //有引數建構函式,實現給private成員變數傳引數值的功能 name=n; age=m; } //getter //例項化物件時,完成了sett功能後,需要getter,獲取實參值。 public String getName(){ return name; } public int getAget(){ return age; } public void show(){ //獲取private值後,並列印輸出 System.out.println(name+"\n"+age); } }
輸出:
zhangsan
3
以上程式碼,我們也可以將show()方法中的輸出語句直接放在建構函式中,new物件時,即可直接輸出值,如下
package javastudy; public class ConfunDemo3 { public static void main(String[] args){ Person z=new Person("zhangsan",3); //例項化物件時,new Person()裡直接呼叫Person建構函式並轉轉實參,同時執行輸出語句 } } class Person{ private String name; private int age; public Person(String n,int m){ //有引數建構函式,實現給private成員變數傳引數值的功能,同時直接輸出值 name=n; age=m; System.out.println(name+"\n"+age); } }
輸出:
zhangsan
3
或
class ConFun { public static void main(String[] args){ Person z=new Person(20,"zhangsan"); System.out.println(z.getAge()+z.getName()); } } class Person { private int age; private String name; public Person(int x,String y){ age=x; name=y; } public int getAge(){ return age; } public String getName(){ return name; } }
3、一個物件建立後,建構函式只執行一次。
如果想給物件的值再賦新的值,就要使用set和get方法,此時是當做一般函式使用
如下:
package javastudy; public class ConfunDemo4 { public static void main(String[] args) { PersonDemo s=new PersonDemo("李三",33); //new物件時,即呼叫對應的建構函式,並傳值。同時,不能new同一個物件多次,否則會報錯。 s.setName("李五"); //物件建立後,想變更值時,就要用set/get方法,重新設定新的值 s.setName("阿爾法狗"); //並可呼叫物件多次。 s.print(); } } class PersonDemo{ private String name; private int age; PersonDemo(String n,int m){ //建立有參建構函式,用於給兩個private變數name、age賦值,同時輸出值 name=n; age=m; System.out.println("姓名:"+name+"年齡:"+age); } public void setName(String x){ //set方法,用於再次給name賦值 name=x; } public String getName(){ //get方法,用於獲取name的賦值 return name; } public void print(){ System.out.println(name); } }
輸出結果:
姓名:李三年齡:33
阿爾法狗
四、預設建構函式
當一個類中沒有定義建構函式時,系統會給該類中加一個預設的空引數的建構函式,方便該類初始化。只是該空建構函式是隱藏不見的。
如下,Person(){}這個預設建構函式是隱藏不顯示的。
class Person { //Person(){} }
當在該類中自定義了建構函式,預設構造函式就沒有了。
如果仍要構造函式,則需要自己在類中手動新增。
五、建構函式的過載
建構函式也是函式的一種,同樣具備函式的過載(Overloding)特性。
class Person { private String name; private int age; Person() { System.out.println("A:name="+name+":::age="+age); } Person(String n) { name = n; System.out.println("B:name="+name+":::age="+age); } Person(String n,int a) { name=n; age=a; System.out.println("C:name="+name+":::age="+age); } } class PersonDemo2 { public static void main(String[] args) { Person p1=new Person(); Person p2=new Person("lishi"); Person p3=new Person("lishi",10); } }
輸出結果:
A:name=null:::age=0
B:name=lishi:::age=0
C:name=lishi:::age=10
class Person { private String name; private int age; Person() { System.out.println("A:name="+name+":::age="+age); cry(); } Person(String n) { name = n; System.out.println("B:name="+name+":::age="+age); cry(); } Person(String n,int a) { name=n; age=a; System.out.println("C:name="+name+":::age="+age); cry(); } void cry() { System.out.println("Cry..............."); } } class PersonDemo2 { public static void main(String[] args) { Person p1=new Person(); Person p2=new Person("lishi"); Person p3=new Person("lishi",10); } }
輸出結果:
A:name=null:::age=0
Cry...............
B:name=lishi:::age=0
Cry...............
C:name=lishi:::age=10
Cry...............