博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java核心技术 卷I 基础知识 学习笔记(6)
阅读量:4169 次
发布时间:2019-05-26

本文共 2126 字,大约阅读时间需要 7 分钟。

参考:Java核心技术 卷I 基础知识

接口,主要用来描述类具有什么功能,而并不给出每个功能的具体实现。一个类可以实现一个或多个接口,并在需要接口的地方,随时使用实现了相应接口的对象。接口不是类,是对类的一组需求描述,这些类要遵从接口描述的统一格式进行定义。

接口中的所有方法自动地属于public。

接口中可以定义常量。接口不能包含实例域。

提供实例域和方法实现的任务应该由实现接口的那个类来完成。因此,可以将接口看成是没有实例域的抽象类。

接口不是类,尤其不能使用new运算符实例化一个接口。

不能构造接口的对象,但可以声明接口的变量。

接口变量必须引用实现了接口的类对象。

接口中的域被自动设为public static final。

如果先在一个接口中将一个方法定义为默认方法,然后又在超类或另一个接口中定义了同样的方法。Java规则如下:

(1)超类有限。如果超类提供了一个具体方法,同名且有相同的参数类型的默认方法会被忽略。

(2)接口冲突。如果一个超接口提供了一个默认方法,另一个接口提供了同名且参数类型(不论是否默认参数)相同的方法,必须覆盖这个方法来解决冲突。

回调是一种常见的程序设计模式。在这种模式中,可以指出某个特定事件发生时应该采取的动作。

lambda表达式是一个可传递的代码块,可以在以后执行一次或多次。

lambda表达式由3个部分:

  1. 一个代码块
  2. 参数
  3. 自由变量的值,这是指非参数且不再代码中定义的变量。

规则:lambda表达式中捕获的变量必须是实际上的最终变量。实际上的最终变量是指这个变量初始化之后就不会再为它赋新值。lamdba表达式与嵌套块有相同的作用域。这里同样适用命名冲突和遮蔽的有关规则。在方法中,不能有两个同名的局部变量,因此,lambda表达式中同样也不能有同名的局部变量。在一个lambda表达式中使用this关键字时,是指创建这个lambda表达式的方法的this参数。

使用lambda表达式的重点是延迟执行。毕竟,如果想要立即执行代码,完全可以直接执行,而无需把它包装在一个lambda表达式中。之所以希望以后再执行代码,这有很多原因:

  • 在一个单独的线程中运行代码
  • 多次运行代码
  • 在算法的适当位置运行代码
  • 发生某种情况时执行代码
  • 在必要时才运行代码

内部类是定义在另一个类中的类。使用内部类的原因是:

  • 内部类方法可以访问该类定义所在的作用域中的数据,包括私有的数据
  • 内部类可以对同一个包中的其他类隐藏起来。
  • 当想要定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷。

静态内部类,这种内部类只是为了把一个类隐藏在另外一个类的内部,并不需要内部类引用外围类对象。为此,可以将内部类声明为static,以便取消产生的引用。

代理

利用代理可以在运行时创建一个实现了一组给定接口的新类。这种功能只有在编译时无法确定需要实现哪个接口时才有必要使用。

代理类可以在运行时创建全新的类。这样的代理类能够实现指定的接口。尤其是,它具有下列方法:

  • 指定接口所需要的全部方法
  • Object类中的全部方法

然而,不能再运行时定义这些方法的新代码,而是要提供一个调用处理器。调用处理器是实现了InvocationHandler接口的类对象。在这个接口中只有一个方法:invoke。

无论何时调用代理对象的方法,调用处理器的invoke方法都会被调用,并向其传递Method对象和原始的调用参数。调用处理器必须给出处理带哦用的方法。

创建一个代理对象,需要使用Proxy类的newProxyInstance方法。这个方法有三个参数:

  • 一个类加载器。作为Java安全模型的一部分,对于系统类和从因特网上下载下来的类,可以使用不同的类加载器。
  • 一个Class对象数组,每个元素都是需要实现的接口。
  • 一个调用处理器

使用代理可能处于很多原因,例如:

  • 路由对远程服务器的方法调用
  • 在程序运行期间,将用户接口事件与动作关联起来
  • 为调试,跟踪方法调用

代理类是在程序运行过程中创建的。一旦被创建,就变成了常规类,与虚拟机中的任何其他类没有什么区别。

所有的代理类都扩展于Proxy类。一个代理类只有一个实例域--调用处理器,它定义在Proxy的超类中。为了履行代理对象的职责,所需要的任何附加数据都必须存储在调用处理器中。

所有代理类都覆盖了Object类中的toString、equals和hashCode。如同所有的代理方法一样,这些方法仅仅调用了调用处理器的invoke。Object类中的其他方法没有被重新定义。

对于特定的类加载器和预设的一组接口来说,只能有一个代理类。也就是说,如果使用同一个类加载器和接口数组调用两次newProxyInstance方法的话,那么久只能够得到同一个类的两个对象,也可以利用getProxyClass方法获得这个类。

代理类一定是public和final。如果代理类实现的所有接口都是public,代理类就不属于某个特定的报。否则,所有非公有的接口都必须属于同一个包。

可以通过调用Proxy类中的isProxyClass方法检测一个特定的Class对象是否代表一个代理类。

转载地址:http://mryai.baihongyu.com/

你可能感兴趣的文章
poj 1860 拓扑。。
查看>>
poj 2553 The Bottom of a Graph 未完
查看>>
inux下如何统计一个目录下的文件个数以及代码总行数(转)
查看>>
Linux下 虚拟机Bochs的使用
查看>>
glib-读取配置文件
查看>>
SonarQube 静态代码检查的安装
查看>>
嵌入式Linux驱动开发的知识图谱
查看>>
Algorithm 4th environment setup
查看>>
Linux设备驱动开发基础之互斥与同步基础
查看>>
Linux驱动开发之内存管理基础
查看>>
用gitlabCI快速搭建一个GitServer与CI
查看>>
SPI Nor Flash
查看>>
ARM Linux BenchMark
查看>>
完整精确导入Kernel与Uboot参与编译了的代码到Source Insight,Understand, SlickEdit
查看>>
Freescale IMX6 Android (5): APP通过JNI控制LED
查看>>
PPT分享: Linux启动流程 关于initrd与initramfs的区分及其发展历程
查看>>
Freescale IMX6 Android (7): Android启动动画死循环 Home界面不出来与pid XXX exit 可能的原因汇总
查看>>
Yocto i.MX6 (TQIMX6) (01) : 3.14.28内核的适配
查看>>
Yocto tips (6): Yocto中如何共享已经下载的文件
查看>>
Yocto tips (1): Yocto 编译后文件放在了哪里 输出文件位置
查看>>