什么是抽象类:
我们知道,类用来模拟现实的事物,一个类模拟一类事物,某个类的一个实例化对象可以模拟某个属于该类的具体事物。类中描绘了该类所有对象的共同的特性,当一个类中给出的信息足够全面时候,我们就可以实例化该类。但是,当一个类中给出的信息不够全面时,比如无法确定行为,它给出的信息不足以描绘出一个具体的对象,这时我们往往不会实例化该类,这种类就是抽象类。例如,对于Animal类,所有动物都有吃喝的行为,定义eat可以描述吃这一行为,但每种动吃的都不一样,因此,一个eat方法并不能准确的描述吃什么。这时,Animal给出的信息就不足够描述一个对象,我们就不能去实例化Animal类。
在Java中,我们通过在类前面添加关键字abstract(抽象的)来定义抽象类。如:
public abstract class Animal {//Animal类此时就是一个抽象类。
}class Dog extends Animal {//Dog类继承了Animal类,是Animal类的子类。
}
抽象类的定义:
-
抽象方法
1.我们将“只有方法声明,没有方法体”的一类方法统称为抽象方法,抽象方法用关键字abstract修饰。需要注意的是,如果一个方法已经确定是抽象方法,那么它绝不能再有方法体,即不能出现大括号,而是只需要在()后面添加一个分号即可,否则IDEA会提示报错信息,如下图所示 :
错误的:
正确的:
2.如果一个类中已经出现了抽象方法,那么,这个类必须定义成抽象类。如:
总结:因此,有抽象方法的一定是抽象类,但是抽象类不一定有抽象方法。
3.应用:
当父类需要定义一个方法,却不能明确方法的具体细节时,可以将该方法定义为abstract,具体实现细节延时到子类。
我以Shape类,Circle类举例,代码如下:
package 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.代码演示
// 定义一个抽象类
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();}
}
好了,抽象类内容暂时就这些,拜拜各位。