【Java面向对象】5-8 抽象类

§5-8 抽象类

面向对象的三大特性(封装、继承、多态)在前面的篇目中都已有介绍。本节将介绍面向对象中 “抽象的抽象”:抽象类。

5-8.1 抽象类的定义

语法:在类前显式声明 abstract 关键字。

class abstract class ClassName {
    //类的成员
}

我们现在来定义一个抽象类:

public abstract class Test {
    //抽象类
}

现在我们来为该类添加方法。

抽象类中也可以有抽象方法,用 abstract 修饰:

public abstract class Test {
    public abstract void run();
}

抽象方法,顾名思义,由于其是抽象的,因此抽象方法没有实现。但这会导致一些问题:没有实现的方法是无法被调用的。为了解决这一问题,抽象类中的抽象方法必须由其子类实现:

public class TestSub extends Test {
   	@Override
    public void run() {
        //方法实现
    }
}

抽象类的子类必须重写其父类中的所有抽象方法,提供具体的实现。而由于抽象父类中为该方法设置好了方法头(返回值类型、形参列表、函数名),子类要重写该方法则必须按照相同的方法头完成实现。因此,抽象方法的作用是约束子类重写的行为,可以被视为一种规范。

但并非所有抽象类的子类就必须重写父类的抽象方法,若抽象类的子类仍然是抽象类,那么子类可以不用重写:

public abstract class TestSub extends Test {
    public abstract void run();
}

抽象类中可以包含抽象方法,抽象方法必须在抽象类中。以下为错误示例:

public class Test {
    public abstract void run();	//错误:非抽象类中存在 abstract 方法
}

image

除了抽象方法,抽象类中也可以有具体方法。例如:

public abstract class Test {
    public abstract void run();     //抽象方法
    public void say() {
        System.out.println("Say something");	//具体方法
    }
}

5-8.2 抽象类的特点

  1. 抽象类其中既可以包含抽象方法,也可以含有普通(具体)方法。但将抽象方法没有实现;
  2. 抽象类的子类必须重写父类中所有抽象方法以提供实现,除非该子类也是抽象类;
  3. 抽象方法必须在抽象类中,用于提供方法的规范和约束;
  4. 抽象类无法被实例化(不允许使用 new ),但拥有构造器,非抽象子类实例化时需要调用父类构造器;
  5. 不同于接口,一个类值可以继承一个类,因此也有且只有一个抽象类能由子类继承;
  6. 抽象类提高了程序的开发效率。
posted @ 2023-05-01 17:34  Zebt  阅读(11)  评论(0)    收藏  举报