天天看點

Java 匿名函數、構造方法、構造代碼塊、方法重載與方法重寫

匿名函數

Java Lambda 表達式(又名閉包(Closure)/匿名函數)

構造方法

構造方法的作用:給對象進行初始化,對象建立時初始化屬性值

建立構造方法

  • 構造方法沒有傳回類型,方法名和類名保持一緻
  • 構造方法不是我們手動調用的,是對象被建立的時候jvm(java虛拟機)調用的
  • 如果一個類我們沒有給它定義構造方法,jvm(java虛拟機)在編譯的時候 會給這個類預設添加一個無參構造方法
  • 如果自己定義了構造方法,那麼jvm不會再建立無參構造方法
  • 建立對象的時候,有幾個參數,就要有相應的構造方法,也是對應的要有幾個參數

格式

  • 修飾符 類名(參數清單){}
  • 直接類名 (參數清單){}

方法重載

方法是可以重名的,我們把這種重名的方法叫 方法的重載

注意

  • 方法名一樣才叫方法重載
  • 任何方法(普通方法,構造方法)都可以實作方法重載
  • 參數清單要保證順序 或者 個數是不一樣的

    例如:

    • Person (String a , int b);
    • Person ( int b, String a);//順序不一樣
    • Person (String a , int b,String c);//個數不一樣

方法重寫

在Java程式中,類的繼承關系可以産生一個子類,子類繼承父類,它具備了父類所有的特征,繼承了父類所有的方法和變量。子類可以定義新的特征,當子類需要修改父類的一些方法進行擴充,增大功能,程式設計者常常把這樣的一種操作方法稱為重寫,也叫稱為覆寫或覆寫。

在重寫方法時,需要遵循以下的規則:

  • 父類方法的參數清單必須完全與被子類重寫的方法的參數清單相同,否則不能稱其為重寫而是重載
  • 父類的傳回類型必須與被子類重寫的方法傳回類型相同,否則不能稱其為重寫而是重載
  • Java中規定,被子類重寫的方法不能擁有比父類方法更加嚴格的通路權限
  • 由于父類的通路權限修飾符的限制一定要大于被子類重寫方法的通路權限修飾符,而private權限最小。是以如果某一個方法在父類中的通路權限是private,那麼就不能在子類中對其進行重寫
  • 在繼承過程中如果父類當中的方法抛出異常,那麼在子類中重寫父類的該方法時,也要抛出異常,而且抛出的異常不能多于父類中抛出的異常(可以等于父類中抛出的異常)
    例如:父類的一個方法申明了一個檢查異常IOException,在重寫這個方法時就不能抛出Exception,隻能抛出IOException的子類異常,可以抛出非檢查異常

方法重寫與方法重載的差別

差別點 方法重載 方法重寫(覆寫)
英文 Overloading Overiding
定義 方法名稱相同,參數的類型或個數不同 方法名稱、參數類型、傳回值類型全部相同
定義 對權限沒有要求 被重寫的方法不能擁有更嚴格的權限
範圍 發生在一個類中 發生在繼承類中

構造代碼塊

構造代碼塊作用:給對象統一初始化。(對象建立之前都會走這個方法)

注意

  • 構造代碼塊必須寫在成員變量(屬性)的位置
  • 對象建立之前都會走這個方法
  • java中編譯器編譯java源檔案的時候,會把成員變量的聲明放到最前面
  • 成員變量的初始化都是在構造方法中執行的,一旦經過java編譯器編譯,構造代碼塊的方法會移到構造函數中執行,放在構造函數的最前面執行
  • 如果沒有構造方法,隻有成員變量初始化和構造代碼塊,按照目前代碼的順序來執行

代碼塊分為三類:

  • 構造代碼塊 : {…}
  • 局部代碼塊:寫在方法中,也是以大括号來表示
  • 靜态代碼塊: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 = ;
        System.out.println("user in 構造代碼塊 前 " + age);
    }

    static {
        age = ;
        System.out.println("user in 靜态代碼塊 " + age);
    }

    public User(){
        age = ;
        System.out.println("user in 構造方法 " + age);
    }

    public void use(){
        age = ;
        System.out.println("user in use 方法 " + age);
    }

    public static void main(String [] args){

        User user = new User();
        user.age = ;
        System.out.println("user in main " + user.age);
        user.use();
    }

    {
        age = ;
        System.out.println("user in 構造代碼塊 後 " + age);
    }
}
           

Student.java

package com.DesignPattern.test;

/**
 * Created by shun_c on 2017/7/3.
 */
public class Student extends User {

    {
        age = ;
        System.out.println("student in 構造代碼塊 前 " + age);
    }

    static {
        age = ;
        System.out.println("student in 靜态代碼塊 " + age);
    }

    public Student(){
        age = ;
        System.out.println("student in 構造方法 " + age);
    }

    public void use(){
        age = ;
        System.out.println("student in use 方法 " + age);
    }

    {
        age = ;
        System.out.println("student in 構造代碼塊 後 " + age);
    }

    public static void main(String [] args){
        Student student = new Student();
        System.out.println("student in main " + student.age);
        student.use();
    }
}
           

run : User.java

Java 匿名函數、構造方法、構造代碼塊、方法重載與方法重寫

run : Student.java

Java 匿名函數、構造方法、構造代碼塊、方法重載與方法重寫