java面试常见面试题:
抽象类和接口有什么区别,什么情况下会使用抽象类和什么情况你会使用接口
抽象类与接口
抽象类是用来捕捉子类的通用特性的 。它不能被实例化,只能被用作子类的超类。抽象类是被用来创建继承层级里子类的模板。
接口是抽象方法的集合。如果一个类实现了某个接口,那么它就继承了这个接口的抽象方法。这就像契约模式,如果实现了这个接口,那么就必须确保使用这些方法。接口只是一种形式,接口自身不能做任何事情。
- 1.普通成员变量:抽象类中可以有普通成员变量,接口中没有普通成员变量(static final变量);
- 2.方法:抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法;
- 3.静态成员变量:抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。
- 4.静态方法:抽象类中可以包含静态方法,但不能是抽象静态方法;接口中不能包含静态方法(静态的方法不能被覆写)
- 5.构造方法(静态的):抽象类可以有构造方法,接口中不能有构造方法;
- 6.方法访问权限:抽象类中的抽象方法的访问类型可以是public,protected和(默认类型,虽然eclipse下不报错,但应该也不行),但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。
- 7.子类实现和继承: 一个类可以实现多个接口,但只能继承一个抽象类。
JDK8 新特性
接口默认方法
默认方法是在接口中的方法签名前加上 default 关键字的实现方法。
在Java 8之前,接口与其实现类之间的耦合度过高,当需要为一个接口添加方法时,所有的实现类都必须随之修改。默认方法可以为接口添加新的方法,而不会破坏已有的接口的实现。
接口默认方法的继承分三种情况:
1. 不覆写默认方法,直接从父接口中获取方法的默认实现。
2. 覆写默认方法,这跟类与类之间的覆写规则相类似。
3. 覆写默认方法并将它重新声明为抽象方法,这样新接口的子类必须再次覆写并实现这个抽象方法。
接口静态方法
interface InterfaceA {
default void foo() {
printHelloWorld();
}
static void printHelloWorld() {
System.out.println("hello, world");
}
}
public class Test {
public static void main(String[] args) {
InterfaceA.printHelloWorld();
}
}
default关键字只能在接口中使用(以及用在 switch语句的default分支),不能用在抽象类中;接口默认方法不能覆写Object类的equals、hashCode和toString方法;接口中的静态方法必须是public的,public修饰符可以省略,static修饰符不能省略。