assert
1、定义
assert(断言)是为了方便调试程序,并不是发布程序的组成部分。编写代码时,总是会做出一些假设,断言就是用于在代码中捕捉这些假设。
默认情况下,JVM 是关闭断言的。因此如果想使用断言调试程序,需要手动打开断言功能。在命令行模式下运行 Java 程序时可增加参数 -enableassertions 或者 -ea 打开断言。可通过 -disableassertions 或者 -da 关闭断言(默认情况,可有可无)。
2、使用
断言是通过关键字 assert 来定义的,一般有两种形式:
- assert ; 举个🌰:
boolean isStudent = false;
assert isStudent;
- assert : ; 举个🌰:
boolean isSafe = false; assert isSafe : "Not Safe at all";
更好的替代品:JUnit。
native
1、定义
native 关键字说明其修饰的方法是一个原生态方法,方法对应的实现不是在当前文件,而是再用其他语言(如 C 和 C++)实现的文件中。
Java 语言本身不能对操作系统底层进行访问和操作,但是可以通过 JNI 接口调用其他语言来实现对底层的访问。
2、JNI
JNI(Java Native Interface)允许 Java 代码和其他语言写的代码进行交互。通过 JNI,我们就可以通过 Java 程序(代码)调用到操作系统相关的技术实现的库函数,从而与其他技术和系统交互,使用其他技术实现的系统的功能;同时其他技术和系统也可以通过 JNI 提供的相应原生接口开调用 Java 应用系统内部实现的功能。
JNI 的缺点:
- 程序不再跨平台。要想跨平台,必须在不同的系统环境下重新编译本地语言部分。
- 程序不再是绝对安全的,本地代码的不当使用可能导致整个程序崩溃。一个通用规则是,应该让本地方法集中在少数几个类当中。这样就降低了 Java 和 C 之间的耦合性。
strictfp
strictfp, 即 strict float point(精确浮点),用于确保浮点数运算的准确性。可应用于类、接口或方法。一旦使用了 strictfp 来声明一个类、接口或者方法,那么在所声明的范围内,Java 编译器以及运行环境会完全依照 IEEE 二进制浮点数算术标准来执行,在这个关键字声明的范围内所有浮点数的计算都是精确的。
需要注意的是,当一个类被 strictfp 修饰时,所有方法都会自动被 strictfp 修饰。
因此,strictfp 可以保证浮点数运算的精确性,而且在不同的硬件平台会有一致的运行结果。
transient
将不需要序列化的属性前添加关键字 transient,序列化对象(一个对象只要实现了 Serilizable 接口,这个对象就可以被序列化)的时候,这个属性就不会被序列化。
- 一旦变量被 transient 修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问。
- transient 关键字只能修饰变量,而不能修饰方法和类。注意,本地变量是不能被 transient 关键字修饰的。变量如果是用户自定义类变量,则该类需要实现 Serializable 接口。
- 被 transient 关键字修饰的变量不再能被序列化,一个静态变量不管是否被 transient 修饰,均不能被序列化。