抽象类概念:
在面向对象的概念中,所有的对象都是通过类来描述的,但反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描述一个具体的对象,这样的类就是抽象类。比如:
说明:
1、矩形、圆形、三角形都是图形,因此和Shape类是继承关系
2、虽然图形类Shape中也有draw()方法,但由于Shape类并不是具体的图形,因此其内部的draw()方法实际上是没有办法实现的
3、由于Shape类没有办法描述一个具体的图形,导致其draw()方法无法具体实现,因此可以将Shape类设计为“抽象类”
在打印图形的例子中,父类Shape中的draw()方法并没有实际工作,主要的绘制图形都是由Shape的各种子类的draw()方法来完成的,像这种没有实际工作的方法,我们可以把它设计成一个抽象方法(absteact method),包含抽象方法的类,我们称为抽象类(abstract class)
抽象类语法:
在Java中,一个被abstract修饰的类称为抽象类,抽象类中被abstract修饰的方法称为抽象方法。抽象方法不用给出具体的实现,代码如下:
//抽象类:被abstract修饰的类
public abstract class Shape {
//普通属性
private int x;
//构造方法
public Shape(int x) {
this.x = x;
}
//普通方法
public void setX(int x) {
this.x = x;
}
//抽象方法
abstract public void draw();
}
如果一个方法已经确定是抽象方法,那么它绝不能再有方法体,即不能出现大括号,而是只需要在()后面添加一个分号即可,否则idea会提示报错信息,如下图所示 :
面试题:java语言中凡是没有方法体的方法都是抽象方法吗?
不对,Object类中有很多方法都没有方法体,都是以 ; 结尾的,但是他们都不是抽象方法
抽象类的特性:
1、抽象类也是类,内部可以包含普通方法、属性以及构造方法
2、抽象类不能直接实例化对象
3、抽象方法不能是private修饰的
4、抽象方法不能被final和static修饰,因为抽象方法要被子类重写
5、抽象类必须被继承,并且继承后子类要重写父类中的抽象方法,否则子类也是抽象类,必须用abstract修饰
6、抽象类中不一定包含抽象方法,但是有抽象方法的类一定是抽象类
抽象类的作用(与普通类的区分)
抽象类本身不能被实例化,要想使用,只能创建该抽象类的子类,然后让子类重写抽象类中的抽象方法。
抽象类与普通类的区别就在于使用抽象类就相当于多了一层编译器的校验,使用抽象类的场景就如打印图形的例子,实际打印工作不应该由父类完成,而应由子类完成,此时如果不小心误用父类,使用普通类编译器不会报错,如果父类是抽象类,就会在实例化的时候提示错误,让我们尽早发现问题。
tips:许多语法存在的意义都是为了“防止出错”,例如final关键字,不想让创建的变量被改动,加上final能够在不小心误改的时候,让编译器及时提醒我们。
充分利用编译器的校验,在实际开发中是非常有意义的。