您好,登錄后才能下訂單哦!
小編這次要給大家分享的是詳解Java中多態性,抽象類和接口,文章內容豐富,感興趣的小伙伴可以來了解一下,希望大家閱讀完這篇文章之后能夠有所收獲。
多態是指一個對象可以擁有多種不同的形態,繼承是實現多態的基礎。
引用多態:父類引用可以指向本類的對象,也可以指向子類的對象
方法多態:
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類型轉換。
當某個父類只知道子類應該包含這些方法卻不知如何實現時,需要用到抽象類。抽象類用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()); } }
接口是一種特殊的類,由全局變量和公共方法組成。它定義了某一批類的規范,而不關心這些類的內部數據和實現細節,只規定這些類里必須提供某些方法。
接口里的屬性是常量,默認會加上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(); }
看完這篇關于詳解Java中多態性,抽象類和接口的文章,如果覺得文章內容寫得不錯的話,可以把它分享出去給更多人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。