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...............