Java基础--- 抽象方法和类 Abstract Methods and Class

抽象方法 — Abstract Method

  • 抽象方法只有方法声明没有具体实现,具体是现实是由子类提供
  • • 抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法)
    在这里插入图片描述

抽象类 — Abstract Class

  • 用abstract修饰的类叫做抽象类,抽象类不能被实例化,即不能通过new生成一个抽象类的对象, 作用是为某类定义通用方法。
  • 可以有抽象方法也可以有正常方法
  • 构造方法必须声明为Protected(因为要供子类使用)
  • 构造方法可以被private修饰,如果当前类只有一个构造方法且被private修饰,那么其它类是无法创建当前类的对象并且当前类也是不能被继承的(因为子类在实例化时需要调用父类的构造方法)
  • 子类(如果不是抽象类)则必须覆写抽象类之中的全部抽象方法(如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类)
  • 当一个类有抽象方法时,这个类必须为抽象类
  • 一个类可以是抽象类即使它的父类不是抽象类
  • 一个类可以被声明为抽象类即使没有任何抽象方法, 这样的类一般被用于子类的基类

抽象类GeometricObject

 abstract class GeometricObject {
    private String color = "white";
    private boolean filled;
    private java.util.Date dateCreated;

    //无参构造函数
    protected GeometricObject(){
        dateCreated = new java.util.Date();
    }

    protected GeometricObject(String color, boolean filled){
        dateCreated = new java.util.Date();
        this.color = color;
        this.filled = filled;
    }

    public String getColor(){
        return color;
    }

    public void setColor(String color){
        this.color = color;
    }

    public boolean isFilled(){
        return filled;
    }

    public void setFilled(boolean filled){
        this.filled = filled;
    }

    public java.util.Date getDateCreated(){
        return dateCreated;
    }

    @Override
    public String toString(){
        return "created on " + dateCreated + "\ncolor: " + color +
                " and filled: " + filled+" ";
    }

    //两个抽象方法
    public abstract double getArea();
    public abstract double getPerimeter();
}//GeometricObject类结束

抽象类的子类Triangle的实现

class Triangle extends GeometricObject{
    private double side1;
    private double side2;
    private double side3;

    //三个构造函数
    public Triangle(double side1, double side2, double side3) {
        this.side1 = side1;
        this.side2 = side2;
        this.side3 = side3;
    }

    public Triangle(String color, boolean filled, double side1, double side2, double side3) {
        super(color, filled);
        this.side1 = side1;
        this.side2 = side2;
        this.side3 = side3;
    }

    public Triangle() {
    }

    //一定要重写实现抽象父类中的抽象方法
    @Override
    public double getArea() {
        double s = (side1 + side2 + side3)/2;
        return Math.sqrt(s*(s-side1)*(s-side2)*(s-side3));
    }

    @Override
    public double getPerimeter() {

        return side1+side2+side3;
    }

    @Override
    public String toString() {
        return "Triangle{" +
                super.toString()+
                ",side1=" + side1 +
                ", side2=" + side2 +
                ", side3=" + side3 +
                ",Area = " + getArea()+
                ",Perimeter =  " + getPerimeter()+
                '}';
    }

关于抽象类不能被实列化(使用new operator)

GeometricObject object = new GrometricObject()
  • 上面代码会报错
GeometricObject [] objects = new GeometricObject[10]
object[0] = new Circle();
  • 上面代码不会报错

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值