概述
抽象类和接口在面试中经常被问道的点,下面简要概述抽象类和接口的区别
区别:
在java1.8之前,
1.在抽象类中可以有静态成员变量和非静态成员变量,而对于接口而言,是不能有非静态成员变量的。
2.抽象类中可以有静态方法和非静态方法,而在接口中是不能有非静态方法的。
然而在java1.8之后,你会发现变了,在java1.8中,接口中可以有非静态成员变量,也可以有静态方法了,只是静态方法不可以。那么是否抽象类和接口是否就不存在区别了呐?在深究之后,其实抽象类和接口还是有区别的。
抽象类允许非静态(static)和非final字段,方法可以是public、private或protected,而接口的字段只能是public static final的,如果是成员变量,会自动转换为public static final,方法是public abstract,即只能公开
案例
下面以java1.8为例,演示相关案例,案例功能是验证,在java1.8中,接口可以有非静态字段,但是只能是public final的,可以有静态方法,但是方法只能是public abstract的。
创建接口、测试方法为只能使public abstract的
接口类:
public interface testDifferWithInterface {
static void testMethod() {
System.out.println("interface static method");
}
public abstract void test1();
}
测试类:
public class ImplementInterface implements testDifferWithInterface{
@Override
public void test1() {
}
public static void main(String[] args) {
testDifferWithInterface.testMethod();
}
}
可以看到,报错了,为此证明,方法只能是public abstract的
在接口中,方法会被隐式的指定为public abstract(只能使public abstract,其他修饰会报错)
代码:
public interface testDifferWithInterface {
public static final int count = 0;
static void testMethod() {
System.out.println("interface static method");
}
public abstract void test1();
}
在接口中,字段会被隐式的指定为只能是public static final,其他修饰会报错