Java——抽象类和抽象方法

  抽象方法和抽象类必须使用 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 也不能用于修饰构造器,没有抽象构造器,抽象类里面定义的构造器只能是普通构造器。

原文地址:https://www.cnblogs.com/szj-ang/p/7295409.html