什么是抽象类?
- 抽象类的定义:
抽象指的是被abstract修饰的类(abstract关键字要放在访问修饰词背后,class前),抽象类中允许具有抽象方法。
public abstract class Main
- 抽象方法:
抽象指的是被abstract修饰的方法(abstract关键字要放在访问修饰词背后,返回值前)。其中抽象方法没有具体的实现,因此所对应的类也不允许实例化,抽象类对类成员不做要求。继承了抽象类的非抽象类,必须重写抽象类的所有抽象方法。
public abstract void func();
- 抽象类的意义
抽象类的作用很明显,就是专门用来继承的类。但是也许有人会觉得定义抽象类多此一举,因为只要子类设计者记得重写需要重写方法即可,不需要专门用关键词来修饰一个方法。
但定义抽象类是有意义的,为了编译器的检查机制。编译器会提醒类设计者继承的是一个抽象类,以防止类的调用者不重写本该重写的方法所带来的困扰。其实很多语法都是为了多一层编译器的检查,例如重写方法时的注解。
什么是接口?
- 接口的定义
接口指的是在类外定义的,具有interface关键字的代码块,特点是接口和其成员有默认的修饰词。
其中,接口默认是abstract修饰,interface允许用abstract修饰,但这个abstract无实际作用。
而接口中的字段默认被public static final修饰,因为被final修饰,所以必须赋予初值,否则直接报错。
接口中的方法默认是public abstract修饰,但也有特例。由于静态方法和对象无关,继承之后也无需重写,所以允许在接口中定义静态方法,但由于其不能被重写,接口中的静态方法必须具有具体的实现。此外还有被default修饰的方法也可以有具体实现,但这里不多提及。
interface a {
int b = 10;
void func();
static void func2() {
}
default void func3() {
}
}
- 接口的意义
接口最大的作用是近似实现多继承。Java是只有单继承结构,一个类只能有一个父类。但如果想要实现类似多继承的效果,就可以使用接口,一个类允许实现多个接口。使用implement关键字即可,可以用逗号隔开要实现的接口。
public abstract class Main extend ClassA implements IA,IB
抽象类和接口的区别和联系是什么?
-
抽象类和接口的联系:都有abstract关键字(其中接口是默认修饰,而抽象类是显式修饰的),都不能实例化,都是用来被继承的。
-
抽象类的接口的区别:
1成员的区别:抽象类对成员不做限制,而接口中的字段默认public static final,方法默认pubic abstract;
2继承结构的区别:抽象类只能使用单继承,而接口允许多继承。
3语法上的区别:例如抽象类定义用class而接口用interface,继承抽象类用extends而实现接口用implement等。
其中1和2为主要的区别。