在Java中,接口(Interface)是一种完全抽象的类,它是由一组抽象方法组成的,这些方法是用来指定一组行为,接口不包含构造方法,并且不能实例化。从Java 8开始,接口还可以包含默认(default)和静态(static)方法,带有方法体的实现。
接口的特点:
- 接口中的所有方法默认都是
public
和abstract
的,但在声明时不需要显式地指定这些修饰符。 - 接口可以包含常量,这些常量默认都是
public
,static
, 和final
的。 - 从Java 8开始,接口中可以有
default
方法,允许有方法体,这是一种实现方法的继承机制。 - 从Java 8开始,接口中还可以定义静态方法。
- 从Java 9开始,接口还可以包含私有方法和私有静态方法,但这些方法不能被接口的实现类或其他接口继承。
- 接口支持多继承,一个接口可以继承多个其他接口。
示例:
public interface Animal {
// 抽象方法
public void eat();
// 默认方法
default void sleep() {
System.out.println("This animal sleeps.");
}
// 静态方法
static void breathe() {
System.out.println("Breathing...");
}
}
抽象类(Abstract Class) 是不能实例化的类,它可以包含抽象方法(没有方法体)和具体方法(有方法体)。抽象类用来提供一个基类的实现,供子类实现或继承。
抽象类的特点:
- 抽象类可以有构造器,即使不能直接实例化,这个构造器可以被子类的构造器调用。
- 抽象类可以有成员变量,可以是非常量。
- 抽象类中可以有非抽象的普通方法,即具体方法。
- 抽象类不支持多重继承。
示例:
public abstract class Animal {
// 抽象方法
public abstract void eat();
// 具体方法
public void sleep() {
System.out.println("This animal sleeps.");
}
}
接口与抽象类的区别:
- 目的: 接口主要用于定义公共的行为协议,而抽象类则是共享公共代码以及定义子类的通用模板。
- 实现多态:通过接口,可以实现多继承,一个类可以实现多个接口;而一个类只能继承一个抽象类。
- 默认方法实现:接口可以有默认方法实现,允许添加新方法而不影响实现接口的类;抽象类中方法可以有实现,也可以没有。
- 访问类型:接口预设的方法是
public
的;抽象类中的方法可以是public
、protected
或private
。 - 成员变量: 接口只能有常量;抽象类可以有成员变量,可以是非常量。
- 构造方法:接口没有构造方法;抽象类可以有构造方法。
在使用上,一般情况下,如果你想定义一组应该被多个不相关的类实现的类型,使用接口。如果你想共享代码的实现,使用抽象类。