static:

是一个关键字,用于修饰成员变量和成员方法

特点:

  • 被所有对象共有
  • 不需要实例对象就可以使用类名直接调用
  • 静态的成员和变量同类的加载一起,优先与对象的创建

注意:

  • 静态的方法只能调用静态的成员变量和成员方法,不能调用非静态成员变量和成员方法
  • 非静态方法既能调用静态成员变量和静态成员方法,又能调用非静态成员变量和非静态成员方法

代码块:

java中,使用{}括起来的代码被称为代码块

分类:

  • 局部代码块:程序中使用{}括起来的部分
  • 构造代码块:与构造函数出现再同一位置的{},用于抽取构造函数的共性,调用构造函数时被执行,而且比构造函数先执行
  • 静态代码块:用static修饰{}
  • 同步代码块:

代码块调用顺序实例:

public class BlockTest {
    //BlockTest的静态代码块
	static {
		System.out.println("BlockTest 静态 代码块");
	}
	 //BlockTest的构造代码块
	{
		System.out.println("BlockTest 代码块");
	}
	//BlockTest的无参构造函数
	BlockTest() {
		System.out.println("BlockTest 无参构造函数");
	}
	public static void main(String[] args) {
		System.out.println("mian 被执行");
		//实例化两个对象
		Coder c1 = new Coder();
		Coder c2 = new Coder();
	}
}
class Coder {
    //静态代码块
	static {
		System.out.println("Coder 静态 代码块");
	}
	//构造代码块
	{
		System.out.println("Coder 代码块");
	}
	//构造函数
	Coder() {
		System.out.println("Coder 无参构造函数");
	}
}

执行结果:

Java中static代码块在内存中的位置_Java基础


分析:

  1. 点击运行,先加载BlockTest类,所以BlockTest的静态构造代码块被执行,输出

BlockTest 静态 代码块

  1. 类被加载后执行main方法,因为没有创建BlockTest的对象所以BlockTest中的构造代码块和构造方法不会执行,进入main函数输出

mian 被执行

  1. 创建c1时首先加载Coder对象,Coder静态代码块被执行输出

Coder 静态 代码

然后执行Coder类的构造代码块输出

Coder 代码块

再执行Coder的无参构造函数输出

Coder 无参构造函数

  1. 再创建c2对象,因为Coder对象已经被加载,所以静态代码 块中的代码不再被执行直接输出

Coder 代码块

最后输出

Coder 无参构造函数