歡迎您光臨本站 註冊首頁

Java面向對象基礎之多態性,抽象類和接口

←手機掃碼閱讀     sl_ivan @ 2020-06-08 , reply:0

一、多態性

多態是指一個對象可以擁有多種不同的形態,繼承是實現多態的基礎。

1.1 引用多態和方法多態
 

引用多態:父類引用可以指向本類的對象,也可以指向子類的對象

方法多態:
 1、創建本類對象時,調用的方法為本類方法;
 2、創建子類對象時,調用的方法為子類重寫或繼承的方法。

首先建立父類Animal,包含一個eat()方法,如下代碼所示:

  public class Animal {   public void eat(){   System.out.println("動物可以吃東西");   }  }

 

然後建立子類Dog繼承父類Animal,並重寫eat()方法。

  public class Dog extends Animal{   public void eat(){   System.out.println("狗狗可以吃東西");   }  }

 

最後建立一個Cat類繼承Animal,並獨有getMouse()方法。

  public class Cat extends Animal{   public void getMouse(){   System.out.println("貓會抓老鼠");   }  }

 

通過測試類進行測試發現,父類的引用不能調用子類獨有的方法。

  public class InitTest {   public static void main(String[] args) {   Animal obj1 = new Animal();//父類的引用指向本類對象   Animal obj2 = new Dog();//父類的引用指向子類對象   Animal obj3 = new Cat();   obj1.eat();//動物可以吃東西   obj2.eat();//20歲的狗狗可以吃東西   obj3.eat();//動物可以吃東西   }  }

 

1.2 引用類型轉換

向上類型轉換(隱式或自動類型轉換):子類轉換為父類對象
 向下類型轉換(強制類型轉換):父類轉換為子類,有風險

向上類型轉換好比是把杯子中的水倒進壺裡,不會存在風險;而向下類型轉換則是把壺裡的水倒進杯子裡,可能會溢出。為了避免這種風險的發生,可以使用instanceof關鍵字進行判斷。如下代碼所示:

  public class InitTest {   public static void main(String[] args) {   Animal obj = new Dog();//向上類型轉換   if(obj instanceof Dog){    Dog dog = (Dog)obj; //向下類型轉換   }else{    System.out.println("不能進行Dog類型轉換");   }   if(obj instanceof Cat){    Cat cat = (Cat)obj;   }else{    System.out.println("不能進行Cat類型轉換");   }   }  }

 

程序能夠正常運行,且不能進行Cat類型轉換。

二、抽象類與接口

2.1 抽象類

當某個父類只知道子類應該包含這些方法卻不知如何實現時,需要用到抽象類。抽象類用abstract關鍵字修飾,它限制子類必須有哪些方法,但不關注實現。抽象類中可以包含普通方法,也可以沒有方法。

例:利用抽象類編寫程序,求矩形和圓的周長和麵積。

實現步驟:
 1、抽象出矩形和圓形的抽象類Shape作為父類,並定義要實現的方法求周長premeter()和求面積area();
 2、分別創建子類Rectangle和Circle,繼承抽象父類Shape;
 3、根據相關圖形的求解算法,分別實現父類的抽象方法。

  public abstract class Shape {   public abstract double perimeter();   public abstract double area();  }  public class Rectangle extends Shape {   double length;   double width;     public Rectangle(double length,double width){   this.length = length;   this.width = width;   }     @Override   public double perimeter() {   return 2*(length+width);   }     @Override   public double area() {   return length*width;   }    }  public class Circle extends Shape {   double radius;   final double PI = 3.14;     public Circle(double radius){   this.radius = radius;   }     @Override   public double perimeter() {   return 2*PI*radius;   }     @Override   public double area() {   return PI*radius*radius;   }    }  這裡,由於不同的形狀求解周長和麵積時,需要的參數個數不同,在定義抽象方法中無法統一給出參數,可以在子類中定義變量,通過初始化構造方法進行參數的傳遞。下面是測試方法代碼:    public class ShapeTest {   public static void main(String[] args) {   Shape s1 = new Rectangle(2,4);   Shape s2 = new Circle(3.9);   System.out.println("矩形的周長:"+s1.perimeter());   System.out.println("矩形的面積:"+s1.area());   System.out.println("圓形的周長:"+s2.perimeter());   System.out.println("圓形的面積:"+s2.area());   }  }

 

2.2 接口

接口是一種特殊的類,由全局變量和公共方法組成。它定義了某一批類的規範,而不關心這些類的內部數據和實現細節,只規定這些類裡必須提供某些方法。

接口裡的屬性是常量,默認會加上public static final三個關鍵字,接口裡的方法只能是抽象方法,默認會加上public abstract關鍵字。

一個類可以實現多個接口,但類必須是先繼承,然後實現接口。

例:傻瓜機和智能機繼承了父類手機,父類的抽象方法裡面都定義了打電話和發短信的功能,而智能機和PSP都有玩遊戲的功能。此時PSP不具備手機的特徵所以不宜繼承手機類,而可以將玩遊戲定義為一個接口,由智能機和PSP實現。

  public interface IPlayGame {   public void playGame();  }  public class SmartPhone extends Telphone implements IPlayGame{     @Override   public void call() {   System.out.println("SmartPhone可以打電話");   }     @Override   public void message() {   System.out.println("SmartPhone可以發短信");   }     @Override   public void playGame() {   System.out.println("玩遊戲的功能");   }    }  public class PSP implements IPlayGame{   @Override   public void playGame() {   System.out.println("玩遊戲的功能");   }  }  public class InterfaceTest {     public static void main(String[] args) {   IPlayGame ip1 = new SmartPhone();   IPlayGame ip2 = new PSP();   ip1.playGame();   ip2.playGame();   }    }

 

接口還可以通過匿名內部類的方式實現,即沒有名字的內部類。此方式常用於高級開發中。

   public static void main(String[] args) {   IPlayGame ip3 = new IPlayGame(){   @Override   public void playGame() {    System.out.println("使用匿名內部類的方式實現接口");   }   };   ip3.playGame();  }

 

注:文章根據本站相關課程的學習筆記整理而來,有錯誤或其他任何問題敬請指正,歡迎共同學習交流!


[sl_ivan ] Java面向對象基礎之多態性,抽象類和接口已經有317次圍觀

http://coctec.com/docs/java/show-post-237383.html