一、接口
1.定义
接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。
接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法。接口则包含类要实现的方法。
除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。
1)接口与类的相似点
- 一个接口可以有多个方法。
- 接口文件保存在 .java 结尾的文件中,文件名使用接口名。
- 接口的字节码文件保存在 .class 结尾的文件中。
- 接口相应的字节码文件必须在与包名称相匹配的目录结构中
接口与类之间的联系:
- 实现关系:类可以实现一个或多个接口,通过实现接口,类承诺会提供接口中定义的方法。
- 设计层面:接口定义了一套行为标准,类通过实现这些接口,可以在设计层面上保证不同类之间有共同的行为。
- 多态性:接口是多态性的基础。通过接口,可以将不同的类对象看作是相同的接口类型,从而实现运行时的多态。
- 代码解耦:接口可以作为不同类之间的中介,降低代码之间的耦合度,增强系统的可扩展性和可维护性。
2)接口与类的区别
- 接口不能用于实例化对象。
- 接口没有构造方法。
- 接口中所有的方法必须是抽象方法,Java 8 之后 接口中可以使用 default 关键字修饰的非抽象方法。
- 接口不能包含成员变量,除了 static 和 final 变量。
- 接口不是被类继承了,而是要被类实现。
- 接口支持多继承。
3)接口的特性
- 接口中每一个方法也是隐式抽象的,接口中的方法会被隐式的指定为 public abstract(只能是 public abstract,其他修饰符都会报错)。
- 接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量(并且只能是 public,用 private 修饰会报编译错误)。
- 接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法。
2.接口的声明
接口的声明语法格式如下:
[可见度] interface 接口名称 [extends 其他的接口名] {
// 声明变量
// 抽象方法
}
3.接口的继承
每个接口可以继承多个接口
4.接口的实现
当类实现接口的时候,类要实现接口中所有的方法。否则,类必须声明为抽象的类。
类使用implements关键字实现接口。在类声明中,Implements关键字放在class声明后面。
实现一个接口的语法,可以使用这个公式:
...implements 接口名称[, 其他接口名称, 其他接口名称..., ...] ...
接下来我们举一个例子。首先,我们定义一个接口:
public interface Vehicle {
void startEngine();
void stopEngine();
}
接下来,我们创建一个类来实现这个接口:
public class Car implements Vehicle {
@Override
public void startEngine() {
System.out.println("汽车引擎启动了。");
}
@Override
public void stopEngine() {
System.out.println("汽车引擎熄火了。");
}
}
在上面的例子中,Car
类实现了 Vehicle
接口。这意味着 Car
类必须提供 Vehicle
接口中所有方法的具体实现。在 Car
类中,我们使用 @Override
注解来表示我们正在重写或实现接口中的方法。这不是强制的,但它是一个好的编程实践,因为它可以提高代码的可读性,并帮助其他开发者快速理解代码的意图。
如果一个类没有实现其接口中的所有方法,那么这个类必须被声明为抽象类(abstract class)。例如:
public abstract class AbstractVehicle implements Vehicle {
// 提供了startEngine方法的实现,但没有实现stopEngine方法。
@Override
public void startEngine() {
System.out.println("车辆引擎启动了。");
}
// stopEngine方法没有实现,因此这个类必须是抽象的。
}
由于 AbstractVehicle
没有提供 stopEngine
方法的实现,它必须被声明为抽象类。这意味着你不能直接实例化 AbstractVehicle
;你必须创建一个继承自它的子类,这个子类提供了所有未实现方法的具体实现。
实现接口允许Java中的类使用多态性,使得可以通过接口类型的引用来操作实现了该接口的任何对象实例,提高了代码的灵活性和可扩展性。
5.接口的多继承
在Java中,类的多继承是不合法,但接口允许多继承。
在接口的多继承中extends关键字只需要使用一次,在其后跟着继承接口。 如下所示:
public interface Hockey extends Sports, Event
6.接口的多态
接口的多态是指通过接口的引用可以指向任何实现了该接口的类的实例,从而实现了在运行时确定其对象的具体类型,并调用其相应的方法。
public interface Animal {
void eat();
}
public class Dog implements Animal {
public void eat() {
System.out.println("Dog eats");
}
}
public class Cat implements Animal {
public void eat() {
System.out.println("Cat eats");
}
}
public class Test {
public static void main(String[] args) {
Animal myDog = new Dog();
Animal myCat = new Cat();
myDog.eat(); // 输出: Dog eats
myCat.eat(); // 输出: Cat eats
}
}
在这个例子中,Dog
和 Cat
类都实现了 Animal
接口。在 main
方法中,我们创建了 Animal
类型的引用 myDog
和 myCat
,分别指向 Dog
和 Cat
的实例。当我们调用 myDog.eat()
和 myCat.eat()
时,虽然这两个引用的类型都是 Animal
,但是它们会调用各自实例的 eat
方法,这就是接口的多态性。
7.标记接口
标记接口是没有任何方法和属性的接口.它仅仅表明它的类属于一个特定的类型,供其他代码来测试允许做一些事情。
标记接口作用:简单形象的说就是给某个对象打个标(盖个戳),使对象拥有某个或某些特权。