接口概述

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

接口的特点

  • 接口用关键字interface修饰
    • public interface 接口名{}
  • 类实现接口用implements表示
    • public class 类名 implements接口名{}
  • 接口不能实例化
    • 接口如何实现实例化:参照多态的方式,通过实现类对象实例化,这叫接口多态
    • 多态的形式:具体类多态,抽象类多态,接口多态
    • 多态的前提:有继承或者实现关系;有方法重写;有父(类/接口)引用指向(子/实现)类对象
  • 接口的实现类
    • 要么重写接口中的所有抽象方法
    • 要么是抽象类
代码
1
2
3
4
5
6
7
8

package unit_15jiekou.test1;
/*
定义一个接口类
*/
public interface Jumpping {
public abstract void jump();

1
2
3
4
5
6
7
8
9
10
11

package unit_15jiekou.test1;

public class Cat implements Jumpping{

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

1
2
3
4
5
6

package unit_15jiekou.test1;

public abstract class Dog implements Jumpping{
}

1
2
3
4
5
6
7
8
9
10
11
12
13

package unit_15jiekou.test1;
/*
测试类
*/
public class JumppingDemo {
public static void main(String[] args) {
// Jumpping j = new Jumpping(); //接口是一个抽象类
Jumpping j = new Cat();
j.jump();
}
}

接口的成员特点

  • 成员变量
    • 只能是常量
    • 默认修饰符:public static final
  • 构造方法
    • 接口没有构造方法,因为接口主要是对行为进行抽象的,是没有具体存在
    • 一个类如果没有父类,默认继承自Object类
  • 成员方法
    • 只能是抽象方法
    • 默认修饰符:public abstract
    • 关于接口中的方法,JDK8和JDK9中有一些新特性,后面在讲解
代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14

package unit_15jiekou.test2;

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);
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

package unit_15jiekou.test2;

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(); //接口里的方法默认带抽象修饰符

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

package unit_15jiekou.test2;

//public class InterImpl implements Inter{
public class InterImpl extends Object implements Inter{ //等价上面
public InterImpl(){
super();
}

@Override
public void method() {
System.out.println("重写方法");
}

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

案例:猫和狗

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

思路:

  • 定义接口(Jumpping)
    • 成员方法:跳高();
  • 定义抽象动物类(Animal)
    • 成员变量:姓名,年龄;
    • 构造方法:无参,带参;
    • 成员方法:get/set方法,吃饭();
  • 定义具体猫类(Cat),继承动物类,实现跳高接口
    • 构造方法:无参,带参;
    • 成员方法:重写吃饭(){…},重写跳高方法(){…}
  • 定义具体狗类(Dog),继承动物类,实现跳高接口
    • 构造方法:无参,带参;
    • 成员方法:重写吃饭(){…},重写跳高方法(){}
  • 定义测试类(AnimalDemo),写代码测试
代码
1
2
3
4
5
6
7

package unit_15jiekou.test3anli;

public interface Jumpping {
public abstract void Jump();
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

package unit_15jiekou.test3anli;

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();
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

package unit_15jiekou.test3anli;

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("猫可以跳了");
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

package unit_15jiekou.test3anli;
/*
测试类
*/
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在animal,animal没有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();
}
}

类和接口的关系

  • 类和类的关系
    • 继承关系,只能单继承,但是可以多层继承
  • 类和接口的关系
    • 实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口
  • 接口和接口的关系
    • 继承关系,可以单继承,也可以多继承
1
2
3
4
5

pubic class InterImpl extends Object implements Inter1Inter2Inter3{

}

1
2
3
4
5

public interface Inter3 extends Inter1,Inter2{

}

抽象类和接口的区别

  • 成员区别
    • 抽象类:变量,常量;有构造方法;由抽象方法,也有非抽象方法
    • 接口:常量;抽象方法
  • 关系区别
    • 类与类:继承,单继承
    • 类与接口:实现,可以单实现,也可以多实现
    • 接口与接口:继承,单继承,多继承
  • 设计理念区别
    • 抽象类:对类抽象,包括属性,行为
    • 接口:对行为抽象,主要是行为

门和警报的例子

门都能开和关,有的门能报警,如果设计

  • 把开和关设计成抽象类
  • 把报警设计成接口
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

public interface Alram {
void alarm ();
}

public abstract class Door {
public abstract void open ();
public abstract void close ();
}

public class AlarmDoor extends Door implements Alarm {
public void open (){
//...
}
public void close (){
//...
}
public void alarm (){

}
}

再次强调,抽象类是对事物的抽象,而接口是对行为的抽象

案例:运动员和教练

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

分析:从具体到抽象

  • 乒乓球运动员
  • 篮球运动员
  • 乒乓球教练
  • 篮球教练

实现:从抽象到具体
使用:使用的是具体的类的对象

思路:

  • 定义说英语接口
    • 成员方法:说英语();
  • 定义抽象人类
    • 成员变量:姓名,年龄
    • 构造方法:无参,带参
    • 成员方法:get/set方法,吃饭();
  • 定义抽象教练类,继承人类
    • 构造方法:无参,带参
    • 成员方法:教();
  • 定义抽象运动员类,继承人类
    • 构造方法:无参,带参
    • 成员方法:学习();
  • 定义具体篮球教练类,继承教练类
    • 构造方法:无参,带参
    • 成员方法:重写吃饭(){…},重写教(){…}
  • 定义具体乒乓球教练类,继承教练类,实现说英语接口
    • 构造方法:无参,带参
    • 成员方法:重写吃饭(){…},重写教(){…},重写说英语(){…}
  • 定义具体篮球运动员类,继承远动员类
    • 构造方法:无参,带参
    • 成员方法:重写吃饭(){…},重写学习(){…}
  • 定义具体乒乓球运动员类,继承运动员类,实现说英语接口
    • 构造方法:无参,带参
    • 成员方法:重写吃饭(){…},重写学习(){…},重写说英语(){…}
  • 定义测试类,写代码测试
代码
1
2
3
4
5
6
7

package unit_15jiekou.test4anli;
//说英语的接口
public interface SpeakEnglish {
public abstract void speak();
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

package unit_15jiekou.test4anli;
//抽象人类
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();
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14

package unit_15jiekou.test4anli;
//抽象教练类
public abstract class Coach extends Person{
public Coach() {
}

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

public abstract void teach();
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14

package unit_15jiekou.test4anli;
//抽象运动员类
public abstract class Player extends Person{
public Player() {
}

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

public abstract void study();
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

package unit_15jiekou.test4anli;

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("篮球教练吃篮球");
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

package unit_15jiekou.test4anli;

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("乒乓球教练说英语");
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

package unit_15jiekou.test4anli;

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("篮球运动员吃小篮球");
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

package unit_15jiekou.test4anli;

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("乒乓球运动员说英语");
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

package unit_15jiekou.test4anli;
//测试类
public class PersonDemo {
public static void main(String[] args) {
PingPangPlayer ppp = new PingPangPlayer();
ppp.setName("马龙");
ppp.setAge(40);
System.out.println(ppp.getName()+","+ppp.getAge());

PingPangPlayer ppp1 = new PingPangPlayer("樊振东",20);
System.out.println(ppp1.getName()+","+ppp1.getAge());

ppp.eat();
ppp.study();
ppp.speak();
System.out.println("------------------");

BasketballPlayer bp = new BasketballPlayer();
bp.setName("詹姆斯");
bp.setAge(50);
System.out.println(bp.getName()+","+bp.getAge());
bp.eat();
bp.study();
}
}