Java的基础面试题还是很多会考这个的,所以自己总结下。(JDK8之后)
相同点:
1.抽象类和接口都不能被实例化
2.它们当中都能够包含抽象方法
重点是它们的区别:
1、抽象类当中有抽象方法和普通方法(有方法体),普通方法可以不被重写;
接口当中的方法包含抽象方法和默认(default)方法,同样默认方法也可以不被重写,调用时需要借助接口的实现类的对象来进行调用,并且在JDK8.0之后,接口中也能有静态方法(接口名.方法名调用)。
2、抽象类中有构造器和初始化块,但是接口中没有。
3、接口当中定义的是静态常量,必须用public static final来进行定义,不能定义普通成员,而抽象类当中两者都能进行定义。
抽象类的具体实现
public abstract class TestAbstractCLass {
//抽象类可以有构造方法和初始化块
TestAbstractCLass() {
System.out.println("抽象类的构造器");
}
//普通方法
public void normalMethod() {
System.out.println("这是一个抽象类的普通方法");
}
//普通静态方法
public static void normalStaticMethod() {
System.out.println("这是一个抽象类的普通静态方法");
}
//抽象方法,只能被public和protected修饰
abstract void absMethodFromAbstractClass();
}
public class Sontest extends TestAbstractCLass{
Sontest() {
super();
}
@Override
void absMethodFromAbstractClass() {
}
//抽象类中的普通方法,可选择是否重写
// @Override
// public void normalMethod() {
// super.normalAbs1();
// }
public static void main(String[] args) {
//调用抽象类的静态普通方法,直接抽象类.静态方法名即可调用
TestAbstractCLass.normalStaticMethod();
//调用抽象类中的普通方法(需要通过子类的对象来进行调用)
new Sontest().normalMethod();
}
接口的具体实现
public interface TestInterface {
//默认方法
default void defaultMethod() {
System.out.println("接口中的默认方法");
}
//抽象方法(默认为public abstract修饰)
void absMethodFromAbstractInterface();
//JDK8后加入的静态方法
static void staticMethod() {
System.out.println("接口中的静态方法");
}
}
public class Sontest implements TestInterface{
//重写接口中的抽象方法
@Override
public void absMethodFromAbstractInterface() {
}
//接口中的默认方法,可被重写也可不被重写
// @Override
// public void defaultMethod() {
//
// }
public static void main(String[] args) {
//调用接口中的默认方法
new Sontest().defaultMethod();
//静态方法的调用
TestInterface.staticMethod();
}
}