我对回调的个人理解

C 语言通过结构体成员获得结构体指针 通过结构体成员拿到结构体的指针,是C语言实现继承多态的基础。面向对象C编程可以参看这里OOC 面向对象C语言编程实践。这里详细介绍这个核心的操作方法。 /** * Get struct pointer from member pointer */ #define StructFrom2(memberPtr, structType) \ ((structType*) ((char*) m 阅读详情

解释下程序:

interface Incrementable {
  void increment();
}

// Very simple to just implement the interface:
class Callee1 implements Incrementable {
  private int i = 0;
  public void increment() {
    i++;
    System.out.println(i);
  }
}

class MyIncrement {
  void increment() {
    System.out.println("Other operation");
  }
  static void f(MyIncrement mi) { mi.increment(); }
}

// If your class must implement increment() in
// some other way, you must use an inner class:
class Callee2 extends MyIncrement {
  private int i = 0;
  private void incr() {
    i++;
    System.out.println(i);
  }
  private class Closure implements Incrementable {
    public void increment() { incr(); }
  }
  Incrementable getCallbackReference() {
    return new Closure();
  }
}

class Caller {
  private Incrementable callbackReference;
  Caller(Incrementable cbh) { callbackReference = cbh; }
  void go() { callbackReference.increment(); }
}

public class Callbacks {
  private static Test monitor = new Test();
  public static void main(String[] args) {
    Callee1 c1 = new Callee1();
    Callee2 c2 = new Callee2();
    MyIncrement.f(c2);
    Caller caller1 = new Caller(c1);
    Caller caller2 = new Caller(c2.getCallbackReference());
    caller1.go();
    caller1.go();
    caller2.go();
    caller2.go();
  }
} ///:~

结果是:
 Other operation
 1
 2
 1
 2

 我的理解:

       首先想有必要解释一下内部类和回调.知其然还要知其所以然,所以我会说一下为什么要使用内部类和回调,他们能有什么好处和完成什么工作.

  内部类就是声明在一个类里面的类,相对于内部类的我们称外部类,内部类包括有实例内部类和静态内部类,声明在方法中的我们称局部内部类,在这里我就只介绍实例内部类,其他的内部类的用法和规则你自己可以参考一下<<JAVA面向对象编程>>这本书

  我们用实例内部类有两个好处,其一可以简化编程,而且便于我们封装细节,这个作用了解了可以用来应付以后面试时遇到的面试老师,呵呵.其二,实例内部类可以随意访问外部类的所有成员变量,这也就是内部类最强大的地方.注意我这里说的时实例内部类,其他的内部类(如静态内部类)都有自己不同的访问规则,要区别对待哦.

  好了介绍了内部类,我再说说回调吧,说回调之前,我喜欢用一个我自己想的比喻来形容,可能比较好懂些.比如我(子类)现在又想养猫(接口的方法)又想养鱼(父类的方法)在我的家里,我喜欢鱼,觉得鱼可能对我的家以后的装饰更有用于是我先养了鱼(继承了父类的方法),但是我还是想养猫啊,而猫和鱼又不能同时一起养(父类的方法与继承的接口需要实现的方法同名,不能同时存在一个相同的名字空间),怎么办呢?于是我想了好办法,叫来我可爱的老婆(内部类),呵呵,我让我亲爱的老婆去养猫(继承接口实现其方法),但是我老婆很懒,她才不愿意去给猫买吃的了(内部类不具体的实现接口的方法),其实每次都还是我把猫粮买回来(外部类提供方法的实现)交给她就行了(内部类调用外部类实现的方法去实现接口的方法).这样当我想跟我的猫玩耍的时候(使用实现接口的方法)我就会找我老婆,让她给我把猫领出来玩.这样不就完成了我的目的了吗,当然为了每次我有途径联系到我的老婆(内部类)我自己必须给她配个手机(回调方法,返回内部类实例),这样我才能随叫随到,随到随用了对不~呵呵,提供方法返回内部类实例来执行相应接口的方法,其实这就是所谓的回调了

  最后说下回调的好处:回调实质上是指一个类尽管实际上实现了某种功能但是没有直接提供相应的接口,客户类可以通过这个类的内部类的接口来获得这种功能,这个内部类本身不提供真正的实现,仅仅调用外部类的实现.可见回调可以充分发挥了内部类所具有的访问外部类的实现细节的优势.

  解释完上面这些,你是否对程序有点理解了呢?

  没错,我们接下来分析程序:

