Java中静态代码块,构造代码块,构造函数代码块,普通代码块
静态代码块 : static代码块指的是static{}
包裹的代码块,且静态代码只执行一次,可以通过Class.forName("classPath")
的方式唤醒代码的static代码块,但是也执行一次。
path:/CodeBlock/CodeBlock静态代码块
package CodeBlock;
public class CodeStaticDemo {
/**
* 静态代码块
*/
static {
System.out.println("This is a static block");
}
}
path:/CodeBlock/CodeBlockClient
package CodeBlock;
public class CodeStaticClient {
public static void main(String[] args) {
// 创建对象(多次创建对象....)
CodeStaticDemo codeStaticDemo = new CodeStaticDemo();
CodeStaticDemo codeStaticDemo2 = new CodeStaticDemo();
CodeStaticDemo codeStaticDemo3 = new CodeStaticDemo();
}
}
返回结果: This is a static block
静态代码的总结
使用
static
关键字和{}
声明的代码块static{....}
静态代码块在被类加载的时候执行,且只运行
一次
优先各种的代码块和构造函数在类中可以有多个静态代码块,他们的执行顺序会依次按照书写顺序依法执行.
应用场景多用于加载一些配置文件等资源
-
静态代码块不能存在任何方法体中(加载类的时候运行该代码块的程序)
- 普通方法 : 类加载 - 通过关键字
new
创建出实例化对象,通过对象运行该普通方法. - 静态方法 : 区别于主动运行还是被动运行. 静态方法,虽然在加载类的过程中也被加载,但是需要通过类名或者对象名才能访问,被动执行(你让我执行,我才执行). 静态代码块主动运行.
- 普通方法 : 类加载 - 通过关键字
注意 : 静态代码块不能访问普通变量,普通变量只能通过对象来调用,是不能放在静态代码块中的.
构造代码块 : 使用{}
包裹的代码区域,这里的代码区域特指位于class{}
下面的而不是存在于其他type method(){}
这类函数下面的代码区域
package CodeBlock;
public class CodeStaticDemo {
/**
* 静态代码块
*/
static {
System.out.println("This is a static block");
}
{
System.out.println("构造代码块");
}
}
实例化CodeStatic
package CodeBlock;
public class CodeStaticClient {
public static void main(String[] args) {
// 创建对象
CodeStaticDemo codeStaticDemo = new CodeStaticDemo();
CodeStaticDemo codeStaticDemo2 = new CodeStaticDemo();
CodeStaticDemo codeStaticDemo3 = new CodeStaticDemo();
}
}
=====================================================
This is a static block
构造代码块
构造代码块
构造代码块
注意: 实例化对象后构造代码块都会执行
构造代码块总结
在java类中使用
{}
声明的代码块在创建对象的时候被调用,每次创建都会被调用一次.
-
构造函数不是优先于构造函数,而是依托于构造函数,也就是说,如果你不实例化对象,构造代码块将不被执行
package CodeBlock; public class CodeDemo2 { { System.out.println("这是一个构造代码块"); } public CodeDemo2() { System.out.println("无参数构造函数"); } public CodeDemo2(String str) { System.out.println("有参数构造函数"); } }
实例化CodeBlock
package CodeBlock; public class CodeDemo2Client { public static void main(String[] args) { // 无参数实例化对象 CodeDemo2 codeDemo2 = new CodeDemo2(); // 有参数实例化对象 CodeDemo2 codeDemo3 = new CodeDemo2("Hello word!"); } } =============================================== 这是一个构造代码块 无参数构造函数 这是一个构造代码块 有参数构造函数
编译的
.class文件
package CodeBlock; public class CodeDemo2 { public CodeDemo2() { System.out.println("这是一个构造代码块"); System.out.println("无参数构造函数"); } public CodeDemo2(String str) { System.out.println("这是一个构造代码块"); System.out.println("有参数构造函数"); } }
当存在多个构造代码块的时候在调用函数的过程中会依次执行
常见的应用场景 和构造函数的作用类似,都能对对象进行初始化,并且只要创建一个对象,构造代码块都会被执行一次.但是反过来,构造函数则不一定每个对象建立时候都执行(多个构造函数的情况下,建立对象时传入的参数不同则初始化使用对应的构造函数)
构造函数代码块 : 构造函数代码块指的是构造函数中所包含的代码块,类似 className(){..}中的代码块
package CodeBlock;
public class CodeDemo3 {
private String name;
private String sex;
private Integer age;
// 无参数构造
public CodeDemo3() {
System.out.println("我是无参构造函数中执行的代码块");
}
// 有参数构造
public CodeDemo3(String name, String sex, Integer age) {
System.out.println("我是有参数构造函数中执行的代码块");
this.name = name;
this.sex = sex;
this.age = age;
}
}
实例化对象
package CodeBlock;
public class CodeDemo3Client {
public static void main(String[] args) {
CodeDemo3 codeDemo3 = new CodeDemo3();
System.out.println(codeDemo3);
}
}
===================================================
我是无参构造函数中执行的代码块
CodeBlock.CodeDemo3@1b6d3586
构造函数代码块总结
- 构造函数的命名必须和类名完全相同.在java中普通的函数可以和构造函数同名,但是必须带有返回值.
- 构造函数的功能主要用于在类的对象创建时定义初始化状态,它没有返回值,也不能用void来修饰,这就保证了它不仅什么也不用自动返回,而且根本不能用任何的选择.而其他方法都有返回值,即使是void返回值.尽管方法体本身不会自动返回什么,但仍然可以让它返回一些东西,而这些东西可能是不安全的;
- 构造函数不能被直接调用,必须通过
new
运算符在创建对象时候才会自动调用;而一般的方法是在程序执行到它的时候被调用; - 当定义一个类的时候,通常情况下都会显示该类的构造函数,并在函数中指定初始化的工作也可以省略.不过java编译器会提供一个默认的构造函数,此默认构造函数式不带参数的.而一般的方法不存在这一特点.
普通代码块 : 普通代码块和构造代码块的区别是,构造代码块是在类中定义的,而普通代码块是在方法体中定义的。且普通代码块的执行顺序和书写顺序一致。
package CodeBlock;
public class CodeDemo4 {
static {
System.out.println("静态代码块");
}
{
System.out.println("构造代码块");
}
public CodeDemo4() {
System.out.println("构造函数代码块");
}
public void sayHello(){
System.out.println("普通代码块");
}
public static void main(String[] args) {
System.out.println("执行main函数");
CodeDemo4 codeDemo4 = new CodeDemo4();
codeDemo4.sayHello();
System.out.println("结束执行main函数");
}
}
==============================================
静态代码块
执行main函数
构造代码块
构造函数代码块
普通代码块
结束执行main函数
编译.class文件
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
package CodeBlock;
public class CodeDemo4 {
public CodeDemo4() {
System.out.println("构造代码块");
System.out.println("构造函数代码块");
}
public void sayHello() {
System.out.println("普通代码块");
}
public static void main(String[] args) {
System.out.println("执行main函数");
CodeDemo4 codeDemo4 = new CodeDemo4();
codeDemo4.sayHello();
System.out.println("结束执行main函数");
}
static {
System.out.println("静态代码块");
}
}
执行顺序
静态代码块 > 构造代码块 > 构造函数代码块 > 普通代码块