个人简介
👀个人主页: 前端杂货铺
⚡开源项目: rich-vue3 (基于 Vue3 + TS + Pinia + Element Plus + Spring全家桶 + MySQL)
🙋♂️学习方向: 主攻前端方向,正逐渐往全干发展
📃个人状态: 研发工程师,现效力于中国工业软件事业
🚀人生格言: 积跬步至千里,积小流成江海
🥇推荐学习:🍖开源 rich-vue3 🍍前端面试宝典 🍉Vue2 🍋Vue3 🍓Vue2/3项目实战 🥝Node.js实战 🍒Three.js🌕个人推广:每篇文章最下方都有加入方式,旨在交流学习&资源分享,快加入进来吧
内容 | 参考链接 |
---|---|
Java基础(一) | Hello World,8种数据类型,键盘录入 |
Java基础(二) | 数组,方法,方法重载 |
Java基础(三) | 类和对象、构造方法 |
Java基础(四) | 字符串、StringBuffer、StringBuilder、StringJoiner |
Java基础(五) | ArrayList |
Java基础(六) | 继承 |
Java基础(七) | 多态 |
Java基础(八) | 包、final、权限修饰符、静态代码块 |
Java基础(九) | 抽象类、抽象方法 |
文章目录
- 前言
- 接口的定义和使用
- 接口中成员的特点
- 接口和类之间的关系
- 接口中新增的方法
- 默认方法
- 静态方法
- 私有方法
- 总结
前言
大家好,这里是前端杂货铺。
本篇文章,我们学习 接口。
接口的定义和使用
- 接口用关键字 interface 来定义
public interface 接口名 {}
- 接口不能被实例化
- 接口和类之间是实现关系,通过 implements 关键字表示
public class 类名 implements 接口名 {}
- 接口的子类(实现类)要么 重写接口中的所有抽象方法,要么 是抽象类
注意:
- 接口和类的实现关系,可以单实现,也可以多实现
public class 类名 implements 接口名1, 接口名2 {}
- 实现类还可以在继承一个类的同时实现多个接口
public class 类名 extends 父类 implements 接口名1, 接口名2 {}
下面,我们把游泳定义为一个接口,实现青蛙和兔子的相关属性和行为的输出:
Swim.java
public interface Swim {
public abstract void swim();
}
Animal.java
public abstract class Animal {
private String name;
private int age;
public Animal() {
}
public Animal(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public abstract void eat();
}
Frog.java
public class Frog extends Animal implements Swim {
public Frog() {
}
public Frog(String name, int age) {
super(name, age);
}
@Override
public void eat() {
System.out.println("青蛙在吃虫子");
}
@Override
public void swim() {
System.out.println("青蛙在游泳");
}
}
Rabbit.java
public class Rabbit extends Animal{
public Rabbit() {
}
public Rabbit(String name, int age) {
super(name, age);
}
@Override
public void eat() {
System.out.println("兔子在吃胡萝卜");
}
}
Test.java
public class Test {
public static void main(String[] args) {
Frog f = new Frog("青蛙", 1);
System.out.println(f.getName() + ", " + f.getAge());
f.eat();
f.swim();
Rabbit r = new Rabbit("兔子", 2);
System.out.println(r.getName() + ", " + r.getAge());
r.eat();
}
}
接口中成员的特点
成员变量:只能是常量,默认修饰符:public static final。
构造方法:没有。
成员方法:只能是抽象方法,默认修饰符:public abstract。
注意事项:
- JDK7 以前:接口中只能定义抽象方法。
- JDK8:接口中可以定义有方法体的方法。
- JDK9:接口中可以定义私有方法。
Inter.java
public interface Inter {
int num = 20;
// 即使不加 public abstract,也会默认加上的
public abstract void method();
}
InterImpl.java
public class InterImpl implements Inter {
@Override
public void method() {
System.out.println("重写的抽象方法");
}
}
Test.java
public class Test {
public static void main(String[] args) {
System.out.println(Inter.num);
InterImpl i = new InterImpl();
i.method();
}
}
接口和类之间的关系
类与类的关系:继承关系,只能单继承,不能多继承,但是可以多层继承。
类与接口的关系:实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口。
接口和接口的关系:可以单继承,也可以多继承。
下面我们实现一下接口的多继承:
Inter1.java
public interface Inter1 {
public abstract void method1();
}
Inter2.java
public interface Inter2 {
public abstract void method2();
}
Inter3.java
public interface Inter3 extends Inter1, Inter2 {
public abstract void method3();
}
InterImpl.java
public class InterImpl implements Inter3 {
@Override
public void method1() {
}
@Override
public void method2() {
}
@Override
public void method3() {
}
}
接口中新增的方法
默认方法
允许在接口中定义默认方法,需要使用关键字 default 修饰。——作用:解决接口升级问题。
接口中 默认方法 的定义格式:
- 格式:public default 返回值类型 方法名(参数列表) {}
- 范例:public default void show() {}
接口中默认方法的 注意事项:
- 默认方法不是抽象方法,所以不强制被重写。但是如果被重写,重写的时候去掉 default 关键字。
- public 可以省略,default 不能省略
- 如果实现了多个接口,多个接口中存在相同名字的默认方法,子类就必须对该方法进行重写
接口中编写默认方法
InterA.java
public interface InterA {
// 抽象方法
public abstract void method();
// 默认方法
public default void show() {
System.out.println("InterA 接口中的默认方法");
}
}
InterAImpl.java
public class InterAImpl implements InterA{
@Override
public void method() {
System.out.println("实现类重写的抽象方法");
}
}
Test.java
public class Test {
public static void main(String[] args) {
InterAImpl i = new InterAImpl();
i.method();
i.show();
}
}
实现了多个接口,多个接口中存在相同名字的默认方法,子类就必须对该方法进行重写:
InterA.java
public interface InterA {
// 抽象方法
public abstract void method();
// 默认方法
public default void show() {
System.out.println("InterA 接口中的默认方法");
}
}
InterB.java
public interface InterB {
public default void show() {
System.out.println("InterB 接口中的默认方法");
}
}
InterAImpl.java
public class InterAImpl implements InterA, InterB {
@Override
public void method() {
System.out.println("实现类重写的抽象方法");
}
@Override
public void show() {
System.out.println("实现类重写接口中的默认方法");
}
}
Test.java
public class Test {
public static void main(String[] args) {
InterAImpl i = new InterAImpl();
i.method();
i.show();
}
}
PS:不重写,会报错,因为此时不知道调哪个接口的默认方法
静态方法
允许在接口中定义静态方法,需要使用关键字 static 修饰。
接口中 静态方法 的定义格式:
- 格式:public static 返回值类型 方法名(参数列表) {}
- 范例:public static void show() {}
接口中静态方法的 注意事项:
- 静态方法只能通过接口名调用,不能通过实现类名或者对象名调用。
- public 可以省略,static 不能省略。
Inter.java
public interface Inter {
public abstract void method();
public static void show() {
System.out.println("Inter 接口中的静态方法");
}
}
InterImpl.java
public class InterImpl implements Inter{
@Override
public void method() {
System.out.println("InterImpl 重写的抽象方法");
}
public static void show() {
System.out.println("InterImpl 实现类中的 show 方法");
}
}
Test.java
public class Test {
public static void main(String[] args) {
// 调用接口中的静态方法
Inter.show();
// 调用实现类中的静态方法
InterImpl.show();
}
}
私有方法
接口中私有方法的定义格式:
- 范例1:private void show() {}
- 范例2:private static void method() {}
Inter.java
public interface Inter {
public static void show1() {
System.out.println("show1 方法");
show3();
}
public static void show2() {
System.out.println("show2 方法");
show3();
}
private static void show3() {
System.out.println("仅允许此java文件里的静态方法调我 --- haha");
}
}
Test.java
public class Test {
public static void main(String[] args) {
Inter.show1();
Inter.show2();
}
}
总结
本篇文章我们学习了接口的定义、特点及相关使用,是不是收获满满呢!
好啦,本篇文章到这里就要和大家说再见啦,祝你这篇文章阅读愉快,你下篇文章的阅读愉快留着我下篇文章再祝!
参考资料:
- Java 基础(bilibili-黑马程序员)
- 菜鸟教程–Java