美文网首页
Java三大特性之接口

Java三大特性之接口

作者: Java编程日记 | 来源:发表于2022-04-07 16:40 被阅读0次

前两篇文章,我们给大家分别介绍了Java三大特性中的前两个特性—— 继承 多态 。本文给大家介绍的是这三大特性中的最后一个—— 接口, 并且给大家通过一个综合案例加以说明。首先给大家介绍接口的相关基本概念。

1.接口

1.1接口的概述

接口就是一种公共的规范标准,只要符合规范标准,大家都可以通用。 Java中的接口更多的体现在对行为的抽象!

1.2接口的特点

  • 接口用关键字 **interface** 修饰

<pre class="prettyprint hljs kotlin" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">public interface 接口名 {}</pre>

  • 类实现接口用 **implements** 表示

<pre class="prettyprint hljs php" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">public class 类名 implements 接口名 {}</pre>

  • 接口不能实例化

接口如何实例化呢?参照多态的方式,通过实现类对象实例化,这叫接口多态。 多态的形式:具体类多态,抽象类多态,接口多态。

  • 接口的子类

要么重写接口中的所有抽象方法 要么子类也是抽象类

1.3接口的成员特点

  • **成员特点 **

  • 成员变量

只能是常量 默认修饰符: public static final

  • 构造方法

没有,因为接口主要是扩展功能的,而没有具体存在

  • **成员方法 **

只能是抽象方法 默认修饰符: **public abstract ** 关于接口中的方法,JDK8和JDK9中有一些新特性。有兴趣的大家可以去 官网 查一下相关的API。

接下来我们通过一个案例将其简单的说明,具体代码演示如下:

  • **接口 **

<pre class="prettyprint hljs java" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">public interface Inter {
public int num = 10;
public final int num2 = 20;
// public static final int num3 = 30;
int num3 = 30;

// public Inter() {}

// public void show() {}

public abstract void method();
void show();

}</pre>

  • **实现类 **

<pre class="prettyprint hljs java" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">public class InterImpl extends Object implements Inter {
public InterImpl() {
super();
}

@Override
public void method() {
    System.out.println("method");
}

@Override
public void show() {
    System.out.println("show");
}

}</pre>

  • **测试类 **

<pre class="prettyprint hljs cs" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">public class InterfaceDemo {
public static void main(String[] args) {
Inter i = new InterImpl();
// i.num = 20;
System.out.println(i.num);
// i.num2 = 40;
System.out.println(i.num2);
System.out.println(Inter.num);
}
}</pre>

该案例的具体执行结果如下:

[图片上传失败...(image-81583c-1649227245224)]

1.4接口的案例

  • 案例需求

对猫和狗进行训练,他们就可以跳高了,这里加入跳高功能。 请采用抽象类和接口来实现猫狗案例,并在测试类中进行测试。

  • 代码实现:

  • 动物类

<pre class="prettyprint hljs java" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">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();

}</pre>

  • **跳高接口 **

<pre class="prettyprint hljs java" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">public interface Jumpping {
public abstract void jump();
}</pre>

  • **猫类 **

<pre class="prettyprint hljs java" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">public class Cat extends Animal implements Jumpping {

public Cat() {
}

public Cat(String name, int age) {
    super(name, age);
}

@Override
public void eat() {
    System.out.println("猫吃鱼");
}

@Override
public void jump() {
    System.out.println("猫可以跳高了");
}

}</pre>

  • **测试类 **

<pre class="prettyprint hljs swift" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">public class AnimalDemo {
public static void main(String[] args) {
//创建对象,调用方法
Jumpping j = new Cat();
j.jump();
System.out.println("--------");

    Animal a = new Cat();
    a.setName("加菲");
    a.setAge(5);
    System.out.println(a.getName()+","+a.getAge());
    a.eat();

// a.jump();

    a = new Cat("加菲",5);
    System.out.println(a.getName()+","+a.getAge());
    a.eat();
    System.out.println("--------");

    Cat c = new Cat();
    c.setName("加菲");
    c.setAge(5);
    System.out.println(c.getName()+","+c.getAge());
    c.eat();
    c.jump();
}

}</pre>

该案例具体的执行结果如下:

[图片上传失败...(image-136623-1649227245224)]

1.5类和接口的关系

  • 类与类的关系

继承关系,只能单继承,但是可以多层继承

  • 类与接口的关系

实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口

  • **接口与接口的关系 **

继承关系,可以单继承,也可以多继承

1.6抽象类和接口的区别

  • **成员区别 **

  • 抽象类

变量,常量;有构造方法;有抽象方法,也有非抽象方法

  • 接口

常量;抽象方法

  • 关系区别

  • **类与类 **

继承,单继承

  • **类与接口 **

实现,可以单实现,也可以多实现

  • 接口与接口

继承,单继承,多继承

  • **设计理念区别 **

  • 抽象类

对类抽象,包括属性、行为

  • **接口 **

对行为抽象,主要是行为

2.综合案例

2.1案例需求

我们现在有乒乓球运动员和篮球运动员,乒乓球教练和篮球教练。 为了出国交流,跟乒乓球相关的人员都需要学习英语。 请用所学知识分析,这个案例中有哪些具体类,哪些抽象类,哪些接口,并用代码实现。

这些类之间的关系如下:

[图片上传失败...(image-f78d82-1649227245223)]

2.2代码实现

根据以上的需求以及类之间的关系,我们给出如下的代码实现,首先我们给出的是抽象出来的人类:

  • ** 抽象人类 **

