halisi7

一个专注技术的组织

0%

Java面向对象3-接口

接口:

image-20220121174240143

image-20220121174416975

image-20220121174535052

1.接口使用interface来定义
2.Java中,接口和类是并列的两个结构
3.如何定义接口:定义接口中的成员

      3.1 JDK7及以前:只能定义全局常量和抽象方法
          >全局常量:public static final的.但是书写时,可以省略不写
          >抽象方法:public abstract的

      3.2 JDK8:除了定义全局常量和抽象方法之外,还可以定义静态方法、默认方法(略)
  1. 接口中不能定义构造器的!意味着接口不可以实例化

  2. Java开发中,接口通过让类去实现(implements)的方式来使用.
    如果实现类覆盖了接口中的所有抽象方法,则此实现类就可以实例化
    如果实现类没有覆盖接口中所有的抽象方法,则此实现类仍为一个抽象类

  3. Java类可以实现多个接口 —->弥补了Java单继承性的局限性

    格式:class AA extends BB implements CC,DD,EE

  4. 接口与接口之间可以继承,而且可以多继承


  1. 接口的具体使用,体现多态性
  2. 接口,实际上可以看做是一种规范

面试题:抽象类与接口有哪些异同?

相同点:不能实例化;都可以包含抽象方法

不同点:1.定义,内部结构。。

  1. 类:单继承性 接口:多继承

    类与接口的关系:多实现

接口的使用:

例1:

image-20220121175103218

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
public class InterfaceTest {
public static void main(String[] args) {
System.out.println(Flyable.MAX_SPEED);
System.out.println(Flyable.MIN_SPEED);
// Flyable.MIN_SPEED = 2;

Plane plane = new Plane();
plane.fly();
}
}


interface Flyable{

//全局常量
public static final int MAX_SPEED = 7900;//第一宇宙速度
int MIN_SPEED = 1;//省略了public static final

//抽象方法
public abstract void fly();
//省略了public abstract
void stop();


//Interfaces cannot have constructors
// public Flyable(){
//
// }
}

interface Attackable{

void attack();

}

class Plane implements Flyable{

@Override
public void fly() {
System.out.println("通过引擎起飞");
}

@Override
public void stop() {
System.out.println("驾驶员减速停止");
}

}

abstract class Kite implements Flyable{

@Override
public void fly() {

}

}

class Bullet extends Object implements Flyable,Attackable,CC{

@Override
public void attack() {
// TODO Auto-generated method stub

}

@Override
public void fly() {
// TODO Auto-generated method stub

}

@Override
public void stop() {
// TODO Auto-generated method stub

}

@Override
public void method1() {
// TODO Auto-generated method stub

}

@Override
public void method2() {
// TODO Auto-generated method stub

}

}
//************************************

interface AA{
void method1();
}
interface BB{

void method2();
}

interface CC extends AA,BB{

}

例2:创建接口匿名实现类的对象

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
public class USBTest {
public static void main(String[] args) {

Computer com = new Computer();
//1.创建了接口的非匿名实现类的非匿名对象
Flash flash = new Flash();
com.transferData(flash);

//2. 创建了接口的非匿名实现类的匿名对象
com.transferData(new Printer());

//3. 创建了接口的匿名实现类的非匿名对象
USB phone = new USB(){

@Override
public void start() {
System.out.println("手机开始工作");
}

@Override
public void stop() {
System.out.println("手机结束工作");
}

};
com.transferData(phone);


//4. 创建了接口的匿名实现类的匿名对象

com.transferData(new USB(){
@Override
public void start() {
System.out.println("mp3开始工作");
}

@Override
public void stop() {
System.out.println("mp3结束工作");
}
});
}
}

class Computer{

public void transferData(USB usb){//USB usb = new Flash();
usb.start();

System.out.println("具体传输数据的细节");

usb.stop();
}


}

interface USB{
//常量:定义了长、宽、最大最小的传输速度等

void start();

void stop();

}

class Flash implements USB{

@Override
public void start() {
System.out.println("U盘开启工作");
}

@Override
public void stop() {
System.out.println("U盘结束工作");
}

}

class Printer implements USB{
@Override
public void start() {
System.out.println("打印机开启工作");
}

@Override
public void stop() {
System.out.println("打印机结束工作");
}

}