首先一个接口:interface Incrementable {
          void increment();
        }

一个实现类,实现了Incrementable 接口:

class Callee1 implements Incrementable {
  private int i = 0;
  public void increment() {
    i++;
    System.out.println(i);
  }
}

 

然后我们看main方法
第一句Callee1 c1 = new Callee1();

然后是一个"情妇"注意不是我的老婆哦~呵呵,我的情妇专门负责返回一个Incrementable类型的引用变量,

当我这样Caller caller1 = new Caller(c1);的时候,实际上是让这个引用变量引用一个Callee1类型的实例,所以用

 caller1.go();方法时虽然caller1声明的是Caller,但是由于java的多态机制,实际上JVM会调用Callee1类的go()方法,所以你明白了吗结果第一个1,2就是这样来的.

再回到main方法

  先看这个:

class Callee2 extends MyIncrement {
  private int i = 0;
  private void incr() {
    i++;
    System.out.println(i);
  }
  private class Closure implements Incrementable {
    public void increment() { incr(); }
  }
  Incrementable getCallbackReference() {
    return new Closure();
  }
}

这个类就是一个外部类继承父类方法,内部类实现接口方法而调用外部类的实现的典型例子了,然后外部类会提供一个getCallbackReference()方法返回内部类实例.(Closure就是内部类了^_^)

注意:Callee2 c2 = new Callee2();
    MyIncrement.f(c2);

    Caller caller2 = new Caller(c2.getCallbackReference());

这里用了什么?没错就是用了回调了啦c2.getCallbackReference()获取了Incrementable的实现类让上面我提到过的Caller类型的引用变量指向他,然后在调用其go()方法,所以就出来结果后面两个1,2了咯.

   纵观程序,其实也就是用两种方法来获得两种实例,然后调用实例的go()方法而已啦,而且这两个实例所在的类对其go()方法叶实现的不一样,一个是实现接口的方法,一个是自调用自己的方法,这在java里面又涉及两个经典的讨论--组合模式与继承实现模式,对于这个我还是建议楼主去看一下书,我就不多介绍这两种模式的利弊了,要不然又是一篇论文了,哈哈.

  好了,就说这么多不知道楼主懂了多少,不过没关系,现在不知道不代表你将来不知道,只要你以后多看看有关jvm底层的书籍,你的很多疑惑将一下子豁然开朗了,呵呵,fighting!

  一切源于技术,一切源于开放~enjoying!

大疆视觉算法面试,手推极线几何这关刷掉了一半人 摘要:大疆机器视觉算法工程师面试重点考察目标检测工程优化、深度估计几何原理和视觉SLAM全流程。目标检测侧重模型压缩和部署优化,需掌握知识蒸馏、量化及算子融合;深度估计要求推导双目几何并理解单目深度恢复方法;视觉SLAM需熟悉前后端流程及ORB-SLAM3/VINS-Mono区别。面试常要求手推PnP等公式,注重实践能力。准备需重点练习公式推导和代码实现,掌握工程落地细节。 阅读详情

相关推荐

YOLOv12改进策略【模型轻量化】| 替换骨干网络为EfficientNet v1 高效的移动倒置瓶颈结构

本文记录的是基于。采用了创新性的方法,通过精心平衡网络和来提升性能。本文将的设计优势融入YOLOv12中,提升YOLOv12的性能与效率,使其在目标检测任务中表现更为出色。本文配置了原模型中的共种不同大小的模型结构,以满足不同的需求。

