1、抽象类定义:当描述一个类的时候,如果不能确定其功能函数如何定义,那么该类就可以定义为抽象类,不能确定的功能函数要描述为抽象函数。
比如:动物叫,狗是旺旺叫,猫是喵喵叫,而羊是咩咩叫......所以在动物类里无法定义“叫”这个功能函数,所以该方法需要使用抽象方法,再在继承动物类的具体子类里根据自己的情况再去实现。
2、抽象类的特点:
(1)含有抽象函数的类一定是抽象类,但是抽象类不一定有抽象函数;
(2)抽象类不能使用new创建对象,因为创建对象,都需要使用对象的功能,而抽象类中抽象的方法没有方法体,从而不能实例化;
(3)编译器强制子类实现抽象父类中未实现的方法,也可以不实现,但是子类必须也声明为抽象类;
(4)抽象类主要是为了提高代码的复用性,让子类继承来使用;
(5)抽象类可以继承普通类与抽象类。
3、抽象类的优点:
(1)提高代码的复用性;
(2)提高代码的可扩展性,便于后期的代码维护。
4、抽象类不能创建对象,那么抽象类中是否含有构造函数?
抽象类中一定含有构造函数,主要是为了初始化抽象类中的属性,通常由子类完成初始化。
需要注意的是:abstract与final、static以及private都是不可以同时出现的。
final:它的作用就是修饰类代表不可以被继承,修饰方法代表不可以被重写。而abstract修饰的类就是用来被继承的,修饰方法就是用来被重写的。
static:修饰的方法是可以用类名调用的,但是对于abstract修饰的方法没有具体的实现,所以不可能直接调用;
private:修饰的只能在本类中使用,而abstract修饰的方法是用类被子类重写的,有矛盾,所以不能共存。
下面,而给出一个抽象类的小案例加以说明:
定义抽象类:MyShape
//定义一个抽象类 MyShape
public abstract class MyShape {
//不同的形状计算其周长和面积的公式不一样,无法确定具体的方法,所以可以定义为抽象类,
//再在具体形状的子类中实现各自的方法
abstract double getLen();
abstract double getArea();
}
定义子类:Rect
public class Rect extends MyShape {
double width;
double height;
Rect(double width, double height){
this.width = width;
this.height = height;
}
@Override
double getLen() {
return 2*(width + height);
}
@Override
double getArea() {
return width * height;
}
}
定义子类:Circle
public class Circle extends MyShape {
double r;
public static final double PI = 3.14;
Circle(double r){
this.r = r;
}
@Override
double getLen() {
return 2 * PI *r;
}
@Override
double getArea() {
return PI * r * r;
}
}
编写测试类:
public class Test {
public static void main(String[] args){
Rect rect = new Rect(6,6);
System.out.println(rect.getLen());
System.out.println(rect.getArea());
Circle circle = new Circle(6);
System.out.println(circle.getLen());
System.out.println(circle.getArea());
}
}
运行结果: