static 之 静态初始化块
初始化块
在类的声明中,可以包含多个初始化块,当创建类的实例时,就会依次执行这些代码块。
1.初始化块用法:
Java 中可以通过初始化块进行数据赋值。如:
public class Test {
public static void main(String[] args) {
String name;//定义成员变量
{
name = "test";//通过初始化块为变量赋值
}
}
}
2.初始化块被调用的条件
只有在创建类的实例时才会调用初始化块,当没有实例化类时,不会执行初始化块。如:
1. 没有创建类的实例,运行main函数,不会触发初始化块
代码块
package com.yubai.javatest.test;
public class Test {
public static String str;
{
System.out.println("初始化1");
}
{
System.out.println("初始化2");
}
public static void main(String[] args) {
System.out.println(",....");
}
}
运行结果
2. 创建类的实例,运行main函数,会按着顺序依次触发初始化块
代码块
package com.yubai.javatest.test;
public class Test {
public static String str;
{
System.out.println("初始化1");
}
{
System.out.println("初始化2");
}
public static void main(String[] args) {
Test t = new Test();
System.out.println(",....");
}
}
运行结果
3. 创建类的实例,运行main函数,会按着顺序依次触发初始化块,构造函数
代码块
package com.yubai.javatest.test;
public class Test {
public static String str;
{
System.out.println("初始化1");
}
{
System.out.println("初始化2");
}
public Test() {
System.out.println("构造函数");
}
public static void main(String[] args) {
Test t = new Test();
System.out.println(",....");
}
}
运行结果
4. 运行main函数,调用方法,没有创建类的实例,不会触发构造函数和初始化块
代码块
package com.yubai.javatest.test;
public class Test {
public static String str;
{
System.out.println("初始化1");
}
{
System.out.println("初始化2");
}
static{
str = "aaa";
System.out.println("静态初始化2");
}
public Test() {
System.out.println("构造函数");
}
public static void test1(){
System.out.println("测试初始化块被调用的次数,和静态初始化块被调用的次数 --- 调用test1");
}
public static void test2(){
System.out.println("测试初始化块被调用的次数,和静态初始化块被调用的次数 ------ 调用test2");
}
public static void main(String[] args) {
//Test t = new Test();
test1();
test2();
}
}
运行结果
3. 初始化块被调用次数
随着创建类的对象的而被调用。就是说,创建几次对象,初始化块和构造函数就被调用几次
代码块1
package com.yubai.javatest.test;
public class Test {
public static String str;
{
System.out.println("初始化1");
}
{
System.out.println("初始化2");
}
static {
str = "aaa";
System.out.println("静态初始化2");
}
public Test() {
System.out.println("构造函数");
}
public static void test1() {
System.out.println("测试初始化块被调用的次数,和静态初始化块被调用的次数 --- 调用test1");
}
public static void test2() {
System.out.println("测试初始化块被调用的次数,和静态初始化块被调用的次数 ------ 调用test2");
}
public static void main(String[] args) {
Test t1 = new Test();
t1.test1();
Test t2 = new Test();
t2.test1();
}
}
运行结果
代码块2
package com.yubai.javatest.test;
public class Test {
public static String str;
{
System.out.println("初始化1");
}
{
System.out.println("初始化2");
}
static {
str = "aaa";
System.out.println("静态初始化2");
}
public Test() {
System.out.println("构造函数");
}
public static void test1() {
System.out.println("测试初始化块被调用的次数,和静态初始化块被调用的次数 --- 调用test1");
}
public static void test2() {
System.out.println("测试初始化块被调用的次数,和静态初始化块被调用的次数 ------ 调用test2");
}
public static void main(String[] args) {
Test t1 = new Test();
t1.test1();
t1.test1();
}
}
运行结果
4. 初始化块作用:
当需要初始化成员变量的值是一个很复杂的逻辑时,通常选用初始化块
一般很少使用初始化块
总结:
- 只要没有创建类的实例,则不会触发初始化块和构造函数
- 构造函数和初始化块的顺序:按代码的顺序执行初始化块,再执行构造函数
- 初始化块和构造函数调用次数和创建对象的次数一致
静态初始化块
如果使用 static 修饰初始化块,就称为静态初始化块。
1.静态初始化块用法:
static{
代码块
}
2.静态初始化块被调用的条件
静态初始化块只在类加载时执行,且只会执行一次,同时静态初始化块只能给静态变量赋值,不能初始化普通的成员变量。
1. 静态初始化块被执行条件示例
代码块:
package com.yubai.javatest.test;
public class Test {
public static String str;
{
System.out.println("初始化1");
}
{
System.out.println("初始化2");
}
static{
str = "aaa";
System.out.println("静态初始化2");
}
public static void main(String[] args) {
}
}
运行结果:
运行结果解释:
当运行此类时,运行结果只会输出静态初始化2,因为静态初始化块只在类加载时执行。
即使main函数中没有写任何代码也不会因此不执行静态初始化块,因为静态初始化块的执行只与类是否加载有关。
当类被加载时,就会立马执行静态初始化块,然后开始执行main函数中的代码。所以当我再main函数中添加打印代码时,输出结果先输出静态初始化2,然后输出打印信息。如图:
2.静态初始化只会执行一次
代码块
package com.yubai.javatest.test;
public class Test {
public static String str;
{
System.out.println("初始化1");
}
{
System.out.println("初始化2");
}
static {
str = "aaa";
System.out.println("静态初始化2");
}
public Test() {
System.out.println("构造函数");
}
public static void test1() {
System.out.println("测试初始化块被调用的次数,和静态初始化块被调用的次数 --- 调用test1");
}
public static void test2() {
System.out.println("测试初始化块被调用的次数,和静态初始化块被调用的次数 ------ 调用test2");
}
public static void main(String[] args) {
test1();
test2();
}
}
运行结果
3. 静态初始化块作用:
当我们需要某个对象只能执行一次时,就会用到静态初始化块的概念。
比如:向数据库添加对象,删除对象,修改对象,查询对象。每个操作不需要每次都要连接数据库。
我们可以在静态初始化块中连接好数据库,之后的每个操作就不需要再连接,直接可以用连接好的数据库操作对象
举例:当我们用电脑查询网页,还是打游戏,下载软件,还是敲代码等等每个操作,都需要开机。如果每次操作都要执行开机这个步骤,就显得很麻烦。所以我们的解决办法是使电脑一直处于开机状态,直到晚上睡觉前再关闭电脑。
应用在实例中,静态初始化块负责开机,只需要开一次,之后的每个操作就不需要再开机。睡觉前关闭电脑。
应用实例:连接数据库
代码块
public class MongoDBTest {
public static final String HOST = "127.0.0.1";
private static final int PORT = 27017;
private static final String DB_NAME = "testDB";
private static Mongo mongo;
private static DB db;
static{
//连接数据库仓库
mongo = new Mongo(HOST,PORT);
//通过数据库仓库连接数据库仓库中的数据库:testDB
db = mongo.getDB(DB_NAME);
}
...
4.总结
1.静态初始化块只有在类加载时执行,与main函数中的代码逻辑无关。
2.静态初始化只会执行一次。
上一篇: Python(二十三)类和对象
下一篇: 输入输出外挂