把所有的三角形抽象類三角形類, 把所有的圓形抽象為圓形類,把所有的矩形抽象為矩形類, 把所有的三角形/圓形/矩形等所有平面圖形抽象為平面圖形類。
在平面圖形類, 可以進(jìn)行對平面圖形求面積/求周長等操作, 但是不同的圖形有不同的求法, 在平面圖形類中, 求面積/求周長的操作沒法具體實現(xiàn). 就像所有的動物都會動, 不同的動物動的方式不同,動物類有這個操作,也沒法具體實現(xiàn)。
當(dāng)一個類的某個操作沒法具體實現(xiàn)時,這個操作可以定義為抽象方法。
抽象方法使用abstract修飾的方法,只有方法的聲明部分,沒有方法體。
package com.wkcto.chapter01.abstracttest.demo01;
/**
* 定義平面圖形 類
* 該類有對平面圖形求面積,求周長的操作
*
* 1) 當(dāng)一個類的某個操作沒法具體實現(xiàn)時, 這個操作可以定義為抽象方法
* 2) 使用abstract修飾的方法為抽象方法, 只有方法的聲明,沒有方法體
* 3) 含有抽象方法的類必須定義為抽象類
* @author 蛙課網(wǎng)
*
*/
public abstract class Graphics2d {
//定義抽象方法,求面積
public abstract double getArea();
//定義抽象方法,求周長
public abstract double getPerimeter();
}
package com.wkcto.chapter01.abstracttest.demo01;
/**
* 定義矩形類
*
* 1) 子類繼承了抽象類, 需要在子類中重寫抽象類的抽象方法
* @author 蛙課網(wǎng)
*
*/
public class Rectangle extends Graphics2d {
int width;
int height;
public Rectangle(int width, int height) {
super();
this.width = width;
this.height = height;
}
@Override
public double getArea() {
return width*height;
}
@Override
public double getPerimeter() {
return 2*(width+height);
}
}
package com.wkcto.chapter01.abstracttest.demo01;
/**
* 測試類,
* 定義一個方法,可以顯示任意平面圖形的面積與周長
* @author 蛙課網(wǎng)
*
*/
public class Test {
public static void main(String[] args) {
//創(chuàng)建矩形 對象
Rectangle rect = new Rectangle(10, 5);
//方法的形參graphics2d是一個父類引用,在調(diào)用方法時, 可以傳遞子類對象
showInfo(rect);
//創(chuàng)建圓形對象
Circle c1 = new Circle(10);
showInfo(c1);
}
// 定義一個方法,可以顯示任意平面圖形的面積與周長
public static void showInfo( Graphics2d graphics2d) {
System.out.println("平面圖形的信息------------------");
System.out.println("面積:" + graphics2d.getArea());
System.out.println( "周長:" + graphics2d.getPerimeter());
}
}
package com.wkcto.chapter01.abstracttest.demo01;
/**
* 定義三角形類
* 如果子類繼承了抽象類, 沒有重寫所有的抽象方法,那么子類也需要定義為抽象類
* @author 蛙課網(wǎng)
*
*/
public abstract class Triangle extends Graphics2d {
int a;
int b;
int c;
@Override
public double getPerimeter() {
return a+b+c;
}
}
package com.wkcto.chapter01.abstracttest.demo01;
/**
* 測試抽象類的特點:
* 1) 只要使用abtract修飾的類就是抽象類
* 2) 含有抽象方法的類必須定義 為抽象類,但是,抽象類中不一定含有抽象方法
* 有時,對現(xiàn)有的類進(jìn)一步抽象形成更高層級的類(更抽象的類),如食物類,動物類, 它們是沒法實例化,這種情況下,可以定義為抽象類
* 3) 抽象類是一種引用數(shù)據(jù)類型, 可以定義變量, 但是抽象類不能實例化對象,
* 抽象類定義引用可以賦值子類對象
* 4) 抽象類肯定含有構(gòu)造方法, 子類創(chuàng)建對象時調(diào)用子類構(gòu)造方法,子類構(gòu)造方法體執(zhí)行前會先執(zhí)行父類的構(gòu)造方法
* 5) abstract與final不能同時使用
* @author 蛙課網(wǎng)
*
*/
public class Test02 {
public static void main(String[] args) {
//使用抽象類定義一個變量
Graphics2d graphics2d;
// graphics2d = new Graphics2d();;//Cannot instantiate the type Graphics2d
Rectangle rectangle = new Rectangle(10, 5);
//抽象類引用可以賦值子類對象
graphics2d = rectangle;
graphics2d = new Rectangle(5, 2);
}
}
練習(xí): 主人喂養(yǎng)寵物,寵物就賣萌
package com.wkcto.chapter01.abstracttest.demo02;
/**
* 寵物類
* 賣萌
* @author 蛙課網(wǎng)
*
*/
public abstract class Pet {
//賣萌
public abstract void sellMeng() ;
}
package com.wkcto.chapter01.abstracttest.demo02;
/**
* 小狗是寵物
* @author 蛙課網(wǎng)
*
*/
public class Dog extends Pet {
@Override
public void sellMeng() {
System.out.println("汪汪汪~~~~");
}
}
package com.wkcto.chapter01.abstracttest.demo02;
/**
* 主人類
* @author 蛙課網(wǎng)
*
*/
public class Master {
//喂寵物
public void feed( Pet pet) {
//寵物賣萌
pet.sellMeng();
}
}
package com.wkcto.chapter01.abstracttest.demo02;
/**
* 測試主人喂寵物,寵物就賣萌
* @author 蛙課網(wǎng)
*
*/
public class Test {
public static void main(String[] args) {
Master xiaoxi = new Master();
Dog dog = new Dog();
xiaoxi.feed(dog);
Cat cat = new Cat();
xiaoxi.feed(cat);
}
}
練習(xí):
憤怒的小鳥, 紅火(紅顏色的鳥)可以正常飛行 , 藍(lán)冰(藍(lán)顏色的鳥)可以一個變?nèi)齻€, 黃風(fēng)(黃顏色的鳥)可以加速飛行, 定義一個彈弓類,有一個彈射的方法 ,可以把鳥給射出去, 鳥在飛。