对于面向对象编程来说,抽象是它的一大特征之一。在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类。这两者有太多相似的地方,又有太多不同的地方。很多人在初学的时候会以为它们可以随意互换使用,但是实际则不然。今天我们就一起来学习一下Java中的抽象类
1、抽象类(abstract class):使用了abstract关键字所修饰的类叫做抽象类。抽象类无法实例化,也就是说,不能new出来一个抽象类的对象(实例)。
2、抽象方法(abstract method):使用abstract关键字所修饰的方法叫做抽象方法。抽象方法需要定义在抽象类中。相对于抽象方法,之前所定义的方法叫做具体方法(有声明,有实现)。
3、如果一个类包含了抽象方法,那么这个类一定是抽象类。
4、如果某个类是抽象类,那么该类可以包含具体方法(有声明,有实现)。
5、如果一个类中包含了抽象方法,那么这个类一定要声明成abstract class,也就是说,该类一定是抽象类;反之,如果某个类是抽象类,那么该类可以包含抽象方法,也可以包含具体方法。
6、无论何种情况,只要一个类是抽象类,那么这个类就无法实例化。
7、在子类继承父类(父类是个抽象类)的情况下,那么该子类必须实现该父类中所定义的所有抽象方法,否则,该子类需要声明一个abstract class。
如图:
解决办法:实现T(父类)中所有抽象方法或者R是抽象类(不能实例化)
文字解说太枯燥,下面举个生活中的案例
public class Test {
public static void main(String[] args) {
Shape shape=new Triangle(10,6);
int area=shape.computeArea();
System.out.println("三角形的面积"+area);
shape=new Rectangle(10,10);
area=shape.computeArea();
System.out.println("矩形面积"+area);
}
}
abstract class Shape{
public abstract int computeArea();//计算形状面积
}
//三角形
class Triangle extends Shape{
int width;
int height;
public Triangle(int width,int height){//构造方法主要是完成初始化的操作
this.width=width;
this.height=height;
}
public int computeArea(){
return (width*height)/2;
}
}
//矩形
class Rectangle extends Shape{
int width;
int height;
public Rectangle(int width,int height){//构造方法主要是完成初始化的操作
this.width=width;
this.height=height;
}
public int computeArea(){
return width*height;
}
}
结果:
三角形的面积30
矩形面积100
8、一个类不能既是final,又是abstract的。因为abstract的主要目的是定义一种约定,让子类去实现这种约定,而final表示该类不能被继承,这样abstract希望该类可以被继承而final明确说明该类不能被继承,两者矛盾。因此一个类不能既是final的,又是abstract的。
如图: