一、static
static的意思是静态的、全局的,一旦被修饰,说明被修饰的东西在一定范围内是共享的,谁都可以访问。要注意并发读写的问题。
static只能修饰类变量、方法和方法块。
如果static 修饰变量是public,表示该变量任何类都可以直接访问,不需要初始化,直接使用 类名.static变量 访问。这时候我们要注意线程安全问题,因为当多人线程同时对共享变量进行读写时,很有可能出现并发问题,例如: public static List
解决方法有两个:
1、把线程不安全的ArrayList换成 线程安全的CopyOnWriteArrayList;
2、每次访问时手动加锁
static 修饰方法时,代表该方法和当前类是无关的,任意类都可以直接访问(如果权限是public 的话)
static修饰方法块时,我们叫做静态块,静态块常常用于在类启动之前,初始化一些值。
初始化时机:父类的静态变量和静态块比子类优先初始化;静态变量和静态块比类构造器优先初始化
二、final
1、被final 修饰的类,表明该类是无法继承的
2、被final修饰的方法,表明该方法是无法覆写的
3、被final修饰的变量,说明该变量在声明的时候,就必须初始化完成,而且以后不能修改其内存地址。注意无法修改其内存地址,并没有说无法修改其值
**
三、default
default关键字一般会用在接口的方法上,意思是对于该接口,子类是无需强制实现的,但自已必须有默认实现
四、transient
transient关键字我们常用来修饰类变量,意思是当前变量是无需进行序列化的。在序列化时,就会忽略该变量。
面试题:
一、如何证明static 静态变量和类无关
答:从三个方面就可以看出静态变量和类无关
1、我们不需要初始化类就可直接使用静态变量;
2、我们在类中写个main方法运行,即便不写初始化类的代码,静态变量都会自动初始化;
3、静态变量只会初始化一次,初始化完成之后,不管我再new多少个类出来,静态变量都不会初始化。
二、常常看见变量和方法被static和final两个关键字修饰,为什么这么做
答: 1、变量和方法于类无关,可以直接使用,使用比较方便
2、强调变量内存地址不可变,方法不可继承覆写,强调了方法内部的稳定性
三、catch中发生了未知异常,finally还会执行么?
答:会的,catch发生异常,finaly还会执行的,并且是finally执行完成之后,才会抛出catch中的异常