<pre class="prettyprint hljs java" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">public abstract class Person {
private String name;
private int age;

public Person() {
}

public Person(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();

}</pre>

  • **抽象运动员类 **

<pre class="prettyprint hljs scala" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">public abstract class Player extends Person {
public Player() {
}

public Player(String name, int age) {
    super(name, age);
}

public abstract void study();

}</pre>

  • **抽象教练类 **

<pre class="prettyprint hljs scala" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">public abstract class Coach extends Person {
public Coach() {
}

public Coach(String name, int age) {
    super(name, age);
}

public abstract void teach();

}</pre>

  • **学英语接口 **

<pre class="prettyprint hljs java" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">public interface SpeakEnglish {
public abstract void speak();
}</pre>

  • **蓝球教练 **

<pre class="prettyprint hljs java" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">public class BasketballCoach extends Coach {
public BasketballCoach() {
}

public BasketballCoach(String name, int age) {
    super(name, age);
}

@Override
public void teach() {
    System.out.println("篮球教练教如何运球和投篮");
}

@Override
public void eat() {
    System.out.println("篮球教练吃羊肉,喝羊奶");
}

}</pre>

  • 乒乓球教练

<pre class="prettyprint hljs java" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">public class PingPangCoach extends Coach implements SpeakEnglish {

public PingPangCoach() {
}

public PingPangCoach(String name, int age) {
    super(name, age);
}

@Override
public void teach() {
    System.out.println("乒乓球教练教如何发球和接球");
}

@Override
public void eat() {
    System.out.println("乒乓球教练吃小白菜,喝大米粥");
}

@Override
public void speak() {
    System.out.println("乒乓球教练说英语");
}

}</pre>

  • **乒乓球运动员 **

<pre class="prettyprint hljs java" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">public class PingPangPlayer extends Player implements SpeakEnglish {

public PingPangPlayer() {
}

public PingPangPlayer(String name, int age) {
    super(name, age);
}

@Override
public void study() {
    System.out.println("乒乓球运动员学习如何发球和接球");
}

@Override
public void eat() {
    System.out.println("乒乓球运动员吃大白菜,喝小米粥");
}

@Override
public void speak() {
    System.out.println("乒乓球运动员说英语");
}

}</pre>

  • 篮球运动员

<pre class="prettyprint hljs java" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">public class BasketballPlayer extends Player {

public BasketballPlayer() {
}

public BasketballPlayer(String name, int age) {
    super(name, age);
}

@Override
public void study() {
    System.out.println("篮球运动员学习如何运球和投篮");
}

@Override
public void eat() {
    System.out.println("篮球运动员吃牛肉,喝牛奶");
}

}</pre>

  • 测试类

<pre class="prettyprint hljs cs" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">/*
测试类
*/
public class PersonDemo {
public static void main(String[] args) {
//创建对象
PingPangPlayer ppp = new PingPangPlayer();
ppp.setName("王浩");
ppp.setAge(30);
System.out.println(ppp.getName()+","+ppp.getAge());
ppp.eat();
ppp.study();
ppp.speak();
System.out.println("--------");

    BasketballPlayer bp = new BasketballPlayer();
    bp.setName("姚明");
    bp.setAge(35);
    System.out.println(bp.getName()+","+bp.getAge());
    bp.eat();
    bp.study();
}

}</pre>

该案例执行的结果如下:

[图片上传失败...(image-bd00c-1649227245223)]Java三大特性之接口

总结

本文主要给大家介绍了Java中三大特性中的接口,至此,我们java中的三大特性都给大家介绍完毕,这是我们Java开发中最基础也是最常用的。希望大家认真掌握,打好基础才能走的更远。

相关文章

  • java基础概念

    java_basic 介绍 java基础 三大特性之—封装 三大特性之—继承 三大特性之—多态 抽象 接口 深拷贝...

  • Java集合【7】——— List源码超级详细解析

    1.List接口的特性 java.util.List 接口继承于 Collection 接口,与Map最大的不同之...

  • Rust impl trait

    trait特性 trait特性可以理解为Java中的接口,具备和接口很类似的特性。trait中的函数叫做方法。某个...

  • Java 接口知识点

    接口的特性 函数式接口 抽象类和接口区别 Lambda表达式 java常用接口

  • 4-2 抽象基类

    相当于Java的接口,Java的类实现特性时,是要实现接口Python鸭子类型:Python去实现一个类的特性时,...

  • java 各版本新特性介绍

    java8 新特性 Java8 主要包括的新特性有: 函数式接口如果一个接口只有一个抽象方法,那么该接口就成为一个...

  • Java8特性之接口

    JDK1.8的特性 接口的特性 接口中可以定义静态方法,默认方法,并有方法体接口中定义的静态方法,只能通过接口去调...

  • Java三大特性之接口

    前两篇文章,我们给大家分别介绍了Java三大特性中的前两个特性—— 继承 [https://blog.51cto....

  • 1.Java8你需要了解的

    一、Java8新增了哪些新特性: 新特性Java8 新增了非常多的特性,我们主要讨论以下几个: 1、接口默认方法:...

  • Java新特性

    Java5新特性 可变参数 foreach循环 静态导入 引入: 静态导入: Java8新特性 接口定义的增强(可...

网友评论

      本文标题:Java三大特性之接口

      本文链接:https://www.haomeiwen.com/subject/qlirsrtx.html