Java構造方法定義:
一、在類中,構造方法是一個特殊的方法,當程序用某個類創建對象時,需要使用這個類中的構造方法進行創建;
如下演示: 通過 Structure_Method_Test() 構造方法 創建(實例化)了 類 Structure_Method_Test 的一個對象 smtest
public class Structure_Method_Test {
Structure_Method_Test(){} //構造方法創建
public static void main(String[] args) {
Structure_Method_Test smtest = new Structure_Method_Test(); //對象創建
}
}
簡單的說:構造方法 就是配合 new運算符 實例化一個該類的對象;
二、類中的構造方法的名字必須與類名相同,而且方法是沒有類型的;
如下演示: void Structure_Method_Test(){} //不是構造方法,是類型爲void的方法
public class Structure_Method_Test {
Structure_Method_Test(){} //構造方法創建
void Structure_Method_Test(){} //該方法不是構造方法,是類型爲void的方法
public static void main(String[] args) {
Structure_Method_Test smtest = new Structure_Method_Test(); //對象創建
}
}
三、在一個類中可以同時聲明多個構造方法,但是這些構造方法的參數必須是不同的;
(參數不同指:參數的個數不同,名字不同、或 參數個數相同,參數列表中某個個數的類型不同 )
如下演示:
public class Structure_Method_Test {
Structure_Method_Test(int a){} //構造方法1
Structure_Method_Test(int a,int b){} //構造方法2
Structure_Method_Test(double a,int b){} //構造方法3
public static void main(String[] args) {
Structure_Method_Test smtest = new Structure_Method_Test(3,5);
}
}
在以上代碼中,構造方法1 與 構造方法2 的參數個數不同 ;構造方法2 與 構造方法3 個數相同,但是參數列表中 a 的類型不同;
構造方法特別注意:
一、當程序中某個類沒有聲明構造方法,那麼系統會默認該類只有一個構造方法,並且這個構造方法是沒有參數和方法體的,是由系統默認創建的;
如下演示:
class Default_Test{
Default_Test(){}
}
二、當程序中某個類聲明瞭 多個構造方法,那麼系統就不會再爲該類創建默認的構造方法了;
如下演示: Structure_Method_Test smtestone = new Structure_Method_Test(); 是錯誤的
public class Structure_Method_Test {
Structure_Method_Test(int a){} //構造方法1
Structure_Method_Test(int a,int b){} //構造方法2
public static void main(String[] args) {
//報錯,此時是沒有默認的構造方法的,所以 () 中的參數必須要和構造方法中參數對應;
Structure_Method_Test smtestone = new Structure_Method_Test();
//如下創建的構造方法是正確的
Structure_Method_Test smtest; //對象的聲明
smtest = new Structure_Method_Test(1); //爲聲明的對象進行分配變量,使用構造方法2
//聲明對象的同時 爲 聲明的對象進行分配變量,使用構造方法3
Structure_Method_Test smtestone = new Structure_Method_Test(11,111);
}
}
Java構造方法實例化對象過程:
創建一個對象包括 對象的聲明 和 爲對象分配變量 兩個部分;
一、對象的聲明
一般格式爲: 類名 對象名 ;
如: Default_Test testone ; 或者 Default_Test test1 , test2 , test3 ;
二、爲對象分配變量,完成對象的實例化
使用 new 運算符和類的構造方法爲聲明的變量分配變量,即完成對象的實例化;
如下演示:
public class Structure_Method_Test {
Structure_Method_Test(){} //構造方法1
Structure_Method_Test(int a,int b){} //構造方法2
public static void main(String[] args) {
Structure_Method_Test smtest; //對象的聲明
smtest = new Structure_Method_Test(); //爲聲明的對象進行分配變量,使用構造方法1
//聲明對象的同時 爲 聲明的對象進行分配變量,使用構造方法2
Structure_Method_Test smtestone = new Structure_Method_Test(3,5);
}
}
對象的使用:
一、對象不僅可以操作自己的變量改變狀態,還可以調用類中的方法產生一定的功能;
二、對象通過使用運算符 " . " ,可以實現對自己 變量的訪問 和 方法的調用;(前提是對象創建之後,而不是僅僅聲明)
訪問格式爲: 對象 . 變量名 ; 對象 . 方法名(" ") ;
三、對象體現的封裝性,即當對象調用方法時,方法中出現的成員變量就是指分配給該對象的變量;
如下演示:
public class Method_Test {
double sum,number;
String speak,action ;
void behaviour (String st){
action = st;
sum = 1 + 10 ;
System.out.println(action+" " + sum);
}
public static void main(String[] args) {
Method_Test test1 = new Method_Test(); //創建對象test1
Method_Test test2 = new Method_Test(); //創建對象test2
test1.number = 123456 ;
test2.number = 789 ;
System.out.println("test1的number值="+test1.number);
System.out.println("test2的number值="+test1.number);
test1.speak = "這個speak是屬於對象test1的";
test1.speak = "這個speak是屬於對象test2的";
System.out.println("test1的speak值="+test1.speak);
System.out.println("test2的speak值="+test1.speak);
test1.behaviour("我想唱歌");
test2.behaviour("我想跳舞");
}
}
程序輸出:
test1的number值=123456.0
test2的number值=123456.0
test1的speak值=這個speak是屬於對象test2的
test2的speak值=這個speak是屬於對象test2的
我想唱歌 11.0
我想跳舞 11.0
在以上代碼的 behaviour 方法,可以進行操作成員變量 action 與 sum ,當創建的對象 test1,test2 調用該方法時,方法中出現的成員變量分別是 test1,test2 對象的成員變量;
對象的引用和實體:
對象的引用:
指在創建對象時,new 運算符 只能和 類的構造方法進行運算,運算的結果是一個十六進制數,這是數就說明對象的引用;
如:new Method_Test(); 的值就是一個 引用 ;
對象的實體:
指在Java中,對象負責存放引用的,以確保對象可以操作分配給該對象的變量以及調用類中的方法,其中分配給該對象的變量也是平時所說的對象的實體;
一、沒有實體的對象稱爲空對象,空對象是不能進行使用的,即不能調用方法產生行爲;
如下演示:
public class Method_Test {
double sum,number;
String speak,action ;
void behaviour (String st){
action = st;
sum = 1 + 10 ;
System.out.println(action+" " + sum);
}
public static void main(String[] args) {
Method_Test test1 = new Method_Test(); //創建對象test1
Method_Test test2 ; //聲明對象test2,此時對象爲空對象
test1.number = 123456 ;
test2.number = 789 ; //錯誤,此時對象爲空對象
System.out.println("test1的number值="+test1.number);
test1.behaviour("我想唱歌");
test2.behaviour("我想跳舞"); //錯誤,此時對象爲空對象
}
}
以上代碼中,test2.number 與 test2.behaviour("我想跳舞"); 都是錯誤的,因爲 test2 只是進行了聲明,還未創建;
二、若一個類聲明的兩個對象具有相同的引用,那麼二者具有的實體也是一樣的;
如下演示:
public class Method_Test {
double sum,number;
String speak,action ;
void behaviour (String st){
action = st;
sum = 1 + 10 ;
System.out.println(action+" " + sum);
}
public static void main(String[] args) {
Method_Test test1 = new Method_Test(); //創建對象test1
Method_Test test2 = new Method_Test(); //聲明對象test2
System.out.println("test1的引用值="+test1);
System.out.println("test2的引用值="+test2);
test1 = test2 ;
System.out.println("test1的引用值="+test1);
System.out.println("test2的引用值="+test2);
}
}
代碼輸出結果:
test1的引用值=Chapter_Four.Method_Test@7852e922
test2的引用值=Chapter_Four.Method_Test@4e25154f
test1的引用值=Chapter_Four.Method_Test@4e25154f
test2的引用值=Chapter_Four.Method_Test@4e25154f
三、Java中 “垃圾回收機制”
垃圾回收機制指系統程序會週期性的檢測某個實體是否已不再被任何對象所擁有,如果發現這樣的實體,則系統會自動釋放實體佔有的內存;
如下演示:
public class Method_Test {
Method_Test(){}
Method_Test(int x,int y){}
public static void main(String[] args) {
Method_Test test1 = new Method_Test(); //創建對象test1
Method_Test test2 = new Method_Test(1,11);; //創建對象test2
System.out.println("test1的引用值="+test1);
System.out.println("test2的引用值="+test2);
test1 = test2 ;
System.out.println("test1的引用值="+test1);
System.out.println("test2的引用值="+test2);
}
}
在以上代碼中,執行 test1 = test2 ; 語句後,test1 的 引用就會與 test2 引用一樣,而之前創建時 test1 引用中的實體將被系統進行回收;