java面对对象08_代码块(static关键字)

1.静态代码块

在类中,用static修饰的代码块叫做静态代码块,主要用于给类做初始化操作

  • 静态代码块特点:
  1. 静态代码块只能定义在类里面,独立于任何方法,不能定义在方法里面。

  2. 一个类中允许定义多个静态代码块,执行的顺序根据定义的顺序进行。

  3. 静态代码块中的变量都是局部变量,只能访问类的静态变量,而不允许访问成员变量。

  4. 静态代码块会在类被加载时自动执行,并且只执行一次!

  • 静态代码块作用:

给静态变量赋初始值,实际开发中使用比较多,一般用于执行一些全局性的初始化操作。

例如:创建工厂、加载数据库初始信息等等

【示例】静态代码块示例

class StaticBlockDemo {
	String name;
	static String sex;
	static {
		// 只能访问类的静态变量,而不允许访问实例变量
		// name = "小明"; 编译错误
		sex = "男";
		System.out.println("11");
	}
}

2.构造代码块

在类中,没有用static修饰的代码块叫做构造代码块(非静态代码块),主要用于给所有对象共性特点进行初始化操作

  • 构造代码块特点:
  1. 构造代码块只能定义在类里面,独立于任何方法,不能定义在方法里面。

  2. 一个类中允许定义多个构造代码块,执行的顺序根据定义的顺序进行。

  3. 构造代码块中的变量都是局部变量,既可以访问静态变量也可以访问实例变量。

  4. 构造代码块随着对象的创建而加载,每创建对象一次就执行一次!

  • 构造代码块作用:

可以将各个构造方法中公共的代码提取到构造代码块。

匿名内部类不能提供构造方法,此时初始化操作可以放到构造代码块中。

【示例】构造代码块

class BlockDemo {
	String name;
	static String sex;
	{
		// 可以访问静态变量也可以访问实例变量
		name = "小明";
		sex = "男";
	}
}

3.代码执行顺序

静态代码块在非静态代码块之前执行(静态代码块—>非静态代码块—>构造方法)。是因为被static修饰的成员都是类成员,会随着JVM加载类的时候加载而执行,而没有被static修饰的成员也被称为实例成员,需要创建对象才会随之加载到堆内存。所以静态的会优先非静态的。

【示例】思考以下代码的执行顺序

class Person {
	static int num;
	static {
        System.out.println("静态代码块执行 num:" + ++num);
	}
	{
        System.out.println("构造代码块执行 num:" + ++num);
	}
	public Person() {
		System.out.println("无参构造方法在执行 num:" + ++num);
	}
	public Person(int number) {
		this();
		System.out.println("有参构造方法在执行 num:" + ++num);
	}
}
public class BlockDemo {
	public static void main(String[] args) {
		new Person(3);
		new Person();
	}
}

输出结果如下图所示:
在这里插入图片描述
思考:为什么会出现这样的结果???

ps:如需最新的免费文档资料和教学视频,请添加QQ群(627407545)领取。

发布了35 篇原创文章 · 获赞 0 · 访问量 344

猜你喜欢

转载自blog.csdn.net/zhoujunfeng121/article/details/104581729