1. instanceof
用来测试一个对象是否为一个类的实例。
- 注意事项:
(1)Obj必须为引用类型,不能是基本类型。
(2)obj为null时,将返回false。(java分为两种数据类型:基本数据类型和引用数据类型。并且还有一种特殊的null类型,该类型没有名字。)
(3)当obj为class接口的实现类或者为class类的直接或者间接子类,返回true。
2. assert
断言是一种软件调试方法。 作用:对一个Boolean表达式进行检查,一个正确运行的程序保证Boolean值为true,若为false,则说明程序不正确,系统需要提供警告信息并且退出程序。
- assert的表达方式:
(1)assert expression1
(2)assert expression1:expression2
其中expression1标识一个Boolean表达式,expression2表示一个基本类型或者一个对象。
虽然assert的功能与if判断类似,但是二者存在本质性的区别:assert一般用于调试程序。如果不小心用它来控制流程的业务流程,那在调试之后去掉assert就意味着修改了程序的正常逻辑,而if随机逻辑判断,本身就是用来控制程序流程的。 - assert的应用范围:
(1)检查控制流
(2)检查输入参数是否有效
(3)检查函数结果是否有效
(4)检查程序不变量
在实际开发中,assert用来保证程序的正确性,通常开发和测试使用,为了调高效率,软件发布后,assert默认关闭。
final
- 根据上下文环境,final的含义存在着细微的区别,但通常它指的是”这是无法改变的“。
- 编译器常量:必须是基本数据类型,并且以关键字final表示。在对这个常量进行 定义的时候,必须对其进行赋值(可以在编译时执行运算)
- 当对象引用运用final时,final使引用恒定不变。一旦引用被初始化指向一个对象,就无法再把它改为指向另一个对象。
class Value {
int i;
public Value(int i) {
this.i = i;
}
}
public class FinalData {
private static Random rand = new Random(47);
private String id;
public FinalData(String id) {
this.id = id;
}
//编译器常量
private final int valueOne = 9;
private static final int VALUE_TWO = 99;
//典型的公共常量,定义为public,则可用于包之外。定义为static强调只有一份
public static final int VALUE_THREE = 39;
//final修饰的数据在编译时不一定知道它的值
private final int i4 = rand.nextInt(20);
private static final int INT_5 = rand.nextInt(20);
//为了表明final对于引用类型的意义(final修饰的是引用,引用上存的是对象的地址值,所以地址值不能盖面,对象也不能改变)。
private Value v1 = new Value(11);
private final Value v2 = new Value(22);
private static final Value VAL_3 = new Value(33);
private final int[] a = {1, 2, 3, 4, 5, 6};
@Override
public String toString() {
return id + "; " + "i4=" + i4 + ", INT_5 = " + INT_5;
}
public static void main(String[] args) {
FinalData fd1 = new FinalData("fd1");
//fd1.valueOne++; 被final修饰的不能被修改
fd1.v2.i++;
fd1.v1 = new Value(9);
for (int i = 0; i < fd1.a.length; i++) {
fd1.a[i]++;
}
System.out.println(fd1);
System.out.println("Creating new FinalData");
FinalData fd2 = new FinalData("fd2");
//为了说明final数值定义为静态和非静态的区别。(静态的只加载一次)
System.out.println(fd1);
System.out.println(fd2);
//结果为:
/*fd1; i4=15, INT_5 = 18
Creating new FinalData
fd1; i4=15, INT_5 = 18
fd2; i4=13, INT_5 = 18*/
}
}
- 空白final:声明为final但又未给定初值的域。但必须在每个构造器中用表达式final进行赋值。
- final参数:Java允许在参数列表中以声明的方式将参数指明为final,这意味着你无法在方法中更改参数。
- final方法:把方法锁定,以防任何继承修改它的含义(在继承中使方法行为保持不变,并且不会被覆盖,类中所有的private方法都隐式地指定为final的。)
- final类:该类不允许继承。