接口对象的实例化在接口回调中的使用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了接口对象的实例化在接口回调中的使用相关的知识,希望对你有一定的参考价值。

 

首先澄清一个问题,就是接口不仅可以声明对象,而且可以把对象实例化!作用见下文。

接口回调:可以把实现某一接口类创建的对象的引用赋给该接口声明的接口变量,那么该 
接口变量就可以调用被类实现的接口中的方法。实际上,当接口变量调用被类实现的接口 
中的方法时,就是通知相应的对象调用接口方法。 
我们看下面的例子:

 

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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
interface Computerable
 
{
 
public double area();
 
}
 
 
 
class Rec implements Computerable
 
{
 
double a,b;
 
Rec(double a,double b)
 
{
 
this.a = a;
 
this.b = b;
 
}
 
public double area() {
 
return (a*b);
 
}
 
}
 
 
 
class Circle implements Computerable
 
{
 
double r;
 
Circle(double r)
 
{
 
this.r = r;
 
}
 
public double area() {
 
return (3.14*r*r);
 
}
 
}
 
 
 
class Volume
 
{
 
Computerable bottom;
 
double h;
 
Volume(Computerable bottom, double h)
 
{
 
this.bottom = bottom;
 
this.h = h;
 
}
 
 
 
public void changeBottome(Computerable bottom)
 
{
 
this.bottom = bottom;
 
}
 
 
 
public double volume()
 
{
 
return (this.bottom.area()*h/3.0);
 
}
 
}
 
 
 
public class InterfaceRecall {
 
public static void main(String[] args)
 
{
 
Volume v = null;
 
Computerable bottom = null;
 
 
 
//借口变量中存放着对对象中实现了该接口的方法的引用
 
bottom = new Rec(3,6);
 
System.out.println("矩形的面积是:"+bottom.area());
 
v = new Volume(bottom, 10);
 
//体积类实例的volum方法实际上计算的是矩形的体积,下同
 
System.out.println("棱柱的体积是:"+v.volume());
 
 
 
bottom = new Circle(5);
 
System.out.println("圆的面积是:"+bottom.area());
 
v.changeBottome(bottom);
 
System.out.println("圆柱的体积是:"+v.volume());
 
 
 
}
 
}

 

输出: 
矩形的面积是:18.0 
棱柱的体积是:60.0 
圆的面积是:78.5 
圆柱的体积是:261.6666666666667


通过上面的例子,我们不难看出,接口对象的实例化实际上是一个接口对象作为一个引用 
,指向实现了它方法的那个类中的所有方法,这一点非常象C++中的函数指针,但是却是有 
区别的。java中的接口对象实例化实际上是一对多(如果Computerable还有其他方法,bo 
ttom仍然可以调用)的,而C++中的函数指针是一对一的。 
但是需要注意的是,接口对象的实例化必须用实现它的类来实例化,而不能用接口本身实 
例化。用接口本身实例化它自己的对象在Java中是不允许的。

以上是关于接口对象的实例化在接口回调中的使用的主要内容,如果未能解决你的问题,请参考以下文章

android 观察者模式

android中的回调简单认识

JAVA回调机制和观察者模式实例分享

06 Listener,Filter,BeanUtils

Java中啥是接口回调?

BeanPostProcessor接口