匿名函數(shù)
Java Lambda 表達(dá)式(又名閉包(Closure)/匿名函數(shù))
構(gòu)造方法
構(gòu)造方法的作用:給對(duì)象進(jìn)行初始化财破,對(duì)象創(chuàng)建時(shí)初始化屬性值
創(chuàng)建構(gòu)造方法
- 構(gòu)造方法沒(méi)有返回類(lèi)型掰派,方法名和類(lèi)名保持一致
- 構(gòu)造方法不是我們手動(dòng)調(diào)用的从诲,是對(duì)象被創(chuàng)建的時(shí)候jvm(java虛擬機(jī))調(diào)用的
- 如果一個(gè)類(lèi)我們沒(méi)有給它定義構(gòu)造方法左痢,jvm(java虛擬機(jī))在編譯的時(shí)候 會(huì)給這個(gè)類(lèi)默認(rèn)添加一個(gè)無(wú)參構(gòu)造方法
- 如果自己定義了構(gòu)造方法,那么jvm不會(huì)再創(chuàng)建無(wú)參構(gòu)造方法
- 創(chuàng)建對(duì)象的時(shí)候系洛,有幾個(gè)參數(shù)俊性,就要有相應(yīng)的構(gòu)造方法,也是對(duì)應(yīng)的要有幾個(gè)參數(shù)
格式
- 修飾符 類(lèi)名(參數(shù)列表){}
- 直接類(lèi)名 (參數(shù)列表){}
方法重載
方法是可以重名的描扯,我們把這種重名的方法叫 方法的重載
注意
- 方法名一樣才叫方法重載
- 任何方法(普通方法定页,構(gòu)造方法)都可以實(shí)現(xiàn)方法重載
- 參數(shù)列表要保證順序 或者 個(gè)數(shù)是不一樣的
例如:
- Person (String a , int b);
- Person ( int b, String a);//順序不一樣
- Person (String a , int b,String c);//個(gè)數(shù)不一樣
方法重寫(xiě)
在Java程序中绽诚,類(lèi)的繼承關(guān)系可以產(chǎn)生一個(gè)子類(lèi)典徊,子類(lèi)繼承父類(lèi),它具備了父類(lèi)所有的特征恩够,繼承了父類(lèi)所有的方法和變量卒落。子類(lèi)可以定義新的特征,當(dāng)子類(lèi)需要修改父類(lèi)的一些方法進(jìn)行擴(kuò)展蜂桶,增大功能儡毕,程序設(shè)計(jì)者常常把這樣的一種操作方法稱(chēng)為重寫(xiě),也叫稱(chēng)為覆寫(xiě)或覆蓋扑媚。
在重寫(xiě)方法時(shí)腰湾,需要遵循以下的規(guī)則:
- 父類(lèi)方法的參數(shù)列表必須完全與被子類(lèi)重寫(xiě)的方法的參數(shù)列表相同雷恃,否則不能稱(chēng)其為重寫(xiě)而是重載
- 父類(lèi)的返回類(lèi)型必須與被子類(lèi)重寫(xiě)的方法返回類(lèi)型相同,否則不能稱(chēng)其為重寫(xiě)而是重載
- Java中規(guī)定费坊,被子類(lèi)重寫(xiě)的方法不能擁有比父類(lèi)方法更加嚴(yán)格的訪(fǎng)問(wèn)權(quán)限
- 由于父類(lèi)的訪(fǎng)問(wèn)權(quán)限修飾符的限制一定要大于被子類(lèi)重寫(xiě)方法的訪(fǎng)問(wèn)權(quán)限修飾符倒槐,而private權(quán)限最小。所以如果某一個(gè)方法在父類(lèi)中的訪(fǎng)問(wèn)權(quán)限是private附井,那么就不能在子類(lèi)中對(duì)其進(jìn)行重寫(xiě)
- 在繼承過(guò)程中如果父類(lèi)當(dāng)中的方法拋出異常导犹,那么在子類(lèi)中重寫(xiě)父類(lèi)的該方法時(shí),也要拋出異常羡忘,而且拋出的異常不能多于父類(lèi)中拋出的異常(可以等于父類(lèi)中拋出的異常)
例如:父類(lèi)的一個(gè)方法申明了一個(gè)檢查異常IOException谎痢,在重寫(xiě)這個(gè)方法時(shí)就不能拋出Exception,只能拋出IOException的子類(lèi)異常卷雕,可以?huà)伋龇菣z查異常
方法重寫(xiě)與方法重載的區(qū)別
區(qū)別點(diǎn) | 方法重載 | 方法重寫(xiě)(覆蓋) |
---|---|---|
英文 | Overloading | Overiding |
定義 | 方法名稱(chēng)相同节猿,參數(shù)的類(lèi)型或個(gè)數(shù)不同 | 方法名稱(chēng)、參數(shù)類(lèi)型漫雕、返回值類(lèi)型全部相同 |
定義 | 對(duì)權(quán)限沒(méi)有要求 | 被重寫(xiě)的方法不能擁有更嚴(yán)格的權(quán)限 |
范圍 | 發(fā)生在一個(gè)類(lèi)中 | 發(fā)生在繼承類(lèi)中 |
構(gòu)造代碼塊
構(gòu)造代碼塊作用:給對(duì)象統(tǒng)一初始化滨嘱。(對(duì)象創(chuàng)建之前都會(huì)走這個(gè)方法)
注意
- 構(gòu)造代碼塊必須寫(xiě)在成員變量(屬性)的位置
- 對(duì)象創(chuàng)建之前都會(huì)走這個(gè)方法
- java中編譯器編譯java源文件的時(shí)候,會(huì)把成員變量的聲明放到最前面
- 成員變量的初始化都是在構(gòu)造方法中執(zhí)行的浸间,一旦經(jīng)過(guò)java編譯器編譯太雨,構(gòu)造代碼塊的方法會(huì)移到構(gòu)造函數(shù)中執(zhí)行,放在構(gòu)造函數(shù)的最前面執(zhí)行
- 如果沒(méi)有構(gòu)造方法魁蒜,只有成員變量初始化和構(gòu)造代碼塊囊扳,按照當(dāng)前代碼的順序來(lái)執(zhí)行
代碼塊分為三類(lèi):
- 構(gòu)造代碼塊 : {...}
- 局部代碼塊:寫(xiě)在方法中,也是以大括號(hào)來(lái)表示
- 靜態(tài)代碼塊:static{...}
參考代碼:
User.java
package com.DesignPattern.test;
/**
* Created by shun_c on 2017/7/3.
*/
public class User {
public String name;
public static int age;
{
age = 21;
System.out.println("user in 構(gòu)造代碼塊 前 " + age);
}
static {
age = 111;
System.out.println("user in 靜態(tài)代碼塊 " + age);
}
public User(){
age = 31;
System.out.println("user in 構(gòu)造方法 " + age);
}
public void use(){
age = 41;
System.out.println("user in use 方法 " + age);
}
public static void main(String [] args){
User user = new User();
user.age = 51;
System.out.println("user in main " + user.age);
user.use();
}
{
age = 61;
System.out.println("user in 構(gòu)造代碼塊 后 " + age);
}
}
Student.java
package com.DesignPattern.test;
/**
* Created by shun_c on 2017/7/3.
*/
public class Student extends User {
{
age = 71;
System.out.println("student in 構(gòu)造代碼塊 前 " + age);
}
static {
age = 121;
System.out.println("student in 靜態(tài)代碼塊 " + age);
}
public Student(){
age = 81;
System.out.println("student in 構(gòu)造方法 " + age);
}
public void use(){
age = 91;
System.out.println("student in use 方法 " + age);
}
{
age = 101;
System.out.println("student in 構(gòu)造代碼塊 后 " + age);
}
public static void main(String [] args){
Student student = new Student();
System.out.println("student in main " + student.age);
student.use();
}
}
run : User.java
run : Student.java