Day24.1:抽象类的详解

时间:2022-11-27 16:10:23

1.1抽象类概述

一个动物类中,我们创建对象时会去new一个动物;但是我们不应该直接创建动物这个对象,因为动物本身就是抽象的,没有动物这种实例,我们创建的应该是一个具体的动物类,比如猫、狗等动物这种实际的类;而且动物这个抽象的类不应该有具体的方法,因为只有具体的某一种动物才有具体的方法,所以这种抽象的类中应该也只有一个抽象的方法名,例如吃,睡等;而没有具体的方法(吃鱼,吃骨头)。

在Java中,一个没有方法体的方法应该被定义为抽象方法;而类中如果有抽象方法,那么这个类就必须定义为抽象方法

抽象类的关键字是abstract。

我们通过代码来对抽象类做进一步了解:

//我们先来创建一个动物类,再加入一个没有方法体的方法
public class Animals{
    public void eat();
}

当我们创建一个动物类,再加入一个没有方法体的方法时,系统会报错:

Day24.1:抽象类的详解

系统提示我们:该方法缺失方法体,或者将其声明为抽象类。

我们并不想要方法体,那么我们就将此方法定义为抽象方法,但是我们发现系统又报错了:

Day24.1:抽象类的详解

Day24.1:抽象类的详解

方法上的提示是:当前的抽象方法没有在抽象类中;

类上的提示是:Animals类必须声明为抽象类,或者实现类中抽象的方法;

根据这两次的提示,我们可以应证了:如果一个类中含有抽象方法,这个类就必须定义为抽象类

当我们给类加上abstract关键字后,系统不再报错:

Day24.1:抽象类的详解

1.2抽象类的特点

  • 抽象类和抽象方法必须有abstract关键字进行修饰
  • 抽象类不能直接实例化,需要通过子类进行实例化
  • 抽象类中不一定有抽象方法,但有抽象方法的一定是抽象类
  • 抽象类的子类必须全部重写抽象类的抽象方法,要么子类本身也是抽象类

我们通过代码对抽象类的特点进一步了解:

public abstract class Animals{
//抽象类中可以没有方法
}
public abstract class Animals{
    //抽象类中可以有其他方法
      public void sleep(){
    System.out.println("睡觉");
}
}
public abstract class Animals{
   //有抽象方法的一定是抽象类
    public abstract void eat();
}

关于抽象类的多态

Day24.1:抽象类的详解

我们创建一个抽象类和其子类,我们发现系统提示子类必须重写父类的抽象方法或者声明为抽象类

我们先来重写父类的抽象方法

Day24.1:抽象类的详解

当我们在子类中重写父类的抽象方法后,不再报错。

如果我们子类中还是不想重写父类的方法怎么办呢?那就将子类也变成抽象类!

Day24.1:抽象类的详解

我们尝试对抽象类进行实例化:

Day24.1:抽象类的详解

系统提示Animals类为抽象类无法被实例化;

我们只有通过子类的实例化来对父类变量进行初始化

Day24.1:抽象类的详解


1.3抽象类的成员特点

  • 抽象类中可以有成员变量(变量、常量)、成员方法(抽象方法:限定子类必须完成某些动作;非抽象方法:提高代码的复用性)
  • 抽象类中可以有构造方法(有参、无参),作用是用于子类访问父类数据的初始化