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();
}
}