为啥要学习抽象类,因为实现多态有很多方式,内核为继承,而与继承相关的有:
- 基于继承——普通的子类和父类
- 基于继承——抽象类
- 基于继承——接口
一、什么是抽象方法
了解抽象类之前先了解抽象方法
1.定义:
在Java语言中,用abstract关键字修饰的方法为抽象方法。抽象方法必须要被继承,由于一个父类有很多字类,每个子类对父类的同一个抽象方法给出了不同的实现过程,这样就会出现同一个名称、同一种类型的返回值的方法在不同的子类中实现的方法体不同的情况,这正是多态性的体现。
2.格式:
abstract 返回类型 抽象方法名([参数列表]);
例如:
public abstract void study();
3.使用时需要注意的点:
- 没有方法体
- 只有方法头
- 直接以"
;
"结束 - 父类中定义的抽象方法要在子类中重写,所以不能用private或static修饰
- 抽象方法必须被继承,
abstract
不能与final
一起使用 - 子类中重写的构造方法的方法名、返回值、参数类型要与父类的抽象方法完全相同
- 一个类的构造方法不能声明成抽象的(因为构造方法不能被继承)
二、什么是抽象类
某些类在现实世界中不能找到对应的实例,如车,现实中只有汽车,自行车这些车的子类,而不是车的实例,这样的类为抽象类。
1.格式:
abstract class 抽象类名{}
2.使用时需要注意的点:
abstract
只能修饰类和方法,不能用来修饰成员变量和局部变量- 类中包含抽象方法,则该类必须要定义为抽象类
- 抽象类不一定要包含抽象方法
- 抽象类必须要被继承,所以不能用
final
修饰 - 抽象类可包含成员变量、方法(普通方法或抽象方法)、构造方法、初始化块、内部类5个部分
- 抽象类的构造方法不能用于创建实例,主要用于被其子类调用,不能使用new关键字实例化,不能有这样的语句:
A a = new A();
3.举例:
求圆形的面积周长和颜色
//先定义一个抽象类
abstract class Shape {
private String color;//定义颜色
public abstract double area();//求面积的抽象方法
public abstract double perimeter();//求周长的抽象方法
public Shape() {
}
public Shape(String color) {
this.color = color;
}
public String getColor() {
return color;
}
}
//圆类继承抽象方法形状类
class Circle extends Shape {
private double r;
public Circle(String color, double r) {
super(color); //调用父类的颜色方法
this.r = r;
}
/**
* @return 抽象方法要被继承
*/
@Override
public double area() {
return 3.14 * r * r;
}
/**
* @return 抽象方法要被继承
*/
@Override
public double perimeter() {
return 2*3.14*r;
}
}
class Scratch {
public static void main(String[] args) {
Circle circle = new Circle("pink",2);
System.out.println(circle);
System.out.print(",面积为"+circle.area());
System.out.print(",颜色为"+circle.getColor());
System.out.print(",周长为"+circle.perimeter());
}
}
输出结果为:
Circle@29453f44
,面积为12.56,颜色为pink,周长为12.56
由于一个抽象类可能有多个子类,因此抽象类的引用可以在某个时间内指向不同子类的对象,这样抽象类的引用就是一种多形态的引用。这个引用在调用子类中被重写的方法时会根据该引用当前所指向对象类型的不同而调用不同子类中相应的方法,这就是抽象类引起的多态。
4.定义:
抽象类是将多个具体类的共同特征抽象出来的父类,以抽象类作为模板,既能让子类在抽象类的基础上进行扩展和改造,又可以避免子类的随意性。利用抽象类和抽象方法,程序可以更加灵活。