代码块及静态代码块

代码块和静态代码块
语法格式:
【修饰符】class 类名{
{//非静态代码块 }
static{//静态代码块}
}

什么时候执行代码块?
(1)静态代码块,在类初始化的时候执行,并且只执行一次
(2)非静态代码块,在实例初始化的时候执行,创建一个对象,执行一次,并且比构造方法要早
(成员变量:我们通常说的属性:)
(1)实例变量,大多数人在说成员变量时,一般他说的是实例变量
(2)类变量

public class TestBlock {
	public static void main(String[] args) {
		Init.test();//加载类Init到内存中初始化,需要执行一次静态代码块
		Init.test();//方法每调用一次执行一次内容
		Init.test();
	}
}
class Init{
	static {
		System.out.println("静态代码块");
	}
	public static void test(){
		System.out.println("静态方法");
	}
}

结果为:
静态代码块
静态方法
静态方法
静态方法

public class TestBlock {
	public static void main(String[] args) {
		Init n1= new Init();//创建对象,需要将类加载到内存中,且优先于构造器,执行一次静态代码块初始化
		Init n2= new Init();
		Init n3 = new Init();
	}
}
class Init{
	public Init(){
		System.out.println("构造器");
	}
	static {
		System.out.println("静态代码块");
	}
	public static void test(){
		System.out.println("静态方法");
	}
}

执行结果为:
静态代码块
构造器
构造器
构造器

public class TestBlock {
	public static void main(String[] args) {
		Init.test();
	}
}
class Init{
	public Init(){
		System.out.println("构造器");//只有创建对象才执行
	}
	static {//静态代码块
		System.out.println("静态代码块");
	}
	public static void test(){
		System.out.println("静态方法");
	}
	{//非静态代码块
		System.out.println("非静态代码块");//只有创建对象才执行
	}
}

执行结果为:
静态代码块
静态方法

public class TestBlock {
	public static void main(String[] args) {
		Init n1 = new Init();
		Init n2 = new Init();
		Init n3 = new Init();
	}
}
class Init{
	public Init(){
		System.out.println("构造器");//只有创建对象才执行
	}
	static {
		System.out.println("静态代码块");
	}
	public static void test(){
		System.out.println("静态方法");
	}
	{
		System.out.println("非静态代码块");//只有创建对象才执行
	}
}

执行结果为:
静态代码块
非静态代码块
构造器
非静态代码块
构造器
非静态代码块
构造器

public class Demo01 {
	public static void main(String[] args) {
		System.out.println(A1.max);
		
	}
}
class A1 extends A_Father{
	public static final int max = 300;
	//final修饰的常量不会发生类的初始化      
	//只有调用类的静态成员变量和静态方法 会发生类的初始化
	
	static {
		System.out.println("静态初始化A");
	}
	public A1(){
		System.out.println("创建A类的对象");
	}
	public static void test(){
		
	}
}
 

执行结果为:
300
++++++++++++++++++++++++++++++++++++++++++++++
类初始化
每一个类,编译器会自动生成一个<“clinit”>()称为类初始化方法
class—》initalize,方法体由下面两部分组成
(1)静态变量的显示赋值语句
(2)静态代码块中的语句
这两个部分,谁在上面谁先执行
public class TestClinit {
public static void main(String[] args) {
A a= new A();//会导致类初始化
}
}
class A{
private static int num= getNum();
static {
num++;
System.out.println(“静态代码块:num=”+num);
}
public static int getNum(){
num++;
System.out.println(“getNum,num=”+num);
return 10;
}
}
//执行结果为:
getNum,num=1
静态代码块:num=11
在这里插入图片描述在这里插入图片描述
实例初始化

发布了10 篇原创文章 · 获赞 0 · 访问量 98

猜你喜欢

转载自blog.csdn.net/xiaobao1352/article/details/104208282
今日推荐