接口的应用1:代理模式(Proxy)

image-20220121175259317

例1:

image-20220121175938827

例2:

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
public class StaticProxyTest {

public static void main(String[] args) {
Proxy s = new Proxy(new RealStar());
s.confer();
s.signContract();
s.bookTicket();
s.sing();
s.collectMoney();
}
}

interface Star {
void confer();// 面谈

void signContract();// 签合同

void bookTicket();// 订票

void sing();// 唱歌

void collectMoney();// 收钱
}
//被代理类
class RealStar implements Star {

public void confer() {
}

public void signContract() {
}

public void bookTicket() {
}

public void sing() {
System.out.println("明星:歌唱~~~");
}

public void collectMoney() {
}
}

//代理类
class Proxy implements Star {
private Star real;

public Proxy(Star real) {
this.real = real;
}

public void confer() {
System.out.println("经纪人面谈");
}

public void signContract() {
System.out.println("经纪人签合同");
}

public void bookTicket() {
System.out.println("经纪人订票");
}

public void sing() {
real.sing();
}

public void collectMoney() {
System.out.println("经纪人收钱");
}
}

接口的应用2:工厂模式

image-20220121181044885

  • 其它略。。。

接口练习1:

image-20220121184037986

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
interface A {
int x = 0;
}

class B {
int x = 1;
}

class C extends B implements A {
public void pX() {
//编译不通过。因为x是不明确的
// System.out.println(x);
System.out.println(super.x);//1
System.out.println(A.x);//0

}

public static void main(String[] args) {
new C().pX();
}
}

接口练习2:

image-20220121185043788

  1. public void play()看作是对接口Playable和Bounceable里的play的方法的重写(两个),因为重名了。
  2. 不能再创建对象了,因为 Ball ball前面省略了 public static final 3个,违反了final。

接口练习3:

image-20220121191227090

1
2
3
4
5
6
7
8
9
10
11
/*
* interface CompareObject{
public int compareTo(Object o);
//若返回值是 0 , 代表相等; 若为正数,代表当前对象大;负数代表当前对象小
}

*/
public interface CompareObject {
//若返回值是 0 , 代表相等; 若为正数,代表当前对象大;负数代表当前对象小
public int compareTo(Object o);
}
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
/*
* 定义一个Circle类,声明radius属性,提供getter和setter方法

*/
public class Circle {

private Double radius;

public Double getRadius() {
return radius;
}

public void setRadius(Double radius) {
this.radius = radius;
}

public Circle() {
super();
}

public Circle(Double radius) {
super();
this.radius = radius;
}


}
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
35
36
37
38
/*
* 定义一个ComparableCircle类,继承Circle类并且实现CompareObject接口。
* 在ComparableCircle类中给出接口中方法compareTo的实现体,用来比较两个圆的半径大小。

*/
public class ComparableCircle extends Circle implements CompareObject{

public ComparableCircle(double radius) {
super(radius);
}
@Override
public int compareTo(Object o) {
if(this == o){
return 0;
}
if(o instanceof ComparableCircle){
ComparableCircle c = (ComparableCircle)o;
//错误的:
// return (int) (this.getRadius() - c.getRadius());
//正确的方式一:
// if(this.getRadius() > c.getRadius()){
// return 1;
// }else if(this.getRadius() < c.getRadius()){
// return -1;
// }else{
// return 0;
// }
//当属性radius声明为Double类型时,可以调用包装类的方法
//正确的方式二:
return this.getRadius().compareTo(c.getRadius());
}else{
return 0;
// throw new RuntimeException("传入的数据类型不匹配");
}

}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class ComparableCircleTest {
public static void main(String[] args) {


ComparableCircle c1 = new ComparableCircle(3.4);
ComparableCircle c2 = new ComparableCircle(3.6);

int compareValue = c1.compareTo(c2);
if(compareValue > 0){
System.out.println("c1对象大");
}else if(compareValue < 0){
System.out.println("c2对象大");
}else{
System.out.println("c1与c2一样大");
}


int compareValue1 = c1.compareTo(new String("AA"));
System.out.println(compareValue1);
}
}
打赏一下作者~ ฅ( ̳• ◡ • ̳)ฅ