解析java中的静态代码块和实例代码块(匿名代码块)
1 静态代码块
1.1 含义
被static修饰的{}叫做静态代码块,其语法如下所示:
static{
//代码块里面的内容
}
1.2 为什么需要静态代码块?
类在加载时初始化(实例化对象之前必须加载类)
1.3 怎么用静态代码块?
1.3.1 给静态变量赋初始值
a 示例代码
Chinese类
public class Chinese {
static int count;
static{
count=100;
}
public Chinese() {
}
}
Demo类
public class Demo {
public static void main(String[] args) {
//测试static代码块的功能
System.out.println(Chinese.count);
}
}
b 示例代码运行截图
1.3.2 在同一个类中,静态代码块可以有多个,代码的执行顺序为静态代码块在类体中的书写顺序(谁写在前,谁先执行)
a 示例代码
Chinese类
public class Chinese {
static{
System.out.println("第一个static修饰的代码块被成功执行了");
}
public Chinese() {
}
static{
System.out.println("第二个static修饰的代码块被成功执行了");
}
static{
System.out.println("第三个static修饰的代码块被成功执行了");
}
}
Demo类
public class Demo {
public static void main(String[] args) {
//测试static代码块的功能
new Chinese();
}
}
b 实例代码运行截图
1.3.3 静态代码块一定需要实例化对象后才会被自动调用,其在自动调用构造方法之前调用
a 错误示例代码
Chinese类
public class Chinese {
static{
System.out.println("测试静态代码块在实例化对象前是否执行-------1");
}
public Chinese() {
}
}
Demo类
public class Demo {
public static void main(String[] args) {
//测试static代码块的功能
}
}
b 错误示例代码运行截图
c.正确的示例代码
Chinese类
public class Chinese {
static{
System.out.println("测试静态代码块在实例化对象前是否执行-------1");
}
public Chinese() {
}
}
Demo类
public class Demo {
public static void main(String[] args) {
//测试static代码块的功能
new Chinese();
}
}
d.正确的示例代码运行截图
2.实例代码块
2.1 含义
没有名字且没有被static修饰的代码块叫做实例代码块,又称匿名代码块。
其语法格式如下所示:
{
//实例代码块内容
}
2.2 什么需要实例代码块(匿名代码块)?
在实例化对象前对对象进行初始化
2.3 怎么用实例代码块?
2.3.1 实例代码块一定需要实例化对象后才会被自动调用,其在自动调用构造方法之前调用
a 错误示例代码
Chinese类
public class Chinese {
{
System.out.println("测试实例代码块在实例化对象前是否执行");
}
public Chinese() {
System.out.println("无参构造方法调用了!!!!");
}
}
Demo类
public class Demo {
public static void main(String[] args) {
//测试static代码块的功能
}
}
b 错误示例代码运行截图
c.正确的示例代码
Chinese类
public class Chinese {
{
System.out.println("测试实例代码块在实例化对象前是否执行");
}
public Chinese() {
}
}
Demo类
public class Demo {
public static void main(String[] args) {
//测试static代码块的功能
new Chinese();
}
}
d.正确的示例代码运行截图
2.3.2 在同一个类中,实例代码块可以多个,他们的执行的顺序是按照书写的先后顺序来执行(谁写在前,谁先执行)
a 示例代码
Chinese类
public class Chinese {
{
System.out.println("实例代码块2");
}
{
System.out.println("实例代码块1");
}
public Chinese() {
}
{
System.out.println("实例代码块3");
}
}
Demo类
public class Demo {
public static void main(String[] args) {
//测试static代码块的功能
new Chinese();
}
}
b 示例代码运行截图
3.静态代码块、实例代码块、构造方法的执行的条件是什么?
3.1 条件
都需要实例化对象后才能被调用。(实例化对象前必须先加载类的)
3.2 错误示例代码
Chinese类
public class Chinese {
{
System.out.println("实例代码块");
}
static{
System.out.println("static修饰的代码块");
}
public Chinese() {
System.out.println("构造方法");
}
}
Demo类
public class Demo {
public static void main(String[] args) {
//测试static代码块的功能
}
}
3.3 错误示例代码运行截图
3.4 正确示例代码
Chinese类
public class Chinese {
{
System.out.println("实例代码块");
}
static{
System.out.println("static修饰的代码块");
}
public Chinese() {
System.out.println("构造方法");
}
}
Demo类
public class Demo {
public static void main(String[] args) {
//测试static代码块的功能
new Chinese();
}
}
3.5 正确示例代码运行截图
4.静态代码块、实例代码块、构造方法之间的执行的先后顺序是什么?
4.1 规则
a. 不同种之间优先级别从高到低为: 静态代码块>实例代码块>构造方法
b.同种之间的优先级别为: 类体中书写的先后顺序,写在前的优先执行
4.2 示例代码
Chinese类
public class Chinese {
{
System.out.println("实例代码块2");
}
static{
System.out.println("static修饰的代码块3");
}
static{
System.out.println("static修饰的代码块1");
}
{
System.out.println("实例代码块1");
}
public Chinese() {
System.out.println("构造方法");
}
static{
System.out.println("static修饰的代码块2");
}
{
System.out.println("实例代码块3");
}
}
Demo类
public class Demo {
public static void main(String[] args) {
//测试static代码块的功能
new Chinese();
}
}