抽象方法和抽象类
1.规则
*抽象方法和抽象类必须用abstract进行修饰,有抽象方法的类只能被定义为抽象类,抽象类中可以没有抽象方法
*抽象类不能被实例化,无法使用new调用抽象类的构造器创建抽象类的实例(无法创建实例)
*抽象类中可以包含成员变量,方法,构造器,初始化块,内部类(接口,枚举)五种成分,抽象类的构造器不能用于创建实例,主要用来被子类进行调用
*含抽象方法的类,或者继承了一个抽象父类,但是没有完全实现父类包含的抽象方法,或者实现一个接口,却没有完全实现接口包含的抽象方法的类,只能被定义为抽象类
举个栗子:
/**
* 建立抽象类Shape
*/
public abstract class Shape {
{
System.out.println("执行Shape的初始化块");
}
private String color;
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
//定义方法计算周长
public abstract double calcPermeter();
//返回形状
public abstract String getType();
//定义构造器 被子类使用
public Shape() {
}
public Shape(String color) {
System.out.println("执行Shape的构造器....");
this.color = 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);
}
@Override
public double calcPermeter() {
return a+b+c;
}
@Override
public String getType() {
return "三角形";
}
public void setSides(double a,double b,double c){
if(a>=b+c||b>=a+c||c>=a+b){
System.out.println("error shape");
return;
}
this.a=a;
this.b=b;
this.c=c;
}
}
public class Client {
public static void main(String[]args){
Shape t1=new Triangle("red",3,4,5);
System.out.println(t1.calcPermeter());
System.out.println(t1.getType());
}
}
Shape:抽象类
Triangle:实体类
Client:main
2.如何使用abstract
static和abstract不能同时修饰某个方法,但是可以修饰某个内部类
abstract必须被子类重写才有意义,否则,这个方法将不会有方法体,所以private和abstract不能共用
3.抽象类的作用
抽象类不能创建实例,只能当做父类被继承,通过抽象类可以定义多个子类的通用模板,子类在抽象类的基础上进行拓展改造,但是子类总体上会保留抽象类的行为方式