java學習中,匿名函數、構造方法、構造代碼塊、構造方法中調用構造方法(java 學習中的小記錄)
作者:王可利(Star·星星)
匿名函數
匿名對象:沒有名字的對象
匿名對象使用的注意點:
1.一般不會用匿名對象給屬性賦值,無法獲取屬性值,每次new 都是一個新的對象。
2.匿名對象永遠都不可能是一個對象。
如:person new().name = “星星”;是不行的
匿名對象的好處:書寫簡單。
匿名對象使用的場景:
1.如果一個對象調用一個方法一次的時候,就可以用匿名對象來調用.
2.可以作為實際參數在方法中調用
構造方法
Object-C 中自定義初始化方法:創建對象的時候 init 就調用這些方法;
1.可以在對象創建的時候初始化屬性值。
2.創建對象的時候 只調用了一次方法。
java 中 ,這個方法叫構造方法
構造方法的作用:給對象進行初始化,對象創建時初始化屬性值。
創建構造方法:
1.構造方法沒有返回類型,方法名和類名保持一致。
2.構造方法不是我們手動調用的,是對象被創建的時候jvm(java虛擬機)調用的。
3.如果一個類我們沒有給它定義構造方法,jvm(java虛擬機)在編譯的時候 會給這個類默認添加一個無參構造方法。
4.如果自己定義了構造方法,那麼jvm不會再創建無參構造方法。
5.創建對象的時候,有幾個參數,就要有相應的構造方法,也是對應的要有幾個參數。
格式:
1.修飾符 類名(參數列表){}
2.直接類名 (參數列表){}
代碼如下
1 class Person{ 2 //公有屬性 3 String name; 4 int age; 5 6 //創建一個構造方法(有兩個參數) 7 public Person(String n,int a){ 8 name = n; 9 age = a; 10 } 11 //無參構造方法 12 public Person(){ 13 14 } 15 16 //行為 17 public void study(){ 18 System.out.println(age+"歲的"+name+"正在學習"); 19 } 20 } 21 public class Star_gzff { 22 23 public static void main(String[] args) { 24 //創建一個Person對象 25 Person p = new Person("星星",12);//這裡傳的是兩個參數的那個構造方法 26 //調用普通的方法-工作 27 p.study(); 28 29 //沒有無參構造方法這裡會出錯 30 Person p1 = new Person();//這裡傳的是無參數的構造方法 31 p1.name = "小明"; 32 p1.study(); 33 } 34 }
方法重載
java中,方法是可以重名的,我們把這種重名的方法叫 方法的重載。
使用方法重載注意的地方:
1.方法名一樣才叫方法重載。
2.任何方法(普通方法,構造方法)都可以實現方法重載。
3.參數列表要保證順序 或者 個數是不一樣的。
如 :Person (String a , int b);
Person ( int b, String a);//順序不一樣
Person (String a , int b,String c);//個數不一樣
構造代碼塊
代碼塊分為三類:
1.構造代碼塊
2.局部代碼塊:寫在方法中,也是以大括號來表示
3.靜態代碼塊
在上面的構造方法中,構造方法是可以調用普通方法的,在創建對象的同時就使用這個普通方法,不需要後期對象再調用方法。
如:
public Person(String n,int a){
name = n;
age = a;
study();//調用普通的方法
}
如果我們有很多的這樣的構造方法(無參的,一個參數的,兩個參數的...),每一個都要調用這個方法,代碼就會顯得復雜麻煩,於是就有了構造代碼塊。
代碼塊作用:給對象統一初始化。(對象創建之前都會走這個方法)
構造代碼塊的格式:{} 就一個大括號。。
代碼分析:
1 class Person{ 2 //公共屬性 3 String name; 4 5 //構造代碼塊 6 { 7 age = 18; 8 } 9 //創建一個構造方法 10 public Person(String n,int a){ 11 name = n; 12 age = a; 13 } 14 15 int age = 20; 16 17 public void study(){ 18 19 System.out.println(age+"歲的"+name+"在學習"); 20 } 21 } 22 23 public class Star_gzdmk { 24 25 public static void main(String[] args) { 26 27 Person p = new Person("星星",12); 28 p.study(); 29 } 30 }
構造代碼塊使用注意點總結:
1.構造代碼塊必須寫在成員變量(屬性)的位置。
2.對象創建之前都會走這個方法。
3.java中編譯器編譯java源文件的時候,會把成員變量的聲明放到最前面。
4.成員變量的初始化都是在構造方法中執行的,一旦經過java編譯器編譯,構造代碼塊的方法會移到構造函數中執行,放在構造函數的最前面執行。
5.如果沒有構造方法,只有成員變量初始化和構造代碼塊,按照當前代碼的順序來執行。
在普通方法裡面,如果添加一個局部變量,名字和屬性的名字一樣的話:
System.out.println(name),這裡的那麼就是 局部變量的 name。
如果用了this關鍵字的話,System.out.println(this.name);就是構造方法裡面的name。
在構造方法裡面,傳入的參數名字和屬性的名字一樣的話:如:name = name;//拿到的兩個name都是局部變量
這時要寫 this.name = name;//拿到的第一個name才是屬性
this關鍵字:
1.代表所屬方法的調用對象,和oc中的 self 相似。
2.如果成員變量和局部變量重名,在方法中的默認調用局部變量(就近原則),通過this可以讓方法的調用成員變量。
3.如果方法中不存在與成員變量重名的局部變量,java編譯器就會默認給變量前面加一個this。
構造方法中調用構造方法
構造方法是可以調用普通方法(實例方法)。
構造方法中也是可以調用構造方法的。
問題代碼如下:
class Student{ //公有屬性 String id; String name; String classNum; String sex; int age; //創建構造方法 public Student(String id,String name,String classNum,String sex,int age){ this.name = name; this.id =id; this.classNum = classNum; this.sex = sex; this.age = age; } //重載構造方法,只寫四個參數的 public Student(String id,String name,String classNum,String sex){ this.name = name; this.id =id; this.classNum = classNum; this.sex = sex; } //重載構造方法,只寫三個參數的 public Student(String id,String name,String classNum){ this.name = name; this.id =id; this.classNum = classNum; } //普通方法 public void Student(){ } }
這樣子寫代碼的話就會顯得代碼很復雜,我們在這個時候就可以嘗試使用構造方法之間的調用。
比方說:4個參數的構造方法包含了3個參數的構造方法,我只需要在四個參數的構造方法裡面調用3個參數的構造方法,在從中添加一個自己與三個參數不同的一個參數就可以簡化代碼了。
解決第一步的代碼如下:
class Student{ //公有屬性 String id; String name; String classNum; String sex; int age; //創建構造方法 public Student(String id,String name,String classNum,String sex,int age){ Student(id,name,classNum,sex);//四個參數 this.age = age; } //重載構造方法,只寫四個參數的 public Student(String id,String name,String classNum,String sex){ Student(id,name,classNum);//三個參數 this.sex = sex; } //重載構造方法,只寫三個參數的 public Student(String id,String name,String classNum){ this.name = name; this.id =id; this.classNum = classNum; } //普通方法 public void Student(){ } }
但是如果你這樣子調用的話會出現一個問題,你調用的不是構造方法,而是普通方法。
總結:直接使用方法名來調用方法,調用的是普通方法,不會是構造方法。
最後的解決方法,代碼如下:
class Student{ //公有屬性 String id; String name; String classNum; String sex; int age; //創建構造方法 public Student(String id,String name,String classNum,String sex,int age){ this(id,name,classNum,sex); this.age = age; } //重載構造方法,只寫四個參數的 public Student(String id,String name,String classNum,String sex){ this(id,name,classNum); this.sex = sex; } //重載構造方法,只寫三個參數的 public Student(String id,String name,String classNum){ this.name = name; this.id =id; this.classNum = classNum; } //普通方法 public void Student(){ } }
構造方法調用的總結:
1.直接使用方法名來調用方法 調用的是普通的方法,不會將這個方法作為構造方法。
如:Student(name,id,classNum,sex);
2.如果在方法名前面添加this ,也是錯誤的。
如:this,Student(name,id,classNum,sex);
3.正確的調用方法應該是直接一個this()來調用構造方法。而且要是第一個語句,否則會報錯。
如:this(name,id,classNum,sex);
this.id = id;
4.不要在兩個構造方法之間相互調用構造方法。會導致死循環。
如:this(name,id,classNum,10);//傳了一個常量