作者在学习过程中,遇到了有关静态代码块的现象,故写此博客记录下来。
首先先介绍下static概念
当在定义类的时候,类中都会有相应的属性和方法。而属性和方法都是通过创建本类对象调用的。当在调用对象的某个方法时,这个方法没有访问到对象的特有数据时,方法创建这个对象有些多余。可是不创建对象,方法又调用不了,这时我们可以通过static关键字来实现。static它是静态修饰符,一般用来修饰类中的成员。
static是静态修饰符,一般修饰成员。被static修饰的成员属于类,不属于单个这个类的某个对象。
static修饰的成员被多个对象共享。
static修饰的成员属于类,但是会影响每一个对象。
被static修饰的成员又叫类成员,不叫对象的成员。
本文分为三种情况去判断
案例1.main方法在静态变量所有类的内部
public class Person {
public static int a = 10;
public final static int b=20;
public Person(){
System.out.println("构造方法执行了");
}
//成员代码块 构造代码块
{
System.out.println("构造代码块执行了");
}
//静态代码块
static{
System.out.println("静态代码块执行了");
}
public static void main(String[] args) {
//判断调用未用final修饰的静态变量
//System.out.println(Person.a);
//判断用final修饰的静态常量
System.out.println(Person.b);
}
输出结果:静态代码块执行了
20
输出结果2:静态代码块执行了
10
结论1:
当main方法在静态变量所有类的内部时,无论调用被static修饰的变量还是用final static修饰的变量,
静态代码块都会被调用。
案例2.使用测试类的main方法来访问静态变量/常量。
新定义Test类,调用其main方法来测试案例二
public class Test {
public static void main(String[] args) {
//判断用一般的静态变量
//System.out.println(Person.a);
//判断用final修饰的静态常量
System.out.println(Person.b);
}
}
判断用final修饰的静态常量
输出结果:
20
判断一般的静态变量
输出结果:
静态代码块执行了
10
结论2:
当访问类中常量的时候,并不调用静态代码块的数据,此时类并没有被加载进内存。
案例3.静态变量与静态代码块的执行顺序
静态常量,静态变量,静态方法, 都是通过类名直接调用的(例如:Person.a ),而静态代码块,则是在类被加载到内存的时候调用。
而他们之间的执行先后顺序则是根据代码的编写顺序来决定的。举例
public class Person {
static {
i=10;
}
static int i=20;
}
此时main函数调用Person.a,输出20
public class Person {
static int i=20;
static {
i=10;
}
}
此时main函数调用Person.a,输出10
结论3:
上述的代码说明 static修饰的静态代码块 和静态变量运行的顺序是根据代码编写的先后,一般都将静态变量写在静态代码块的上方。