把所有的三角形抽象类三角形类, 把所有的圆形抽象为圆形类,把所有的矩形抽象为矩形类, 把所有的三角形/圆形/矩形等所有平面图形抽象为平面图形类。
在平面图形类, 可以进行对平面图形求面积/求周长等操作, 但是不同的图形有不同的求法, 在平面图形类中, 求面积/求周长的操作没法具体实现. 就像所有的动物都会动, 不同的动物动的方式不同,动物类有这个操作,也没法具体实现。
当一个类的某个操作没法具体实现时,这个操作可以定义为抽象方法。
抽象方法使用abstract修饰的方法,只有方法的声明部分,没有方法体。
package com.wkcto.chapter01.abstracttest.demo01;
/**
* 定义平面图形 类
* 该类有对平面图形求面积,求周长的操作
*
* 1) 当一个类的某个操作没法具体实现时, 这个操作可以定义为抽象方法
* 2) 使用abstract修饰的方法为抽象方法, 只有方法的声明,没有方法体
* 3) 含有抽象方法的类必须定义为抽象类
* @author 蛙课网
*
*/
public abstract class Graphics2d {
//定义抽象方法,求面积
public abstract double getArea();
//定义抽象方法,求周长
public abstract double getPerimeter();
}
package com.wkcto.chapter01.abstracttest.demo01;
/**
* 定义矩形类
*
* 1) 子类继承了抽象类, 需要在子类中重写抽象类的抽象方法
* @author 蛙课网
*
*/
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 蛙课网
*
*/
public class Test {
public static void main(String[] args) {
//创建矩形 对象
Rectangle rect = new Rectangle(10, 5);
//方法的形参graphics2d是一个父类引用,在调用方法时, 可以传递子类对象
showInfo(rect);
//创建圆形对象
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 蛙课网
*
*/
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) 含有抽象方法的类必须定义 为抽象类,但是,抽象类中不一定含有抽象方法
* 有时,对现有的类进一步抽象形成更高层级的类(更抽象的类),如食物类,动物类, 它们是没法实例化,这种情况下,可以定义为抽象类
* 3) 抽象类是一种引用数据类型, 可以定义变量, 但是抽象类不能实例化对象,
* 抽象类定义引用可以赋值子类对象
* 4) 抽象类肯定含有构造方法, 子类创建对象时调用子类构造方法,子类构造方法体执行前会先执行父类的构造方法
* 5) abstract与final不能同时使用
* @author 蛙课网
*
*/
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);
}
}
练习: 主人喂养宠物,宠物就卖萌
package com.wkcto.chapter01.abstracttest.demo02;
/**
* 宠物类
* 卖萌
* @author 蛙课网
*
*/
public abstract class Pet {
//卖萌
public abstract void sellMeng() ;
}
package com.wkcto.chapter01.abstracttest.demo02;
/**
* 小狗是宠物
* @author 蛙课网
*
*/
public class Dog extends Pet {
@Override
public void sellMeng() {
System.out.println("汪汪汪~~~~");
}
}
package com.wkcto.chapter01.abstracttest.demo02;
/**
* 主人类
* @author 蛙课网
*
*/
public class Master {
//喂宠物
public void feed( Pet pet) {
//宠物卖萌
pet.sellMeng();
}
}
package com.wkcto.chapter01.abstracttest.demo02;
/**
* 测试主人喂宠物,宠物就卖萌
* @author 蛙课网
*
*/
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);
}
}
练习:
愤怒的小鸟, 红火(红颜色的鸟)可以正常飞行 , 蓝冰(蓝颜色的鸟)可以一个变三个, 黄风(黄颜色的鸟)可以加速飞行, 定义一个弹弓类,有一个弹射的方法 ,可以把鸟给射出去, 鸟在飞。