作者在学习过程中,遇到了有关静态代码块的现象,故写此博客记录下来。

首先先介绍下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修饰的静态代码块

和静态变量运行的顺序是根据代码编写的先后,一般都将静态变量写在静态代码块的上方。