抽象是什么?从科学学的角度去理解就是从众多的事物中去抽取出共同的、本质性的特征,而舍弃其非本质特征的过程;在信息技术中,抽象是简化复杂的现实问题的途径,它可以为具体问题找到最恰当的类定义,并且可以在最恰当的继承级别解释问题。
就定义一个类而言:
public class Person {
String name;
int age;
char sex;
void study() {
System.out.println("我在学习");
}
void sleep() {
System.out.println("我在睡觉");
}
}
上例将现实中人的姓名,年龄,性别的共同特征以及学习,睡觉这两个行为抽象成了一个类,然后通过new创建具体的实例来对应具体的人。这就是一种抽象。
什么是抽象类?类已经是对现实世界的一种抽象了,那抽象类呢?从之前我们对类的声明定义来看,我们很明确类的属性以及它的方法,以及怎么去实现它的方法,但是实际上我们可能不明确这个方法要如何实现或者说它不同的子类可能有不同的实现方式,就比如人和狗都是动物的一种,都会跑,但是人是用双脚跑而狗却是用四条腿跑。这时候就需要使用抽象类去声明一些不清晰的事物。抽象类用关键字abstract修饰:
public abstract class Person{
}
抽象类不能直接创建对象,必须由子类继承后,由子类创建对象。因为抽象类实质上算一个"残次品",需要子类修补好才能创建对象。
抽象类的抽象方法也是用abstract修饰,它没有方法体:
public abstract class Person{
public abstract void run();
}
子类继承抽象类一定要重写抽象方法。
抽象类除了多了抽象方法外其余的和普通类的定义是一模一样的。在抽象类中抽象方法也不是必须的。
看一下抽象类的使用:
public abstract class Employee {
public abstract void work();
}
public class Teacher extends Employee{
@Override
public void work() {
System.out.println("上课");
}
}
public class Lawyer extends Employee{
@Override
public void work() {
System.out.println("辩论");
}
}
public class Test {
public static void main(String[] args) {
Employee employee = new Teacher();
employee.work();//上课
Employee employee2 = new Lawyer();
employee2.work();//辩论
}
}
上例定义了一个员工的抽象类,有一个抽象方法work,两个子类老师和律师的工作是不一样的,在方法调用的时候它调用的方法也不是一样的。
我们之前学习过final关键字,它修饰的类是不能被继承的,修饰的方法是不能被重写的,而abstract修饰的类是需要被继承的,修饰的方法是需要被重写的,所以abstract不能和final一起使用。
总结
抽象类只是比普通类多了抽象方法而已,但抽象方法也不是必须的,所以说有抽象方法的一定是抽象类,抽象类不一定有抽象方法。抽象类可以有普通方法以及构造器(对自身初始化)。抽象类无法直接创建实例,需要子类继承之后通过子类创建实例。abstract不能和final一起使用。