06.java面向对象高级-接口
1. 接口介绍
当我们谈论接口时,可以将其比喻为一份合同或规范,它规定了一个类应该遵守的一组规则和行为。接口定义了类应该具备的方法,并且不提供这些方法的具体实现,只规定了方法名和参数。这些方法是类必须实现的,就像合同中的规定一样。
想象一下,接口就像一张清单,列出了一些任务和要求。当一个类承诺实现某个接口时,它就必须完成这份清单上的所有任务,也就是实现接口中定义的所有方法。
接下来我们完成一个入门案例:
/**
* 写一个接口
**/
public interface UsbInterface {//接口
//规定接口的相关方法
public void start();
public void stop();
}
写两个类实现接口
/**
* Phone实现 UsbInterface
**/
//1. Phone类实现 USBInterface接口 规定/声明的方法
public class Phone implements UsbInterface {
@Override
public void start() {
System.out.println("手机开始工作。。。");
}
@Override
public void stop() {
System.out.println("手机停止工作。。。");
}
}
/**
* Camaro 实现接口
**/
public class Camera implements UsbInterface {
@Override
public void start() {
System.out.println("相机开始工作。。。");
}
@Override
public void stop() {
System.out.println("相机停止工作。。。");
}
}
写一个电脑类,编写work()方法
public class Computer {
//编写一个方法
public void work(UsbInterface usbInterface) {
//通过接口来调用方法
usbInterface.start();
usbInterface.stop();
}
}
然后让我们开始测试
public class Interface01 {
public static void main(String[] args) {
Camera camera = new Camera();
Phone phone = new Phone();
//创建计算机
Computer computer = new Computer();
computer.work(phone);//把手机接入电脑
System.out.println("=====================");
computer.work(camera);//把相机接入电脑
}
}
通过这个入门案例我们可以清晰的了解接口的使用
2. 基本介绍
1. 描述
-
接口就是给出一些没有实现的方法,封装到一起,到某个类要使用的时候,再根据具体情况吧这些方法写出来
-
语法:
interface 接口名 {
//属性
//方法
}class 类名 implements 接口 {
自己的属性;
自己的方法;
必须实现的接口方法;
}
2. 补充:
- 在jdk7.0前 接口里的所有方法都没有方法体,即都是抽象方法
- jdk8.0后 接口类可以有静态方法,默认方法,也就是说接口中可以有方法的具体实现(默认方法的实现,需要用default关键字修饰)
package com.yzjedu.interface_;
/**
* 接口补充
**/
public class Interface02 {
public static void main(String[] args) {
}
}
//1. 如果一个类 implements实现接口
//2. 需要将该接口中所有的抽象方法都要实现
class A implements AInterface {
@Override
public void hi() {
System.out.println("hi....");
}
}
interface AInterface {
//写属性
public int n1 = 10;
//写方法
//在接口中,抽象方法可以省略abstract关键字
public void hi();
//在jdk8后,可以有默认的实现方法,需要使用default关键字修饰
default public void ok() {
System.out.println("ok....");
}
//jdk8中可以有静态方法
public static void ha() {
System.out.println("ha...");
}
}
3. 接口的应用场景
让我们用一个生活中的例子来说明为什么要使用接口而不直接写类
想象一下你正在建造一个房子,你需要用到不同类型的工人:木工、电工、水管工等。每个工人都有自己的专业领域和工作方式,但他们都有一个共同的任务:建造房子。
如果你直接写类来表示这些工人,可能会有以下问题:
问题:
- 类的层次结构复杂:你需要为每一种工人类型创建一个类,这会导致类的层次结构变得复杂,尤其当你有多种不同类型的工人时。
- 难以扩展:如果你需要添加新类型的工人,你需要创建一个新的类,并可能需要修改现有的代码。
- 不符合规范:每个工人都应该有一些共同的行为,比如开始工作、结束工作等。如果你直接在每个类中实现这些行为,可能会导致不一致性和混乱。
这时候,接口就派上用场了。你可以创建一个名为"Worker"的接口,其中包含所有工人都应该实现的方法,比如"startWork()“和"endWork()”。然后,每种工人类型只需实现这个接口,并提供自己的具体实现,而不必创建独立的类。
这样做的好处是:
好处:
- 简化了类的层次结构:你只需要一个"Worker"接口,而不是多个类来表示不同类型的工人。
- 易于扩展:如果你需要添加新类型的工人,只需创建一个新的类并实现"Worker"接口,不需要修改现有的代码。
- 符合规范:所有工人都遵守相同的接口规范,这使得代码更一致和易于理解。
总之,接口允许你定义一组通用规范,让不同的类来实现,从而提高了代码的可维护性、扩展性和可读性。这就是为什么要使用接口而不直接写类的原因。
案例:
// 定义一个工人接口
interface Worker {
void startWork();
void endWork();
}
// 木工类实现工人接口
class Carpenter implements Worker {
@Override
public void startWork() {
System.out.println("木工开始工作");
}
@Override
public void endWork() {
System.out.println("木工结束工作");
}
}
// 电工类实现工人接口
class Electrician implements Worker {
@Override
public void startWork() {
System.out.println("电工开始工作");
}
@Override
public void endWork() {
System.out.println("电工结束工作");
}
}
public class Main {
public static void main(String[] args) {
// 创建木工对象并调用工作方法
Worker carpenter = new Carpenter();
carpenter.startWork();
carpenter.endWork();
// 创建电工对象并调用工作方法
Worker electrician = new Electrician();
electrician.startWork();
electrician.endWork();
}
}
4. 注意事项和细节
- 接口不能被实例化
- 接口中所有的方法是public方法, 接口中抽象方法, 可以不用abstract修饰
- 一个普通类实现接口, 就必须将该接口的所有方法都实现(在idea中在实现接口的哪一行里可以 用 alt + 回车 快捷键)
- 抽象类实现接口, 可以不用实现接口的方法