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