文章目录
- 【Java语言基础】抽象类与抽象方法
- 抽象方法
- 抽象类
- 使用注意
- 抽象类的作用
- 实例应用:
【Java语言基础】抽象类与抽象方法
我们创建一个面积类,并且在这个类中创建面积对象,但是当你提到面积类,你并不知道我说的是求什么图形的面积,只有看到了具体的图形,你才知道这是什么图形,所以说面积本身并不是一个具体的事物,而是一个抽象的事物。只有真正的长方形,圆形才能具体的求出面积,同理我们也可以求出不同的面积,他们的面积公式应该是不一样的,所以我们不应该在面积类中给出具体的公式,而是给出一个声明即可。
抽象方法
Java中,这种没有方法体的方法称为抽象方法。
抽象方法声明格式:
[修饰符] abstract 返回值类型 方法名([形参]);
抽象方法的特点
- 抽象方法的返回值类型前有关键字
abstract
; - 抽象方法没有方法体;
- 抽象方法的定义是一行单独语句,以分号结束;
- 在抽象方法声明中使用
static
修饰符是错误的。
例如:
public abstract double area();
抽象类
类中如果定义了抽象方法,那么这个类必须定义为抽象类。
抽象类声明格式:
[public] abstract class 类名{
//类体(属性,非抽象方法,抽象方法,构造方法)
//类体(初始化块,内部类,枚举类)
}
重要!
- 抽象类不能创建自己的对象,使用
new
创建抽象类对象将产生错误。 - 子类继承抽象类时,应该覆盖抽象类中的所有抽象方法,否则子类也必须定义为抽象类。
- 含有抽象方法的类(包括直接定义了一个抽象方法;继承了一个抽象父类,但没有完全实现父类包含的抽象方法)只能被定义成抽象类。但抽象类中却并不一定要包含抽象方法。
- 抽象方法和空方法体的方法不是同一个概念!
//是一个抽象方法,它根本没有方法体,即方法定义后面没有一对花括号。
//抽象方法:
public abstract double test();
//一个普通方法,定义了方法体,只是方法体为空,因此这个方法不可以使用abstract来修饰。
//空方法体:
public void test(){}
使用注意
注意!
final
和abstract
永远不能同时使用。abstract
不能用于修饰属性,不能用于修饰局部变量,既没有抽象变量,也没有抽象属性等说法;abstract
也不能用于修饰构造方法,没有抽象构造方法。抽象类里定义的构造方法只能是普通构造方法。static
和abstract
不能同时修饰某个方法,即没有所谓的类抽象方法。abstract
关键字修饰的方法必须被其子类重写才有意义,否则这个方法将永远不会有方法体,因此abstract
方法不能定有为private
访问权限。
抽象类的作用
- 代码重用:子类可以重写抽象父类中的属性和非抽象方法;
- 规划:抽象类中通过定义抽象方法规划了其所有子类必须要实现的功能,或者说指定了其子类对象与外界的交互界面,因为抽象方法的方法头部已经规定了该方法将来被子类对象调用的格式。
模板模式:
- 模板模式:抽象类作为多个子类的通用模板,子类在抽象类的基础上扩展,改造,但子类总体上会保留抽象类的行为方式。
- 抽象类不能实例化,但是抽象类可作为变量的类型和方法形参类型,可将抽象类子类的对象赋给该变量或做方法的实参。
实例应用:
package javanotes;
public class TestShape {
public static void main(String[] args) {
AbstractShape rect1 = new Rect(5,5);
double a = rect1.calArea();
System.out.println("长方形面积为:" + a);
AbstractShape circle1 = new Circle(1);
double b = circle1.calArea();
System.out.println("圆形面积为:" + b);
}
}
abstract class AbstractShape{
public abstract double calArea();
}
class Rect extends AbstractShape{
private double length;
private double width;
public Rect(double length,double width) {
this.length = length;
this.width = width;
}
@Override
public double calArea() {
return this.length * this.width;
}
}
class Circle extends AbstractShape{
private double radius;
final double n = 3.14;
public Circle(double radius) {
this.radius = radius;
}
@Override
public double calArea() {
return this.radius * this.radius * this.n;
}
}