Limiiiing的博客 916

C语言——结构体

结构体在C编程或者说数据结构中有着举足轻重的地位,为了熟练地运用结构体,本文基本总结了结构体所有的知识点,包含结构体定义、初始化和引用、结构体传参、结构体指针,以及结构体内存对齐,还捎带介绍了位段的相关知识。

weixin_45389997的博客 7771

网络诈骗邮件的识别与分类技术研究.zip

网络诈骗邮件的识别与分类技术研究.zip

【C语言】结构体

struct — 结构体的关键字。 student —结构体的标签,可以随意的替换看你指向的对象是谁了。 structstudent ——叫做结构体类型。 大括号 { }里面的内容被称作是:成员变量, 注意大括号后面必须要有分号,可以加成员列表,分号前面内容,可以是全局的结构体变量(一般都不会去使用),在代码中我们要尽可能的去少的使用全局变量。 在函数中 mation —— 结构体类型的变量,当然这里我直接student mation;是可以的,因为我用了typedef关键字,当然这个是可 ......

"謓泽"正在路上朝着"攻城狮"方向"前进四"! 4198

【C语言】——结构体

摘要,写什么好呢?

yusjushd的博客 1831

C语言结构体详解

C语言结构体详解

qq_28576837的博客 1万+

c语言中结构体的用法

一、定义         由于一个数组中只能存放同一种类型的数据,很不方便,所以C语言允许用户自己建立由不同类型数据组成的组合型的数据结构,也就是结构体,通俗讲就像是打包封装,把一些有共同特征(比如同属于某一类事物的属性,往往是某种业务相关属性的聚合)的变量封装在内部,通过一定方法访问修改内部变量。 二、用法 1、先定义结构体类型,再定义结构体变量。 struct student{ ...

qlexcel的专栏 1万+

C语言typedef结构体的理解

在C语言里,struct用于定义一个数据类型------结构体,typedef用于给数据类型取别名。 typedef struct Student{ int Age; int Id[10]; }Stu; 表示给结构体变量struct Student取了一个别名Stu。这样下次定义一个结构体变量就可以写成Stu stu1。如果不用typedef。 struct Student{ int Age; int Id[10]; }Stu; 此时说明已经定义了一个结构体变量Stu,如

weixin_45395062的博客 3499

C语言之结构体

本文包括结构体的声明、初始化、自引用等基础知识,另外包括结构体的内存对齐,结构体实现位段。

x_p96484685433的博客 1283

c语言结构体名称是什么,C语言结构体

C语言结构体教程结构体(struct)是由一系列具有相同在结构体同时也是一些元素的集合,这些元素称为结构体的成员(member),且这些成员可以为不同的类型,成员一般用名字访问。C语言结构体定义语法struct structName{fieldType1 filed1;fieldType2 filed2;fieldType3 filed3;};参数参数描述struct定义结构体使用的关键字。str...

weixin_28304023的博客 3845

C 语言 【结构体】

结构体是一个自定义数据类型,这里可以做一个类比。让我们回顾一下什么是数组,数组是一种元素类型相同的集合,这个集合统称为数组。那么,结构体可以理解成一组元素类型不同的集合。再清晰地来说,结构是一些不同类型值的集合,这些值被称为成员变量(结构的每个成员变量可以是不同类型的值)。有了结构体类型,那如何定义变量,其实很简单。int x;int y;}p1;//声明类型的同时定义变量p1//定义结构体变量p2p1是在创建结构体类型时就创建的结构体变量,p2是在结构体创建之后创建的变量。

qq_70199082的博客 1328

C语言之结构体的总结

目录 一、什么是结构 二、结构的定义 三、结构体变量的定义和初始化 四、结构的自引用 五、结构变量的使用 1.结构变量成员的引用 2.结构变量的整体赋值 3.结构变量作为函数参数 六、结构指针 七、结构数组 八、结构体内存对齐 1.计算结构体大小 2.为什么内存的对齐 九、修改默认对齐数 一、什么是结构 C语言c语言的内置类型:char,short,int,long,float,double;自定义类型:结构体,枚举,联合体 结构类型是一种允许程序员把一些数据分量聚合成一.

