JAVA中的代码块

Java中的代码块

目录

一、普通代码块

普通代码块是在方法体中定义的。普通代码块内部代码书写顺序就是执行顺序。

public void generalBlock(){
	System.out.print("普通代码块的代码!");
	System.out.print("依次往下执行!");
	...
	System.out.print("依次往下执行!");
}
二、静态代码块
1、静态代码类的格式:
  • 在java类中使用static关键字和**{}**声明的代码块:
  • [注意]:方法中不能存在静态代码块
public class Code{
	// 定义在类内
	static {
		System.out.print("静态代码块区域");
	}
}
2、静态代码块的使用时机

一般情况,如果需要在项目启动时侯就执行的代码,譬如说项目启动要加载的很多很多的配置文件等资源,这时候就可以放入静态代码中。

3、执行的时间

静态代码块在类被加载的时候就运行,只运行一次,优先于各种代码块以及构造函数。如果一个类中有多个静态代码块,会按照书写顺序依次执行。

4、静态代码块不能存在任何方法体中

因为:静态代码块是在类加载的时候就要运行了

  • 对于普通方法是通过加载类,然后new出实例化对象,通过对象才能运行这个方法,而静态代码块只需要加载类之后就能运行了。

  • 对于静态方法,在类加载的时候,静态方法也已经加载了,但是我们必须要通过类名或者对象名才能访问,也就是说相比于静态代码块,静态代码块是主动运行的,而静态方法是被动运行的。

不管是普通方法还是静态方法,我们要明确静态代码块的存在在类加载的时候就自动运行了,所以不管是放到普通方法还是静态方法中,都是不能自动运行的。

5. 静态代码块不可以访问普通变量
  • 普通变量只能通过对象来调用,是不能放在静态代码块中的,因为普通变量需要通过加载类,然后new出实例化对象,通过对象调用,而静态代码块只需要加载类之后就能运行了。
三、构造函数
  • 构造函数的命名必须和类名完全相同。在java中普通函数可以和构造函数同名,但是必须带有返回值;
  • 构造函数的功能主要用于在类的对象创建时定义初始化的状态。它没有返回值,也不能用void来修饰。这就保证了它不仅什么也不用自动返回,而且根本不能有任何选择。而别的方法都有返回值,即使是void返回值。尽管方法体本身不会自动返回什么,但仍然可以让它返回一些东西,而这些东西可能是不安全的;
  • 构造函数不能被直接调用,必须通过new运算符在创建对象时才会自动调用;而一般的方法是在程序执行到它的时候被调用的;
  • 当定义一个类的时候,通常情况下都会显示该类的构造函数,并在函数中指定初始化的工作也可省略,不过Java编译器会提供一个默认的构造函数.此默认构造函数是不带参数的。而一般的方法不存在这一特点;
四、构造代码块
1.格式:

在java类中使用**{}**声明的代码块:

public class StaticCode{
	{
		System.out.println("构造代码块!");
	}
}
2.执行的时间

构造代码块在创建对象时被调用,每次创建对象都会调用一次,但是优先于构造函数执行。

  • 注意,构造代码块不是优先于构造函数执行,而是依托于构造函数,也就是说,如果不实例化对象,构造代码块是不会执行的。
public class Code{
    {
        System.out.println("构造代码块");
    }
     
    public Code(){
        System.out.println("无参构造函数");
    }
    public Code(String str){
        System.out.println("有参构造函数");
    }
}

如果存在多个构造代码块,则执行顺序按照书写顺序依次执行。

3.构造代码块的作用
  • 和构造函数的作用相似,都能给对象进行初始化,并且只要创建一个对象,构造代码块都会执行一次。但是反过来,构造函数则不一定每个对象建立时都执行(多个构造函数情况下,建立对象时传入的参数不同则初始化使用对应的构造函数)。

  • 利用每次创建对象的时候都会提前调用一次构造代码块特性,我们可以做诸如统计创建对象的次数等功能

五、执行顺序
  • 1.静态的代码块
  • 2.构造代码块
  • 3.构造函数
  • 4.普通代码块
    执行顺序 1>2>3>4

示例代码

public class Code{
	// 1.类加载时候执行
	static{
        System.out.println("静态代码块");
    }
    // 2.构造代码块,在对象生成时在构造函数前执行
    {
        System.out.println("构造代码块");
    }
    // 3.构造函数,在对象生成时执行
    public Code(){
        System.out.println("无参构造函数");
    }
    // 4.普通代码块,在对象调用时执行
    public void general(){
        {
            System.out.println("普通代码块");
        }
    }
     
    public static void main(String[] args) {
        System.out.println("main方法");
        new Code().general();
    }
}
六、父类和子类的执行顺序

对象的初始化顺序:

  • 首先执行父类静态的内容,父类静态的内容执行完毕后,接着去执行子类的静态的内容,当子类的静态内容执行完毕之后,再去看父类有没有构造代码块,如果有就执行父类的构造代码块,父类的构造代码块执行完毕,接着执行父类的构造方法;父类的构造方法执行完毕之后,它接着去看子类有没有构造代码块,如果有就执行子类的构造代码块。子类的构造代码块执行完毕再去执行子类的构造方法。

  • 总结:静态代码块内容先执行,紧接着执行父类构造代码块和构造方法,然后执行子类构造代码块和构造方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值