1. 程式人生 > 其它 >super()的使用以及向上轉型、向下轉型

super()的使用以及向上轉型、向下轉型

技術標籤:JAVA

1.super()概念

1.this相當於當前類的物件的指標
2.super相當於父類物件的指標,可以在非靜態函式中用super呼叫父類的函式
3.如果在子類中沒有顯示的用super呼叫父類的構造方法,那麼子類在建立的時候會預設建立父類的無參構造方法,但是要想呼叫父類的有參構造方法,就必須用super(param)將引數傳入

2.向上轉型,向下轉型概念

向上轉型:

子類直接呼叫父類的非私有方法就是向上轉型

向下轉型:

  • 父類物件不能直接呼叫子類的方法,不然會報型別轉換異常ClassCastException,所以在向下轉換之前要用instanceof方法確認一下例項所屬的類是哪一個
  • 解決方法:為了體現多型性,需要使父型別的變數是子型別的一個例項,即
    父類 例項名 = new 子類();
  • 此例項不僅可以呼叫父類的方法,還可以通過向下轉換呼叫子類方法,
    轉換方法:((子類名)例項名).子類函式

3.例子:

父類:定義了一個帶參構造方法,私有字串屬性,以及設定和獲取該字串的方法

public class A {
    private String greate = "hello";
    public A(String s){
        System.out.println("This is A"+s);
    }
    public void setGreate(String s){ 
        this.greate = s;
    }
    public void getGreate(){
        System.out.println(this.greate);
    }
}

子類:由於父類只定義了帶參構造方法,所以子類構造方法必須使super()傳入引數呼叫父類的構造方法,並定義了一個

public class A2 extends A {
    public A2(String s){
        super(s);
    }
    public void text(){
         System.out.println("子類的方法");
    }
}

主函式類:

 public static void main(String[] args) {
        //1.定義子類例項,通過super(s)使子類的建構函式呼叫父類的帶參建構函式
       A2 b = new A2("這是子類");
       
       //2.向上轉型,子類例項可以直接呼叫父類函式
        b.setGreate("子類呼叫父類函式");
        b.getGreate();
        //定義父類例項
       A a = new A("這是父類");
       
       //3.向下轉型,以下程式碼報錯顯示:java.lang.ClassCastException: A cannot be cast to A2
//        String s = ((A2)a).text(); //因為.的優先順序高於強轉換的符號,所以要用括號將轉換的例項名括起來再呼叫子類方法
        //為了不讓它報型別轉換的錯誤,首先應該用instanceof判斷要轉換的例項所屬類是否是子類
        if(a instanceof A2){
            System.out.println("以下是父類例項呼叫的子類方法");
            ((A2)a).text();
        }
        //父型別的變數是子型別的一個例項,只有這樣能才能保留呼叫父類方法的能力同時通過向下轉換擁有呼叫子類方法的能力
        A a2 = new A2("父型別的變數是子型別的一個例項");
        if(a2 instanceof A2) {
            System.out.println("以下是父型別的變數是子型別的一個例項呼叫的子類方法:");
            ((A2) a2).text();
        }
    }

在這裡插入圖片描述