抽象类
当我们编写一个类时,常常会在该类中定义一些方法,这些方法通常情况下是具体的,但在某些情况下,我们无法准确的知道这些方法的细节,这时候就需要我们创建一个抽象类,这些方法就是抽象方法。抽象类一般指父类,专门用来让子类继承,抽象方法必须被子类重写。我们通过添加abstract关键字来使该类变成抽象类,同样添加abstract关键字使方法变成抽象方法。
注意:
一个抽象类中可以不定义抽象方法,但是只要类中有一个抽象方法,则该类一定是抽象类。
抽象类不能被实例化。
如果一个子类继承一个抽象类,则子类需要通过覆盖的方式来重写抽象类中的所有抽象方法。如果子类没有完全重写抽象父类中所有方法,则子类仍是抽象的。
抽象方法可以与public,protected复合使用,但不能与final,private和static使用。
abstract不能用于修饰属性,修饰局部变量,也不能用于修饰构造器。
实例:要求计算图形三角形,圆形,矩形的面积,要求定义一个抽象的图形类,并定义三角形,矩形,圆形这三个子类继承其抽象的图形类,代码如下:
创建图形的抽象父类Shpae
package com.section4;
public abstract class Shape {
private String color;
public abstract double calcPerimenter();
public abstract String getType();
public Shape(String color) {
this.color = color;
System.out.println("---执行了Shape类的构造方法---");
}
public String setColor() {
return this.color = color;
}
public String getColor() {
return color;
}
}
创建三角形类(Tirangle),且继承父类
package com.section4;
public class Triangle extends Shape {
private double x;
private double y;
public Triangle(String color, double x, double y) {
super(color);
this.setSide(x, y);
}
private void setSide(double x, double y) {
this.x = x;
this.y = y;
}
public double calcPerimenter() {
return (x * y) / 2;
}
public String getType() {
return "三角形";
}
}
创建圆形类(Circle),且继承父类
package com.section4;
public class Circle extends Shape {
private double r;
public Circle(String color, double r) {
super(color);
this.r = r;
}
public double calcPerimenter() {
return 2 * Math.PI * (r * r);
}
public String getType() {
return "圆形";
}
public double getR() {
return r;
}
public void setR(double r) {
this.r = r;
}
}
创建矩形类(Rectangle),且继承父类
package com.section4;
public class Rectangle extends Shape {
public double a;
public double b;
public Rectangle(String color, double a, double b) {
super(color);
this.a = a;
this.b = b;
}
public double calcPerimenter() {
return a * b;
}
public String getType() {
return "矩形";
}
}
package com.section4;
public class Test {
public static void main(String[] args) {
Triangle tr = new Triangle(null, 2, 2);
Rectangle re = new Rectangle(null, 2, 3);
Circle ci = new Circle(null, 4);
System.out.println(tr.getType() + "面积=" + tr.calcPerimenter());
System.out.println(re.getType() + "面积=" + re.calcPerimenter());
System.out.println(ci.getType() + "面积=" + ci.calcPerimenter());
}
}
运行结果如下: