什么是抽象类:
我们知道,类用来模拟现实的事物,一个类模拟一类事物,某个类的一个实例化对象可以模拟某个属于该类的具体事物。类中描绘了该类所有对象的共同的特性,当一个类中给出的信息足够全面时候,我们就可以实例化该类。 但是,**当一个类中给出的信息不够全面时,比如无法确定行为,它给出的信息不足以描绘出一个具体的对象,这时我们往往不会实例化该类,这种类就是抽象类。**例如,对于Animal类,所有动物都有吃喝的行为,定义eat可以描述吃这一行为,但每种动吃的都不一样,因此,一个eat方法并不能准确的描述吃什么。这时,Animal给出的信息就不足够描述一个对象,我们就不能去实例化Animal类。
在Java中,我们通过在类前面添加关键字abstract(抽象的)来定义抽象类。如:
java
public abstract class Animal {
//Animal类此时就是一个抽象类。
}
class Dog extends Animal {
//Dog类继承了Animal类,是Animal类的子类。
}
抽象类的定义:
抽象方法
1.我们将"只有方法声明,没有方法体"的一类方法统称为抽象方法 ,抽象方法用关键字abstract修饰。需要注意的是,如果一个方法已经确定是抽象方法,那么它绝不能再有方法体,即不能出现大括号,而是只需要在()后面添加一个分号即可,否则IDEA会提示报错信息,如下图所示 :
错误的:
正确的:
2.如果一个类中已经出现了抽象方法,那么,这个类必须定义成抽象类。如:
总结:因此,有抽象方法的一定是抽象类,但是抽象类不一定有抽象方法。
3.应用:
当父类需要定义一个方法,却不能明确方法的具体细节时,可以将该方法定义为abstract,具体实现细节延时到子类。
我以Shape类,Circle类举例,代码如下:
javapackage Test; public abstract class Shape {//应添加abstract // 抽象方法,用于计算图形的面积 public abstract double calculateArea(); } // 子类继承抽象类,并实现抽象方法 class Circle extends Shape { private double radius; public Circle(double radius) { this.radius = radius; } // 实现抽象方法,计算圆的面积 public double calculateArea() { return Math.PI * radius * radius; } }
4.特点:
- 如果父类定义了一个抽象方法,要求其所有的非抽象子类都必须重写该抽象方法,否则idea会报错。
- 抽象方法不能再使用private,final,static关键字来修饰。这是因为定义抽象方法的目的就是想将方法的具体实现延迟到子类,最终是要被子类重写的,而private,final,static这几个关键字都和"方法重写"的目的背道而驰。
抽象类的特点:
1.抽象类不能被实例化,只能创建其子类对象:
即,我们不能创建抽象类对象(这里的对象指的是堆空间中的真正的对象,即不能new抽象类。
2.抽象类子类的两个选择:
即:要么实现父类的所有的抽象方法,要么子类本身也定义成抽象类。
抽象类的成员:
1.成员变量
抽象类既可以有静态的 成员变量 ,也可以有非静态的成员变量 。
既可以有静态的 成员常量 ,也可以有非静态的 成员常量 。
2.成员方法
抽象类既可以有(非私有的)抽象方法(注意抽象方法一定是非私有非静态非final,因为abstract关键字与private关键字,static关键字,final关键字不能同时存在);
也可以有非抽象方法 (非抽象方法就可以用private,final和static关键字来修饰了,具体使用时,根据实际需求合理应用)。
3.构造器
抽象类可以和非抽象类一样拥有构造器,并且支持构造器的重载。
4.总结
抽象类中的成员只比非抽象类多一种------抽象方法。其他都和非抽象类一样。
5.代码演示
java
// 定义一个抽象类
abstract class Shape {
// 抽象方法,用于计算图形的面积
public abstract double calculateArea();
// 具体方法,用于打印图形的信息
public void printInfo() {
System.out.println("这是一个" + getShapeName() + ",面积为:" + calculateArea());
}
// 具体方法,用于获取图形的名称
public abstract String getShapeName();
}
// 子类继承抽象类,并实现抽象方法
class Circle extends Shape {
private double radius;
public Circle(double radius) {
this.radius = radius;
}
// 实现抽象方法,计算圆的面积
public double calculateArea() {
return Math.PI * radius * radius;
}
// 重写具体方法,返回圆的名称
public String getShapeName() {
return "圆";
}
}
class Rectangle extends Shape {
private double width;
private double height;
public Rectangle(double width, double height) {
this.width = width;
this.height = height;
}
// 实现抽象方法,计算矩形的面积
public double calculateArea() {
return width * height;
}
// 重写具体方法,返回矩形的名称
public String getShapeName() {
return "矩形";
}
}
public class Main {
public static void main(String[] args) {
Circle circle = new Circle(3.0);
Rectangle rectangle = new Rectangle(4.0, 5.0);
circle.printInfo();
rectangle.printInfo();
}
}
好了,抽象类内容暂时就这些,拜拜各位。