前面类的基本概念和内部类的基本概念都已经说过了(java面向对象(四)——内部类)现在我们来讲一下一个特殊的类——抽象类。
抽象类
当编写一个类的时候通常会为该类定义一些方法,用来描述类的行为方式,在普通类中这些方法有具体的方法体,但是在某些情况下父类只知道子类应该保安和你的方法而无法提供具体实现并且对于不同子类实现的方式不同,因此只能在子类中对方法进行具体的定义。
例如:Shape类中有周长的计算方法calPerimeter()方法,但是其子类Circl类和Rectangle()等计算周长的方式不同,只能在具体子类中进行定义。为实现无需实现但是父类中也含有的方法,我们对方法进行抽象。抽象方法只有方法名但是没有方法的实现方法。抽象方法需要在抽象类中,但是抽象类中不一定需要抽象方法即含有抽象方法只能被定义为抽象类
1)抽象类和抽象方法需要abstract修饰符来修饰,抽象方法没有方法体
2)抽象类不可以被实例化,无法使用new来调用抽象类的构造器创建抽象类的实例,主要是被其子类调用
3)抽象类可以包含成员变量,方法(普通和抽象都可以),构造器,初始化块,内部类(接口,枚举)五种成分
例如
public abstract class Shape{
//初始化块
{
System.out.println("执行Shape的初始化块");
}
private String color;
//定义计算周长的抽象方法
public abstract double calPerimeter();
//定义Shape构造器但是不是用来创建Shape对象的,仅仅是被子类调用
public Shape(){ }
public Shape(Sring color){
System.out.println("执行Shape构造器");
this.color=color;
}
public void setColor(String color){
this.color=color;
}
public String getColor(String color){
return color;
}
}
public class Triangle extends Shape{
//定义三角形的三条边
private double a;
private double b;
private double c;
public Triangle(String color,double a,double b,double c){
super(color);
this.setSides(a,b,c);
}
public void setSide(double a,double b,double c){
if(a>=b+c||b>=a+c||c>=a+b){
System.out.println("三角形两边之和需要大于第三边");
return;
}
this.a=a;
this.b=b;
this.c=c;
}
//重写父类Shape类的计算周长抽象方法
public double calPerimeter(){
return a+b+c;
}
public static void mian(String[] args){
Shape s1=new Triangle("黑色",3,4,5);
Syste.out.println(s1.calPerimeter());
}
}
Triangle类继承了Shape抽象类并且实现了抽象方法calPerimeter(),是一个普通类,可以让一个Shape类型引用变量指向Triangle对象,体现了多态性,不许强制转换类型为子类型。
使用abstract修饰类的时候,说明这个类被继承,修饰方法的时候表面这个方法须由子类提供实现(重写)。另一个修饰符final修饰的类不可以被继承,修饰的方法也不能被重写。final和abstract不可以同时使用。static修饰方法,则方法属于类本身因此可以通过调用类来调用该方法,但是abstract修饰则不可以直接调用需要进行重写才可以调用。static和abstract在方法上互斥但是在内部类上可以共存。
作用
抽象类是具体类中抽象出来的父类,具有更高的抽象层次,使用它为子类模板避免子类设计的冗余性和随意性。子类在抽象类的基础上进行扩展,改造,但是大致保留父类的行为方法。