定义一个类时,常常需要定义一些成员方法用于描述类的行为特征,但有时这些方法的实现方式是无法确定的。例如,Animal类中的shout()方法用于描述动物的叫声,但是不同的动物,叫声也不相同,因此在shout()方法中无法准确描述动物的叫声。
针对上面描述的情况,Java提供了抽象方法来满足这种需求。抽象方法是使用abstract关键字修饰的成员方法,抽象方法在定义时不需要实现方法体。抽象方法的语法格式如下。
public abstract 返回值类型 方法名称(参数); //抽象方法,无方法体
当一个类包含了抽象方法,该类就是抽象类。抽象类和抽象方法一样,必须使用abstract关键字进行修饰。抽象类的语法格式如下。
public abstract class 抽象类名称 {
public abstract 返回值类型 抽象方法名称(参数); //抽象方法,无方法体
}
从上面抽象类的语法格式中可以发现,抽象类的定义比普通类多了一个或多个抽象方法,其他地方与普通类的组成基本相同。抽象类的定义规则如下。
(1)包含抽象方法的类必须是抽象类。
(2)声明抽象类和抽象方法时都要使用abstract关键字修饰。
(3)抽象方法只需声明而不需要实现。
(4)如果非抽象类继承了抽象类,那么该类必须实现抽象类中的全部抽象方法。
案例需求
定义抽象类动物类Animal,定义其抽象方法shout(),抽象方法用public修饰。
定义一个小猫类Cat,继承Animal抽象类,在Cat类中覆盖Cat类中的抽象方法shout(),输出“小猫喵喵叫”。
编写测试类,使用无参构造方法实现Cat类的实例化,访问shout()方法。
抽象类Animal类
public abstract class Animal {
public abstract void shout();
}
Cat类
public class Cat extends Animal{
@Override
public void shout() {
System.out.println("小猫喵喵叫");
}
}
测试类
public class TestCat {
@Test
public void test(){
Cat cat = new Cat();
cat.shout();
}
}
定义抽象类图形类Shape,定义其抽象方法getArea(),抽象方法用public修饰。
定义一个圆形类Circle,继承Shape抽象类,在Circle类中定义一个double型的表示半径的成员变量radius,成员变量用private修饰,定义成员变量的getter和setter方法;在Circle中覆盖Shape类中的抽象方法getArea()。
编写测试类,使用无参构造方法实现Circle类的实例化,访问getArea()方法。
抽象类Shape类
public abstract class Shape {
public abstract double getArea();
}
Circle类
public class Circle extends Shape{
private double radius;
public void setRadius(double radius) {
this.radius = radius;
}
public double getRadius() {
return radius;
}
@Override
public double getArea() {
return Math.PI * radius * radius;
}
}
测试类
public class TestCircle {
@Test
public void test(){
Circle c = new Circle();
c.setRadius(2);
double area = c.getArea();
System.out.println("圆的面积是:" + area);
}
}
自定义抽象类,定义其抽象方法,抽象方法用public修饰。
自定义非抽象子类,继承抽象类,覆盖抽象类中的抽象方法。
编写测试类,使用无参构造方法实现非抽象子类的实例化,访问重写方法。