instanceof
在Java中可以使用instanceof
关键字判断一个引用是否在一个指定类型里面,返回Boolean结果
如:
Animal dog1 = new Dog();
Animal cat = new Cat();
Dog dog2 = new Dog();
if(cat instanceof Cat) // 返回true
if(cat instanceof Animal) // 返回true
if(dog1 instanceof Cat) // 返回false
if(dog2 instanceof Dog) // 返回true
注意,基础数据类型不能使用instanceof
int a = 100;
System.out.println(a instanceof Object); // 报错
System.out.println(null instanceof Object); //false
null 不属于任何类型,类也不能为null
final
final
关键字用于修饰类,属性,参数,变量和方法,表示最终的
用final
修饰的结果:
- 修饰类,表示该类为最终类,不能被继承
- 修饰属性,表示该属性的值不能发生变化
- 修饰方法,表示该方法不能被重写,重载不受影响
- 修饰参数和变量,表示参数或者变量不能被更改
修饰类
用final
修饰的类不能被继承
public final class A{}
public class B extends A{} //报错
被final
修饰的类里面的所有方法都默认为final
方法
修饰方法
使用final
修饰的方法不能被子类重写,但是不影响当前类的重载
public class A{
public final void method(){}
// 重载1
public final void method(int i){}
// 重载2
public void method(int i, double j){}
}
public class B extends A{
@Override
public final void method(){} // 报错
@Override
public final void method(int i){} // 报错
// 可以重写
@Override
public void method(int i, double j){}
}
修饰属性
被final
修饰的属性表示常量,也就是不允许被修改的,只允许有三种赋值方法:
-
定义的时候赋值
public final int a = 666
; -
在构造函数中赋值
final int a;
public A(){ a = 666 ;} -
在初始化块和构造函数中进行初始化
public class A{
public final int a = 666;
public final int b;
public final int c;
public final double d; // 报错 不允许没有赋值的final属性,没有默认值
{
b = 666;
}
public A(){
c = 888;
}
}
修饰变量
final
可以修饰参数或者变量,实质上参数即局部变量。和修饰成员属性一样,final
修饰变量有两种类型,表示的意义一样,但是操作不通
- 修饰基本类型变量,表示变量的值不可改变
- 修饰引用类型变脸时,变量指向的兑现地址不可改变,但是对象内容可以改变
如:
final int a = 1; //a的值初始化之后不可改变
final int[] b = new int[] {1,2,3};
b = new int[] {4,5,6} //报错,无法更改对象地址
b[0] = 111; // 可以更改对象内容
b[1] = 222;
b[3] = 333;
静态常量
结合 static
final
关键字可以用来定义静态常量,也就是编译器常量
public class A{
public static final int CONSTANT = 100;
private static final int CONSTANT_SOMETHING;
static {
CONSTANT_SOMETHING = 123;
}
}
编译器常量对程序的运行速度有自动优化,推荐使用
注意静态常量通常使用全大写字母加下划线,普通常量和普通变量使用相同命名规则
final 的应用:
- 如果没有明确需要开放继承,那么尽量使用 final 修饰类
- 私有 private 方法默认是 final 最终的,无需添加 final 关键字
- 仅初始化一次的只读属性优先使用 final 修饰,如果是常量则使用 static final
- 提倡使用 final 修饰变量,大部分情况下编译器会自动优化
- 如果可以,优先使用 final 修饰属性,特别在多线程中具有先天并发特性