抽象类
抽象类的意义:
作为子类的模板,避免子类设计的随意性。
定义一个 抽象的父类 形状
package cn.zack.six.shape;
import lombok.Data;
/**
* @author: 戴志超
* @date: 2021/4/5 下午3:17
*/
@Data
public abstract class Shape {
{
System.out.println("执行shape的初始化块");
}
private String color;
public abstract double calPerimeter();
public abstract String getType();
public Shape() {
}
public Shape(String color) {
System.out.println("执行shape的构造器");
this.color = color;
}
}
定义 三角形 都包含了 父类的颜色属性,父类的计算周长方法等
package cn.zack.six.shape;
import lombok.Data;
/**
* @author: 戴志超
* @date: 2021/4/5 下午3:10
*/
@Data
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.setSide(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;
}
@Override
public double calPerimeter() {
return a + b + c;
}
@Override
public String getType() {
return getColor()+ "三角形";
}
}
定义 圆形
package cn.zack.six.shape;
import lombok.Data;
/**
* @author: 戴志超
* @date: 2021/4/5 下午3:10
*/
@Data
public class Circle extends Shape {
private double radius;
public Circle(String color, double radius) {
super(color);
this.setRadius(radius);
}
public void setRadius(double a, double b, double c) {
this.radius = radius;
}
@Override
public double calPerimeter() {
return 2 * Math.PI * radius;
}
@Override
public String getType() {
return getColor() + "圆";
}
public static void main(String[] args) {
Shape t = new Triangle("black", 3, 4, 5);
Shape c = new Circle("red", 3);
System.out.println(t.getType());
System.out.println(t.calPerimeter());
System.out.println(c.getType());
System.out.println(c.calPerimeter());
}
}
注意
当使用abstract修饰类表示此类只能被继承,修饰方法时,表示此方法只能被子类重写,而final修饰的类不能被继承,修饰的方法不能被重写,所以abstract和final永远不能同时使用。
- abstract不能修饰成员变量,不能修饰局部变量,即没有抽象变量、抽象成员变量等说法
- abstract也不能修饰构造器,抽象类里的构造器只能是普通的构造器
- static和abstract并不是绝对互斥的,虽然不能同时修饰某个方法,但可以同时修饰内部类。