***多態***
1.多態性:一般使用方法的重載(Overloading)和重寫(Overriding)實現類的多態;
2.重寫之因此具備多態性,是由於父類的方法在子類中被重寫,方法名相同,實現功能不一樣。
3.方法重載:是指在一個類中出現多個方法名相同,但參數或參數類型不一樣的方法;
4.java執行重載方法時,根據參數個數和類型區執行哪個方法;
5.重載的方法以前不必定必須有聯繫,但爲了提升程序的可讀性,通常只重載功能類似的方法;
6.方法重載時,方法返回值類型不能做爲區分方法的標誌;
java
多態:ide
1 /** 2 * 3 * @author 做者:sunshine 4 * @date 建立時間:2016年7月4日 下午5:22:19 5 */ 6 7 class Calculate{ 8 final float PI=3.14f; 9 //求圓形的面積 10 public float getArea(float r){ 11 float area=PI*r*r; 12 return area; 13 } 14 //求矩形的面積 15 public float getArea(float w,float l){ 16 float area=w*l; 17 return area; 18 } 19 //畫任意形狀的圖形 20 public void draw(int n){ 21 System.out.println("畫"+n+"個任意形狀的圖形。"); 22 } 23 public void draw(String shape){ 24 System.out.println("畫一個"+shape+"形狀的圖形。"); 25 } 26 } 27 28 /********** 29 *一、抽象類聲明時要使用abstract關鍵字來定義,爲繼承而存在;抽象類不能建立對象; 30 *二、抽象類裏的抽象方法不能有方法體, 只能是方法的聲明,例如 abstract void AMethod()。 31 *三、若是一個類繼承於一個抽象類,則子類必須實現父類的抽象方法。 32 *四、若是子類沒有實現父類的抽象方法,則必須將子類也定義爲abstract類。 33 */ 34 abstract class Shape{ 35 public String getName(){ 36 return this.getClass().getSimpleName(); //不懂這兒,書上解釋:使用反射機制得到"類"名稱 37 } 38 public abstract double getArea(); //得到圖形的名稱 39 } 40 41 class Circle extends Shape{ 42 private double radius; 43 public Circle(double radius){ 44 this.radius=radius; 45 } 46 47 @Override 48 public double getArea(){ 49 return Math.PI*Math.pow(radius, 2); 50 } 51 } 52 class Rectangle extends Shape{ 53 private double length; 54 private double width; 55 public Rectangle(double length,double width){ 56 this.length=length; 57 this.width=width; 58 } 59 60 @Override 61 public double getArea(){ 62 return length*width; 63 } 64 } 65 66 //簡單的汽車銷售商場 67 abstract class Car{ 68 public abstract String getInfo(); 69 } 70 class BMW extends Car{ 71 @Override 72 public String getInfo(){ 73 return "It's a BMW!"; 74 } 75 } 76 class Benz extends Car{ 77 @Override 78 public String getInfo(){ 79 return "It's a Benz!"; 80 } 81 } 82 //建立一個CarFactory類,定義一個靜態方法getCar(),能夠根據用戶指定的車型來建立類 83 class CarFactory { 84 public static Car getCar(String name){ 85 if (name.equalsIgnoreCase("BMW")){ 86 return new BMW(); 87 } else if (name.equalsIgnoreCase("Benz")){ 88 return new Benz(); 89 }else { 90 return null; 91 } 92 } 93 } 94 95 96 97 public class Hello3Polymorphism { 98 99 public static void main(String[] args) { 100 // TODO Auto-generated method stub 101 System.out.println("開始學習多態嘍~~"); 102 103 //多態:方法重載 ,同一個類多個同名方法 104 System.out.println("\n方法重載 ,同一個類多個同名方法:"); 105 Calculate cal=new Calculate(); 106 float r=5.20f; 107 float w=8,l=4; 108 float areaR=cal.getArea(w, l); //精度不夠準喲 109 float areaC=cal.getArea(r); 110 System.out.println("半徑爲"+r+"的圓的面積是:"+areaC); 111 System.out.println("長爲"+l+"寬爲"+w+"的長方形的面積是"+areaR); 112 113 int n=5; 114 String star="星星"; 115 cal.draw(n); 116 cal.draw(star); 117 118 //計算幾何圖形的面積 119 System.out.println("\n計算幾何圖形的面積:"); 120 Circle circle=new Circle(1); 121 //System.out.println("圖形的名稱是:"+circle.getArea()); 122 System.out.println("圖形的面積是:"+circle.getName()); 123 Rectangle rectangle=new Rectangle(3,5); 124 //System.out.println("圖形的名稱是:"+rectangle.getArea()); 125 System.out.println("圖形的面積是:"+rectangle.getName()); 126 127 128 //簡單的汽車銷售商場 129 System.out.println("\n簡單的汽車銷售商場"); 130 System.out.println("顧客要購買BMW:"); 131 Car bwm=CarFactory.getCar("BMW"); 132 System.out.println("提取汽車:"+bwm.getInfo()); 133 System.out.println("顧客要購買Benz:"); 134 Car benz=CarFactory.getCar("Benz"); 135 System.out.println("提取汽車:"+benz.getInfo()); 136 137 138 139 } 140 141 }
輸出結果:學習
1 開始學習多態嘍~~ 2 3 方法重載 ,同一個類多個同名方法: 4 半徑爲5.2的圓的面積是:84.905594 5 長爲4.0寬爲8.0的長方形的面積是32.0 6 畫5個任意形狀的圖形。 7 畫一個星星形狀的圖形。 8 9 計算幾何圖形的面積: 10 圖形的面積是:Circle 11 圖形的面積是:Rectangle 12 13 簡單的汽車銷售商場 14 顧客要購買BMW: 15 提取汽車:It's a BMW! 16 顧客要購買Benz: 17 提取汽車:It's a Benz!