Poem_coder的博客 3417

【C语言】结构体详解

在计算机编程的世界中,数据的组织和存储是至关重要的。C语言作为一门强大而灵活的编程语言,提供了结构体(Structures)这一强大的工具,使得我们能够更加有效地组织和管理数据。结构体是C语言中一种用户自定义的数据类型,它允许我们将不同数据类型的元素组合在一起,形成一个更为复杂的数据结构。通过结构体,我们可以模拟现实世界中的实体,将相关的信息组织起来,使得代码更加清晰、可读性更强。在这篇博客中,我们将深入探讨C语言结构体的概念、用法以及它在程序设计中的实际应用。

m0_68002296的博客 2100

C语言中什么是结构体,怎么定义结构体。

为什么要用结构体? 没有结构体之前,C语言中,数据的组织依靠:变量+数组。最初最简单的时候,只需要使用基本数据类型来定义单个变量,需要几个就定义几个,后来有时候需要很多意义相关的变量这时候数组出现了。数组解决了需要很多类型相同,意义相关的变量问题,但是数组是有限制的,数组的不足在于,一个数组只能存储很多个数据类型相同的变量。所以碰到需要封装几个类型不同变量的时候,数组就无能为力。这时候就...

初学者探索之路,认真当条汪 4050

C语言 结构体struct总结

一.前言 C语言提供了一些由系统提供好的数据类型,如:int,float,char等,用户可以在程序中用他们定义变量,解决一般的问题,但是在实际问题中只有这些数据类型是不够的,有时候我们需要其中的几种一起来修饰某个变量,在此情况下,使用简单的基本数据类型甚至是数组都是很困难的;我们就需要自己建立一些数据类型,并用它来定义变量。 二.结构体的引入 1.结构体的定义:由不同类型数据组成的组合型的数据结构称为结构体。 2.结构体的优点:结构体不仅可以记录不同类型的数据,而且使得数据结构是“高内 聚,低耦.

Mi-ronin的博客 3287

C语言结构体和C语言链表

前言:对于C语言指针方面,因为博主目前还不能够达到自己想要的水平,所以我就不在这里班门弄斧了,现在总结一下结构体,等再过段时间,我把指针弄的炉火纯青的成都的时候,我在来献丑吧 0v0 结构体 一、结构体类型的定义 二、结构体类型的定义于使用 1、先定义结构,在说明结构变量: 2、在定义结构类型的同时说明结构变量 3、直接说明结构变量 三、结构体类型变量的赋值于初始化 四、结构体类型数组的...

4177

C语言结构体总结

一.什么是结构体 我们知道数组,它是一组具有相同类型的数据的集合。但在实际的编程过程中,我们往往还需要一组类型不同的数据,例如对于学生信息登记表,姓名为字符串,学号为整数,年龄为整数,所在的学习小组为字符,成绩为小数,因为数据类型不同,显然不能用一个数组来存放。在C语言中,我们可以使用结构体来存放一组不同类型的数据。 结构体是一种集合,它里面包含了多个变量或数组,它们的类型可以相同,也可以不同,每...

qq_45661125的博客 1516

C语言结构体指针

当一个指针变量指向结构体时,我们就称它为结构体指针。struct 结构体名 * 变量名;//结构体 struct stu {//姓名 int num;//学号 int age;//年龄 char group;//所在小组 float score;//成绩 } stu1 = {//结构体指针 struct stu * pstu = & stu1;//姓名 int num;//学号 int age;//年龄 char group;//所在小组 float score;

AnChenliang_1002的博客 2337
上一篇: 不要让对象成为奴隶
Jthinking
博客等级 码龄20年 0粉丝 11原创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值