再学Java -- 抽象类

抽象类

抽象类的意义:

作为子类的模板,避免子类设计的随意性。

定义一个 抽象的父类 形状

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永远不能同时使用

  1. abstract不能修饰成员变量,不能修饰局部变量,即没有抽象变量、抽象成员变量等说法
  2. abstract也不能修饰构造器,抽象类里的构造器只能是普通的构造器
  3. static和abstract并不是绝对互斥的,虽然不能同时修饰某个方法,但可以同时修饰内部类。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值