Java構造方法 重載與重寫

部分內容引自《Java語言程序設計》一書,摘抄以便記憶和回顧

一、Java中的構造方法

構造方法的特性:

1.必須具備和所在類相同的名字
2.沒有返回值類型,連void 也沒有
3.構造方法是在創建一個對象使用 new 操作符時候調用的
4.構造方法的作用是初始化對象,也可以重載(即-可以有多個同名的構造方法,但是需要有不同的簽名)

  • 一個類可以不定義構造方法,類中會隱含創建一個方法體爲空的構造方法(類中沒有明確定義構造方法時會提供)【文末示例二】
  • 構造方法是用來構造對象的,使用 new 操作符調用構造方法。
  • 拓展:基本類型和引用類型的區別
    • 每個變量都代表一個存儲值的內存位置
    • 聲明一個變量,就是告訴編譯器這個變量可以存放什麼類型的值
    • 區別:對於基本類型變量,對應內存索存儲的值是基本類型值。對於引用類型變量來說,對於內存索存儲的值是一個引用(即對象的地址)
      在這裏插入圖片描述

構造方法示例一:

// 構造方法示例一
// 代碼來自《Java語言程序設計》一書的改造,摘抄以便記憶和回顧
public class Circle {
    double radius = 1;
    public static void main(String[] args){
        Circle myCircle1 = new Circle();   // 使用無參構造方法創建對象
        Circle myCircle2 = new Circle(2.0); // 使用 有參構造方法創建對象

        System.out.println(myCircle1.getArea());    //  6.283185307179586
        System.out.println(myCircle2.getArea());    // 12.566370614359172
    }

    Circle(){  // 無參構造方法
    }
    Circle(double newRadius){  // 有構造方法
        radius = newRadius;
    }

    double getArea(){   //普通方法
        return  2 * radius * Math.PI;
    }
}

構造方法示例二:

// 構造方法示例二
/**
 * 也可以不定義構造方法,會默認創建空方法體的構造方法(在沒有創建任何構造方法的前提下)
 */
public class SampleCircle {

    double radius = 1;

    public static void main(String[] args){
        SampleCircle mySampleCircle = new SampleCircle();
        System.out.println(mySampleCircle.getArea());   //  6.283185307179586
    }
    double getArea(){   //普通方法
        return  2 * radius * Math.PI;
    }

}

二、Java方法重載與重寫的區別
區別:
  • 重載是由靜態類型確定的,在類加載的時候即可確定,屬於靜態分派
  • 重寫是由動態類型確定的,是在運行時確定的,屬於動態分派
  • 動態分派是由虛方法表實現的,虛方法表中存在着各個方法的實際入口地址
  • 如果父類中的某個方法,在子類中沒有重寫,則子類和父類的方法表中的這個方法地址相同
  • 如果子類重寫了此方法,則子類方法表的地址指向重寫後的地址。

重載

重載是指在同一個類中,有多個方法名相同(如前面的一個類中的多個構造方法也是重載),參數列表不同(參數個數/類型)可以理解爲重載是一個類中的多態

示例三:

// Add.java 方法重載示例
public class Add {

    public static void main(String[] args){
        Add testAdd = new Add();
        int add1 = testAdd.add();
        int add2 = testAdd.add(2);
        float add3 = testAdd.add(1.5F,2);

        System.out.println("構造方法1:" + add1 + "\n構造方法2:" + add2 + "\n構造方法3:" + add3);
    }

    // 構造方法示例
    public int add(){
        return 1+1;
    }
    public int add(int a){
        return a + 1;
    }
    public float add(float a,int b){
        return a + b;
    }
}

運行結果:
構造方法1:2
構造方法2:3
構造方法3:3.5

重寫

發生在子類繼承父類,子類重寫父類的方法,通過動態綁定
如果子類中的方法與父類中的某一方法,具有相同的方法名、返回類型、參數表 則新方法將覆蓋原有的方法。如需原有的方法可以使用super關鍵字,該關鍵字引用當前類的父類。
子類的修飾符權限不能少於父類

方法重寫示例:
//基類 Animal.java
public class Animal {
    public void whatAnimal(){
        System.out.println("我是小貓...");
    }
}
// 繼承並含重寫方法的 ExtendsAnimal.java
public class ExtendsAnimal extends Animal {
    public static void main (String[] args){
        ExtendsAnimal extendsAnimal = new ExtendsAnimal();
        extendsAnimal.whatAnimal();
    }

    // 重寫  加上註解 @Override
    @Override
    public void whatAnimal(){
        System.out.println("我是小老虎...");
    }
}

運行結果:
我是小老虎...
// 繼承但不重寫的 ExtendsAnimalNotReWrite.java
public class ExtendsAnimalNotReWrite extends Animal{
    public static void main(String[] args){
        ExtendsAnimalNotReWrite extendsAnimalNotReWrite = new ExtendsAnimalNotReWrite();
        extendsAnimalNotReWrite.whatAnimal();
    }
}
運行結果:
我是小貓...
三、this,this(),super,super()的使用
  • this引用對象自身,也可以在構造方法內部用於同一個類的其他構造方法,this在引用隱藏數據域以及調用一個重載的構造方法時時必須的。常常用在JavaBean 的setter和getter方法中
    this
  • super 指代父類可以用於調用父類的普通方法和構造方法
  • 父類的構造方法不能被子類繼承,需要使用super 從子類的構造方法中調用[super()調用父類無參構造方法,super(args) 調用參數匹配的父類構造方法];注意必須出現在子類構造方法的第一條語句
    下面改造一下前面的Animall類,增加構造方法
    示例代碼:
 // 基類 Animal.java
public class Animal {
    //該類的普通方法
    public void whatAnimal(){
        System.out.println("我是小貓...");
    }

    // 該類的無參構造方法
    public Animal(){
        System.out.println("我是Animal的無參構造方法");
    }
    // 該類的一個有參構造方法
    public Animal(String name){
        System.out.println("我是Animal的有參構造方法,我叫:" + name);
    }
}

// 繼承自 Animal的類
public class ExtendsAnimal extends Animal {
    public static void main (String[] args){
        ExtendsAnimal extendsAnimal = new ExtendsAnimal();      // 會調用父類的無參構造方法,在創建對象時先執行父類的構造方法
        extendsAnimal.whatAnimal();     // 調用的是重寫後的方法

        ExtendsAnimal extendsAnimal2 = new ExtendsAnimal("小藍");

    }

    // 重寫  加上註解 @Override
    @Override
    public void whatAnimal(){
        System.out.println("我是小老虎...");
    }

    // 構造方法 使用 super
    public ExtendsAnimal(){
        super();
    }

    public ExtendsAnimal(String name){
        super(name);        // 調用父類的 有參構造方法
    }
}

運行結果:
我是Animal的無參構造方法
我是小老虎...
我是Animal的有參構造方法,我叫:小藍
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章