前言
在Java中,抽象类是一种特殊的类,它和普通class类最主要的区别就是抽象类不能被实例化,也就是不能通过new关键字去创建该类的对象。
但是可以作为其他类的父类(基类),可以将子类的一些公共的属性和方法提取出来放到抽象类中。
那此时大家可能有疑问,普通的类也能实现这样的作用,为什么还需要抽象类呢?这个问题很好回答,我们在继承的章节中也提到了父类中可以提取子类共有的一些属性和方法,但是可能子类都有这些共有方法行为,但是至于各子类中方法的具体处理逻辑可能不会相同。所有我们之前学习了重写的知识点。
所以此时父类就只需要去声明公共行为方法,至于方法体是如何实现的就交给子类是实现。
正文
语法
在java中,通过关键字abstract
去定义抽象类。抽象类中可以包含抽象方法(抽象方法指的是只声明方法,没有实现方法体,抽象方法也必须用关键字abstract
去定义),抽象类中也可以有普通方法(普通方法指的是有方法定义和方法体实现的方法)。
abstract关键字只能修饰类和方法。
样例代码:
public abstract class AbstractDemo {
//抽象类中可以有构造方法
public AbstractDemo(String name) {
this.name = name;
}
//可以声明变量
public String name;
//抽象方法
public abstract void say();
//普通方法
public void eat(){
System.out.println("吃了个玉米");
}
}
通过上面的样例我们可以看到抽象类的声明方法,抽象类中可以有构造方法,可以有成员变量,可以有抽象方法,可以有普通方法。
特点
- 不能被实例化,即不能通过关键字new去创建抽象类的对象。尝试创建抽象类的实例将导致编译错误。
- 可以包含抽象方法和非抽象方法。
- 抽象类可以包含成员变量和静态方法。
- 抽象类的主要目的是被其他类继承,并由子类提供抽象方法的具体实现,这个我们在下面的例子中进行演示。
- 如果一个类包含一个或多个抽象方法,则该类必须被声明为抽象类。
我们提到抽象类主要目的是被其他子类继承的,子类继承抽象类时,必须重写抽象类所有的抽象方法,我们把这种动作叫做抽象方法的具体实现。
写个样例代码继承上面写的抽象类:
public class SonAbstract extends AbstractDemo{
public SonAbstract(String name) {
super(name);
}
@Override
public void say() {
System.out.println("实现AbstractDemo类的抽象方法");
}
}
如果继承抽象类,不实现抽象类的所有抽象方法的话,idea会编译报错。