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

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

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


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中是不允许的。

时间: 2024-12-23 02:17:14

接口对象的实例化在接口回调中的使用的相关文章

Delphi接口的底层实现(接口在内存中仍然有其布局,它依附在对象的内存空间中,有汇编解释)——接口的内存结构图,简单清楚,深刻 good

引言 接口是面向对象程序语言中一个很重要的元素,它被描述为一组服务的集合,对于客户端来说,我们关心的只是提供的服务,而不必关心服务是如何实现的:对于服务端的类来说,如果它想实现某种服务,实现与该服务相关的接口即可,它也不必与使用服务的客户端进行过多的交互.这种良好的设计方式已经受到很广泛的应用. 早在Delphi 3的时候就引入了接口的概念,当时完全是因为COM的出现而诞生的,但经过这么多版本的进化,Delphi的接口已经成为Object Pascal语言的一部分,我们完全可以用接口来完成我们的

java类与对象基础--抽象类和接口

在java的类体系中,有两个比较特殊的抽象体--抽象类和接口.抽象体并不可以拥有具体的对象(而且接口甚至不是类),但是它们却是在java设计领域非常重要的两个概念,很多优秀的设计模式都是基于这两个概念的,尽管我们在进行应用开发时可能用的比较少,但是在真正的大型项目的架构开发中,他们是用来确定整个项目的整体框架的,是必不可少的.下面对抽象类以及接口的一些基本语法知识进行整理,用以备忘. 一.什么是抽象类?什么是接口? 首先,前面也说了,抽象类和接口都不可直接实例化,它很多时候只是在声明引用的时候拿

8.python之面相对象part.4(接口继承的思想设计,这种东西也叫抽象类)

接口继承也叫做程序的归一化设计,这种东西也有人叫它抽象类. 那么什么又是抽象类呢? 抽象类这种东西,只能被继承,不可以被实例化. 如果说一个类是从一堆对象中抽取出来的,那么一个抽象类,就是从一堆类中抽取出来的. 简单的说,抽象类与普通类最大的不同之处就是,抽象类中的方法都试抽象的,没有办法实现具体的功能,这种抽象类不能生成对象,只可以被继承,但是,继承了这个抽象类的子类,必须去实现抽象类所抽象出来的方法!这个概念很像接口,所以说,我把它理解为接口式的继承. 关于抽象类的定义概念,可以参考下面这个

基础学习day07---面向对象三---继承,接口与 抽象类

一.继承 1.1.继承概念 将对象的共性抽取出来.提取出一个单独的类. 继承使用复用以前的代码非常容易,能够大大的缩短开发周期,降低开发成本,同时增加程序的易维护性 继承使重一个类A能够直接使用另外一个类B的属性和方法的一种途径 类A可以有自己的属性和方法通过 extends 关键字让类与类之间产生继承关系. 让类和类之间产生了关系,有了这个关系,才有了多态的特性. 注意:千万不要为了获取其他类的功能,简化代码而继承. 必须是类与类之间有所属关系才可以继承,所属关系是 is  a.的关系 1.2

17. C# -- 对象,类,接口,继承,多态

UML (unified modeling language),统一建模语言来研究类和对象 对象:类名 myPrinter:Printer +Instant:bool  可访问性:成员名:成员的类型 对象:即OPP应用程序的组成部件.包括数据和操作,类的是实例 对象的属性/字段:  数据通过属性供外面代码使用  <string>.Length 对象的方法:  操作可以通过方法来供外面代码使用  <string>.ToUpper() 类:实例化对象的类型定义 类成员包括:属性和方法

client怎样调用IBinder接口对象

代码: public void funclick(View view){ Intent _intent = new Intent(MainActivity.this,MyService.class); bindService(_intent, conn, BIND_AUTO_CREATE); } private ServiceConnection conn = new ServiceConnection() { @Override public void onServiceDisconnecte

客户端如何调用IBinder接口对象

代码: public void funclick(View view){ Intent _intent = new Intent(MainActivity.this,MyService.class); bindService(_intent, conn, BIND_AUTO_CREATE); } private ServiceConnection conn = new ServiceConnection() { @Override public void onServiceDisconnecte

跟着百度学PHP[4]OOP面对对象编程-12-对象接口技术(interface)

PHP与大多数面向对象编程语言一样,不支持多重继承.也就是说每个类只能继承一个父类. 接口正是解决每个类只能继承一个父类这个问题的 接口用什么权限,继承的那个方法也要使用什么权限. 接口的声明使用:interface 接口的继承使用:implements 目录++++++++++++++++++++++++++++++++++++++++++++ 00x1 接口的声明以及接口的引用(案例一) 00x2 如何继承多个接口(案例二) 00x3 判断某个对象是否实现了某个接口(案例三) +++++++

服务端如何暴露IBinder接口对象

服务端如何暴露IBinder接口对象: package com.example.mydownload; import android.app.Service; import android.content.Intent; import android.os.Binder; import android.os.IBinder; public class MyService extends Service { //接口对象 private IBinder mybBinder = new MyBind