在 Java 中,如果一个类里需要定义一个没有具体实现的方法,它的实现需要它的子类中实现,那么可以使用
abstract
定义成一个
抽象方法
。
像下面这样:
// 格式:abstract 返回类型 方法名(参数列表);
abstract void sleep();
如果一个类里包含至少一个抽象方法,那么类只能使用 abstract
关键词定义成抽象类。
像下面这样:
public abstract class AbsPerson { //抽象类
public int age = 22;
public void eat(){
System.out.println("吃饭");
public abstract void sleep();
抽象类中还可以包含其他的非抽象方法以及字段。抽象类的子类必须实现其所有的抽象方法,否则子类也必须声明为抽象类。但是抽象类中也可以不定义任何抽象方法。
继承抽象类
抽象类可以被继承,一个类如果继承了抽象类,则必须实现抽象类中的抽象方法。
* @author www.wdbyte.com
public class Student extends AbsPerson {
// 不实现抽象方法 sleep() 会编译不过。
@Override
public void sleep() {
System.out.println("学生上课不能睡觉");
抽象类不能实例化
抽象类不能实例化,不然编译不通过。
public static void main(String[] args) {
new AbsPerson();
// java: com.wdbyte.oop.abs.AbsPerson是抽象的; 无法实例化
抽象类的子类作为普通类可以实例化,抽象类可以指向子类。
AbsPerson absPerson = new Student();
System.out.println(absPerson.age); // 22
absPerson.eat(); // 吃饭
absPerson.sleep(); // 学生上课不能睡觉
继承抽象类可以实现多态。
package com.wdbyte.oop.abs;
* @author www.wdbyte.com
public class Teacher extends AbsPerson {
@Override
public void sleep() {
System.out.println("老师教课时不能睡觉");
测试 Student
和 Teacher
.
* @author www.wdbyte.com
public class PersonTest {
public static void main(String[] args) {
Student student = new Student();
Teacher teacher = new Teacher();
sleep(student); // 学生上课不能睡觉
sleep(teacher); // 老师教课时不能睡觉
public static void sleep(AbsPerson person) {
person.sleep();
抽象类总结
Java 抽象类有以下特点:
一个类包含抽象方法则必须定义成抽象类,但是抽象类可以不包含任何抽象方法。
抽象类可以包含非抽象方法、属性。
子类继承抽象类必须实现抽象类中的所有抽象方法,否则子类也必须声明为抽象类。
抽象类不能直接实例化:抽象类只能被子类实现实例化。
抽象类可以向上转型:抽象类的引用可以指向子类对象,实现了抽象类的多态性。
抽象类的主要作用是为其子类提供通用的属性和方法,这些属性和方法由其子类实现,从而实现了代码复用和逻辑分离。
一如既往,文章中代码存放在 Github.com/niumoo/javaNotes.