Java 抽象类

抽象方法

在 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("老师教课时不能睡觉");
    }
}

测试 StudentTeacher .

/**
 * @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 抽象类有以下特点:

  1. 一个类包含抽象方法则必须定义成抽象类,但是抽象类可以不包含任何抽象方法。
  2. 抽象类可以包含非抽象方法、属性。
  3. 子类继承抽象类必须实现抽象类中的所有抽象方法,否则子类也必须声明为抽象类。
  4. 抽象类不能直接实例化:抽象类只能被子类实现实例化。
  5. 抽象类可以向上转型:抽象类的引用可以指向子类对象,实现了抽象类的多态性。

抽象类的主要作用是为其子类提供通用的属性和方法,这些属性和方法由其子类实现,从而实现了代码复用和逻辑分离。

一如既往,文章中代码存放在 Github.com/niumoo/javaNotes.