抽象方法和抽象类必须使用 abstract 修饰符来定义,有抽象方法的类只能被定义成抽象类,抽象类可以没有抽象方法。
》抽象方法和抽象类的规则如下:
》抽象类必须使用 abstract 修饰符来定义,抽象方法也必须使用 abstract 修饰符来修饰,抽象方法不能有方法体。
》抽象方法不能被实例化,实例化的工作应该交由它的子类来完成,它只需要一个引用即可。
》抽象类可以包含成员变量、方法(普通方法和抽象方法都可以)、构造器、初识化块、内部类(接口、枚举)5种成分。抽象类的构造器不能用于创建实例,主要是用于被其子类调用。
》含有抽象方法的类(包含直接定义了一个抽象方法;或继承了一个抽象父类,但没有完全实现父类包含的抽象方法;或实现了一个接口,但没有完全实现接口包含的抽象方法三种情况)只能被定义成抽象类。
》abstract 不能与 private、static 、 final 或 native 并列修饰同一个方法
》abstract 不能与 final 并列修饰一个类
》子类中的抽象方法不能与父类的抽象方法同名。
》抽象方法必须由子类来进行重写,否则没有存在的意义。
》父类
public abstract class Shape {
private String color;
//定义一个计算周长的抽象方法
public abstract double calPerimeter(); //抽象方法,不能有方法体
//定义一个返回形状的抽象方法
public abstract String getType();
//定一个Shape 的构造器,该构造武器并不是用于创建Shape 对象
//而是用于被子类调用
public Shape() {
}
public Shape(String color) {
System.out.println("执行 Shape 的构造器");
this.color=color;
}
public String getColor() {
return color;
}
public void setColor(String color) {
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);
}
public void setSides(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;
}
//重写父类方法
@Override
public double calPerimeter() {
return a+b+c;
}
@Override
public String getType() {
return "三角形";
}
}
public class Circle extends Shape {
private double radius;
public Circle(String color, double radius) {
super(color);
this.radius = radius;
}
public void setRadius(double radius){
this.radius=radius;
}
//重写父类的计算周长方法
@Override
public double calPerimeter() {
return 2* Math.PI * radius;
}
@Override
public String getType() {
return getColor() +"圆形";
}
public double getRadius() {
return radius;
}
}
》测试类
public static void main(String[] args) {
Shape s1= new Triangle("黑色",3,4,5);
Shape s2=new Circle("黄色",3);
System.out.println(s1.getType());
System.out.println(s1.calPerimeter());
System.out.println(s2.getType());
System.out.println(s2.calPerimeter());
}
注意:abstract 不能用于修饰成员变量,不能用于修饰局部变量,即没有抽象变量、没有抽象成员变量等说法;abstract 也不能用于修饰构造器,没有抽象构造器,抽象类里面定义的构造器只能是普通构造器。