抽象类

文章目录

  • 概述
  • 使用
  • 限制
  • 作用

概述

什么是抽象类?

在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象 ,这样的类就是抽象类。

  • 其中可以直接描绘对象的类也就是普通类 ,普通类可以直接实例化对象,拥有成员变量和成员函数
  • 其中不可以直接描绘对象的类就是抽象类,抽象类不能直接实例化对象

什么是抽象方法?

抽象方法是被abstract修饰的没有方法体的方法,这个方法必须被子类重写,抽象方法定义了一种接口的范式

  • 由abstract修饰
  • 没有方法体
  • 由子类重写

示例:

public abstract class Shape {// 抽象类
    abstract public double getArea();// 抽象方法
}

拥有抽象方法的类就是抽象类,抽象类必须被abstract关键字修饰.

使用

我们先来看一个代码

abstract class Shape {// 抽象类
    abstract public double getArea();// 抽象方法
}

public class Test{
    public static void main(String[] args) {
        Shape shape = new Shape();
    }
}

运行结果:

/Users/yinger/Desktop/OS/Code/src/Test.java:7:23
java: Shape是抽象的; 无法实例化

从这个程序,我们可以看出抽象类无法直接实例化对象.由于抽象类中存在抽象方法,抽象方法没有方法体,无法被调用,创建抽象类更是无从谈起.

抽象类的使用:

  • 抽象方法必须为public或者protected,缺省情况下默认为public;
    • 由于抽象方法要被子类重写,所以访问控制权限至少是protected
  • 抽象类不能直接实例化,需要和多态配合使用
    • 子类重写抽象类抽象方法,进而创建对象,使用抽象方法
  • 抽象类必须有子类,使用extends继承,一个子类只能继承一个抽象类
    • 抽象类本身就不可以实例化对象,如果不被子类重写,那么就没有存在的以医疗
  • 如果子类不是抽象类则必须覆写抽象类之中的全部抽象方法
    • 如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类,因为子类中含有没有重写的抽象方法

我们来看一个正确的示例:

abstract class Shape {// 抽象类

    abstract public double getArea();// 抽象方法
}

public class Rectangle extends Shape {
    private double w;
    private double l;

    public Rectangle(double w, double l) {
        this.w = w;
        this.l = l;
    }

    @Override
    public double getArea() {
        return w * l;
    }

    public static void main(String[] args) {
        Rectangle rectangle = new Rectangle(2, 4);
        System.out.println(rectangle.getArea());
    }
}

总结:

  • 继承抽象类的子类会被要求重写抽象方法,子类可以选择是否重写
    • 如果重写所有抽象方法,就可以直接使用这个子类实例化对象
    • 如果不重写或者重写一部分,那么这个类还是抽象类,必须使用abstract修饰
  • 抽象类就是一种模板范式,进行了更高层次的抽象,其它部分和普通类相似
  • 抽象类使用的场景下一定会发生多态,重写
    (2)抽象类实际上就比普通类多了一些抽象方法而已,其他组成部分和普通类完全一样;
    (3)普通类对象可以直接实例化,但抽象类的对象必须经过向上转型之后才可以得到。

限制

抽象类中有构造方法么?

抽象类也是类,也存在成员变量,和普通成员方法,子类在构造之前也是需要先对父类(抽象类)进行构造的,所以抽象类中一定是由构造方法的.

抽象类可以用final private声明么?

不能,由于抽象类必须被继承

  • final修饰的类无法被继承
  • private修饰的类无法被继承

作用

抽象类本身不能被实例化, 要想使用, 只能创建该抽象类的子类. 然后让子类重写抽象类中的抽象方法.有人就会说了,使用普通类也可以被继承,方法也可以被重写,为啥非得用抽象类呢?

因为抽象类是一种语法,编译器可以进行校验,强制进行代码检查,抽象类中的抽象方法要么给我重写了,要么子类是一个抽象类.将这种 思想抽象成语法就可以预防出错,毕竟靠人工检查总会有出错的时候.

本小节就介绍到这里.

你可能感兴趣的:(JavaSE,java,开发语言)