抽象类的特点
- 比如我们在定义一个动物类的时候我们先给他定义一个eat的方法,这个方法不需要有实际的功能在他的子类猫、狗等等中我们再具体去实现他的功能这个时候父类中就可以定义抽象类。
- 抽象类需要用abstract修饰,同样抽象的方法也是。
- 抽象类不能被实例化,就是不能创建对象,只有抽象类的具体化子类才能创建对象。
- 抽象类的子类必须去实现抽象类中的抽象方法,就是要重写父类中抽象的方法。
- 抽象类的子类也可以是抽象类但是没有实际的意义,所以实际开发中子类必须将抽象类的所有抽象方法重写
- 抽象类只是事先声明一下这个方法,没有实际的内容。
- 抽象类中不一定有抽象的方法但是只要包含一个抽象的方法这个类必定是抽象类。
- 抽象类对成员变量没有限制,既可以是变量也可以是常量。
- 不能抽象构造方法,构造方法是对类的初始化,不能继承。
抽象类的定义方式如下:
abstract class Animal {
public abstract void eat(); // 抽象的方法,只需要声明即可。
public void sleep() { // 抽象类也可以有具体的方法,会被子类继承
System.out.println("睡觉");
}
}
class Cat extends Animal {
@Override
public void eat() { // 子类对父类抽象方法的实现
System.out.println("猫吃鱼");
}
}
public class Text {
public static void main(String[] args) {
Animal a = new Cat(); // 多态,抽象父类的引用指向子类的对象
a.eat();
a.sleep();
}
}
/**
输出为:
猫吃鱼
睡觉
*/
抽象类的实例化实际上均是由多态来实现的:如上代码中实例化过程:
Animal a = new Cat();
注意:
因为抽象类中的抽象方法必须通过子类重写去实现,所以abstroct和以下关键字冲突:
final,被final修饰的方法是最终的不能被继承所以也不能被重写。
private,被private修饰的方法子类是无法直接去访问的,所以就不能实现父类的抽象方法
static,被static修饰的方法是相对于类的,可以被继承,但是不能被重写,子类中如果定义相同的静态方法此时继承的父类静态方法会被隐藏而不是被重写。
@Override
@Override表示重写,是伪代码,没有具体的功能,可以不写,但是写上有它的好处:
- @Override需要写在重写的方法上面,紧挨着重写的方法,不能写在方法体内。
- 当加上@Override的时候编译器会检查@Override下面方法重写是否正确,如果方法名拼写错误编译器会报错,相反如果不加@Override编译器会认为是一个新的方法。
- 增加程序的阅读性,直观告诉阅读者这是一个重写的方法。
抽象类的作用
- 当父类中的某个方法需要被他所有的子类重写时就可以将这个方法定义为抽象方法。
- 一个类中没有抽象方法但却定义为抽象类的作用之一是 可以限制不让该类创建对象。
- 抽象类因为不能创建对象所以抽象类的构造方法只能通过子类去访问。