Java中常见关键字
static
static变量表示修饰的东西在一定范围内共享,应注意读写并发问题。
- static修饰类变量
- 该变量如果用public修饰,任何类都可以直接访问,无需初始化类,访问方式:类名.static 变量。
- 应注意线程安全,解决方法如下:
- 每次访问手动加锁
- 将静态变量定义为线程安全的类型。例如:不使用ArrayList,而使用CopyOnWriteArrayList。
- static修饰方法
- 表明该方法和当前类无关。如果用public修饰,任意类可以直接访问
- 被修饰的方法只能调用该类中静态方法,不能调用普通方法
- 方法中变量执行时无线程安全问题,数据运行时在栈中,栈中每个进程是隔离的。
- static修饰方法块
- 静态块常用于在类启动前初始化某些值,具体顺序为
实现函数如下:
父类
- 静态块常用于在类启动前初始化某些值,具体顺序为
public class parentClass {
public static List<String> l=new ArrayList(){{
System.out.println("父类静态变量初始化");
}};
public static void testStatic(){
System.out.println("父类静态方法被调用");
}
static {
System.out.println("父类静态块初始化");
}
public parentClass(){
System.out.println("父类构造函数初始化");
}
}
子类
public class childClass extends parentClass {
public static List<String> l=new ArrayList(){{
System.out.println("子类静态变量初始化");
}};
public static void testStatic(){
System.out.println("子类静态方法被调用");
}
static {
System.out.println("子类静态块初始化");
}
public childClass(){
System.out.println("子类构造函数初始化");
}
public static void main(String[] args) {
System.out.println("main 函数被调用");
new childClass();
}
}
final
- 修饰类,无法继承
- 修饰方法,无法覆写
- 修饰变量,声明时必须初始化,无法修改其内存地址,可以修改值。(以String为例,修改值后,内存地址改变)
try,catch,finally
这三个关键词用于捕捉异常,代码在try中执行,catch中处理异常,最终执行finally(可省略)。
测试代码如下:
public void testTry(){
try {
System.out.println("try语句块运行");
throw new RuntimeException("try Exception");
}
catch (Exception e){
System.out.println("catch语句块运行");
throw new RuntimeException("catch Exception");
}
finally {
System.out.println("finally语句块运行");
}
}
测试结果为:
如下图所示,try语句块中异常被catch捕捉,catch中异常是先运行完finally中语句,未被捕捉再抛出。
volatile
volatile意思是可见的,修饰变量时,变量变为共享变量,即:变量的值一经修改会通知其他线程变量已经被修改。
【例子】:线程1和线程2都读取被volatile修饰的变量X,线程1修改X值并写入内存中,此时内存中存储的X值和线程2读取的X值不同。因为变量X被volatile修饰,内存通知所有CPUX值修改成功,线程2从CPU缓存中读取新的X值,解决线程和内存中值不同步问题。
transient
该关键字用于修饰类变量,表明在序列化时无需序列化该类。
default
该关键字用于修饰接口,表明对于此接口子类无需强制实现(子类必须有默认实现)。
常见问题
- 变量和方法经常被static和final两个关键字修饰,为什么?
答:1.(static)变量和方法与类无关,可以直接使用比较方便。
2.(final)强调变量内存地址不可变,方法不能覆写,增强方法内部稳定性。 - 如何证明static静态变量和类无关?
- 不需要初始化类就可以初始化静态变量。
- 静态变量只初始化一次。初始化后,无论是否生成类对象,静态变量都不会初始化。