接口和抽象类的共同点
实例化:接口和抽象类都不能直接实现,只能被实现(接口)或继承(抽象类)后才能创建具体的对象。
抽象方法:接口和抽象类都可以包含抽象方法。
抽象方法没有方法体,必须在子类后实现类中实现.
接口和抽象类的区别
设计目的:
接口主要用于对类的行为进行约束,你实现了某个接口就具有了对应的行为。
抽象类主要用于代码复用,强调的是所属关系。
继承和实现:一个类只能继承一个类(包括抽象类),因为Java不支持多继承。
但一个类可以实现多个接口,一个接口也可以继承多个其他接口。
成员变量:接口中的成员变量只能是也默认是public static final类型的,不能被修改且必须有初始值。
(没有初始值的原因是它是final,final都是没有默认值的)。
抽象类的成员变量可以有任何修饰符(private,protected,public),可以在子类中被重新定义或赋值。
(就是没啥限制)
方法:
Java8之前,接口中的方法默认是public abstract,也就是只能有方法声明。
自java8起,可以在接口中定义default(默认(显式))方法和static(静态)方法。
自Java9起,接口可以包含private方法。
抽象类可以包含抽象方法和非抽象方法。
抽象方法没有方法体,必须在子类中实现。
非抽象方法有具体实现,可以直接在抽象类中使用或子类中使用或重写。
在Java8及以上版本中,接口引入了新的方法类型:default方法,static方法和private方法。
这些方法让接口使用更加灵活。
Java8引入的default方法用于提供接口方法的默认实现,可以在实现类中被覆盖。
这样就可以在不修改实现类的情况下向现有接口添加新功能,从而增强接口的扩展性和向后兼容性。
public interface MyInterface(){
default void defaultMethod(){
System.out.println("This is a default method.");
}
}
Java8引入的static方法无法再实现类中被覆盖,只能通过接口名直接调用(MyInterface.staticMethod()),类似于类中的静态方法。
static方法通常用于定义一些通用的,与接口相关的工具方法,一般很少用。
public interface MyInterface {
static void staticMethod(){
System.out.println("This is a static method in the interface.");
}
}
Java9允许在接口中使用private方法。
private方法可以用于在接口内部共享代码,不对外暴露。
public interface MyInterface {
// default 方法
default void defaultMethod(){
commonMethod();
}
// static 方法
static void staticMethod() {
commonMethod();
}
// 私有静态方法,可以被 static 和 default 方法
private static void commonMethod() {
System.out.println("This is a private method used internally.")
}
// 实例私有方法,只能被 default 方法调用
private void instanceCommonMethod(){
System.out.println("This is a private instance method used internally.");
}
}