天天看點

Java--向上轉型,多态,重寫,向下轉型,抽象類

向上轉型:

父類引用子類對象

向上轉型的三種方式:

1.直接指派

Animal animal = new Cat();
	animal.eat();
           

2.方法傳參

public static void func(Animal animal) {
	animal.eat();
}

	Cat cat = new Cat();
	func(cat);
           

3.方法傳回

public static Cat func2() {
	Cat cat = new Cat();
	return cat;
}

Animal animal = func2();
           

父類隻能調用父類自己的方法和屬性

(Anmial中沒有jump方法,Cat中有jump方法)

Anmial anmial=new Cat();
anmial.jump();//error   
           

多态

多态:運作時綁定

底層中:

  1. invokespecial:調用構造方法
  2. invokevirtual:非靜态方法,執行個體方法
  3. invokestatic:靜态方法

重寫(覆寫)(override):方法名相同,參數清單相同,傳回值相同

Animal animal = new Cat();
	animal.eat();//調用Cat的eat方法
	//Animal的eat方法被Cat的eat方法所覆寫
           

注意:

1.方法不能是private的

2.子類的方法權限一定要大于父類的方法權限

3.重寫的方法不能是靜态的方法

發生多态:(運作時多态)

1.繼承–>父類需要引用子類對象(向上轉型)

2.通過父類的引用去調用子類和父類同名的重寫方法

問:重載與重寫的差別??? ⭐⭐⭐⭐

差別 重載 重寫
概念 方法名稱相同 方法名稱,傳回值類型,參數的類型及個數完全相同
範圍 一個類 繼承關系
限制 沒有權限要求 被覆寫的方法不能擁有比父類更嚴格的通路控制權限

問:this和super的差別??? ⭐⭐⭐⭐

差別 this super
概念 通路本類中的屬性和方法 由子類通路父類中的屬性,方法
查找範圍 先查找本類,如果本類沒有就調用父類 不查找本類而直接調用父類
特殊 表示目前對象的引用

向下轉型

向下轉型:

Animal animal = new Bird();
	Bird bird =  (Bird)animal;
           

前提:必須先進行向上轉型

Animal animal = new Bird();
	Cat cat = (Cat)animal ;
    cat.jump();
           

會出現類型轉換異常

修改:

Animal animal = new Bird();
   if(animal instanceof Cat ) {
   //如果Cat是Animal的執行個體,則執行下面代碼
      Cat cat = (Cat)animal ;
      cat.jump();
   }
           

抽象類

抽象方法:abstract

注意:

1.包含抽象方法的類叫做抽象類

2.抽象類不能被執行個體化 new

3.抽象類當中可以有抽象方法,也可以有非抽象方法,或者是成員變量

4.抽象類的産生就是為了繼承

5.抽象類隻要被繼承之後,就一定要重寫抽象方法

6.抽象類A繼承抽象類B,那麼抽象類A可以選擇重寫或者不重寫抽象類B中的方法

abstract class Shape2 {
    public abstract void draw();
}

abstract class B3 extends Shape2 {
    @Override
    public void draw() {
        System.out.println("抽象類重寫了,那麼繼承之後不需要重寫");
    }
}
class B4 extends B3{
    /*@Override
    public void draw() {
        System.out.println("必須重寫");
    }*/
}

           

繼續閱讀