java中的静态修饰符
修饰符static
: 是一个关键字,用于修饰成员变量和成员方法
特点
- 被所有对象共享
- 可以使用类名调用
- 静态加载优先于对象
- 随着类的加载而加载
注意事项
静态方法
静态方法只可以调用静态的成员(包括方法和变量)
非静态方法
既可以调用非静态方法和变量,也可以调用静态的方法和变量
由于静态方法优先于对象创建,故静态方法中没有
this
对象
使用场景
static
常用来修饰工具类中的方法和变量,例如JDK中Math
工具类等。
java中的代码块
基本概念
形式如下:
1 | { |
分类:
局部代码块
和局部变量类似,出现在方法内部,主要用于限制变量和方法的作用域,即代码块外不能访问代码块中的变量和方法
构造代码块
和类中的构造方法类似,出现在类内部,用来存放基于类的所有对象的公共代码部分,可以降低代码冗余度,会随着对象的创建自动调用
静态代码块
和静态方法类似,出现在类内部,用来存放类中需要初始化的一些代码(如驱动),随着类的加载而加载,并且自动调用
同步代码块
用于不同线程间的同步问题
一个static和代码块的面试题
1 | public class BlockTest { |
问题:代码如上,请写出程序的执行顺序
分析如下:
首先,程序启动,JVM
会加载main
函数所在类,即BlockTest
这个类,这时候它的静态代码块随之加载并自动执行,打印"BlockTest静态代码块执行"
。由于main
的调用是基于类的加载,并未实例化BlockTest
,故其局部代码块和构造方法都不会执行。
接着,调用main
函数,打印"BlockTest的主函数执行了"
。接着执行Coder c = new Coder()
,会加载Coder
类,调用其静态代码块,打印"Coder静态代码块执行"
。随后,在生成c
对象中,首先调用其类中代码块,打印"Coder构造代码块执行"
,然后调用其构造方法,打印"Coder无参空构造执行"
。
最后,执行Coder c2 = new Coder()
,和上面类似。不同的是,这时Coder
类已经加载,故不会再次调用其静态代码块。但再次生成了一个新的对象c2
,因此会调用其类中代码块,打印"Coder构造代码块执行"
,接着调用其构造方法,打印"Coder无参空构造执行"
。
总结:整个程序的打印输出为:
1 | BlockTest静态代码块执行 |