【Java】一篇文章带你彻底弄明白抽象类

  1.抽象类的概念

  在面向对象的语言中,所有的对象都是通过类来描述的,但是反过来。并不是所有的类都是用来描述对象的,如果一个类并没有足够的信息来描述一个具体的对象,那么这个类就叫做抽象类。

我们先写一个关于绘制图形的抽象类来看看(不懂的可以看第二个小章节,抽象类的语法)

abstract class Draw{
     public void draw(){

     }
}
class Rect extends Draw{
    @Override
    public void draw() {
        System.out.println("矩形");
    }
}
class Circ extends Draw{
    @Override
    public void draw() {
        System.out.println("圆形");
    }
}
class Trian extends Draw{
    @Override
    public void draw() {
        System.out.println("三角形");
    }
}

【Java】一篇文章带你彻底弄明白抽象类_第1张图片

  打印图形例子中, 我们发现, 父类 Shape 中的 draw 方法好像并没有什么实际工作, 主要的绘制图形都是由 Shape的各种子类的 draw 方法来完成的. 像这种没有实际工作的方法, 我们可以把它设计成一个 抽象方法(abstractmethod), 包含抽象方法的类我们称为 抽象类(abstract class)。

2.抽象类的语法

  在Java中,一个类如果被 abstract 修饰称为抽象类,抽象类中被 abstract 修饰的方法称为抽象方法,抽象方法不用给出具体的实现体。

// 抽象类:被abstract修饰的类
public abstract class Shape {
// 抽象方法:被abstract修饰的方法,没有方法体
abstract public void draw();
abstract void calcArea();
// 抽象类也是类,也可以增加普通方法和属性
public double getArea(){
   return area;
}
  protected double area; // 面积
}

注意:抽象类也是类,内部可以包含普通方法和属性,甚至构造方法。


3.抽象类的特性

  1. 抽象类不能直接实例化对象

  2. 抽象方法不能是 private 的

3. 抽象方法不能被final和static修饰,因为抽象方法要被子类重写
4. 抽象类必须被继承,并且继承后子类要重写父类中的抽象方法,否则子类也是抽象类,必须要使用 abstract 修饰

5. 抽象类中不一定包含抽象方法,但是有抽象方法的类一定是抽象类
6. 抽象类中可以有构造方法,供子类创建对象时,初始化父类的成员变量

4.抽象类的作用

  抽象类本身不能被实例化, 要想使用, 只能创建该抽象类的子类. 然后让子类重写抽象类中的抽象方法. 虽然普通的类也可以通过继承,普通的方法也可以被重写,那么我们为什么一定要用抽象类呢?这是因为当我们使用抽象类的时候,相当于多了一层编译器的校验效果。提醒我们在父类(抽象类)中的方法得重写,比如实际工作不应该用父类来完成,应该用子类。使用普通的类的时候,编译器是不会报错的。但是父类是抽象类的时候就会在实例化的时候提示错误。让我们更早的发现问题。

   很多语法存在的意义都是为了 "预防出错", 例如我们曾经用过的 final 也是类似. 创建的变量用户不去修改, 不就相当于常量嘛? 但是加上 final 能够在不小心误修改的时候, 让编译器及时提醒我们.
充分利用编译器的校验, 在实际开发中是非常有意义的.
 

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