美文网首页
Java中静态代码块,构造代码块,构造函数代码块

Java中静态代码块,构造代码块,构造函数代码块

作者: 村东头老骥 | 来源:发表于2019-10-24 11:31 被阅读0次

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("静态代码块");
    }
}

执行顺序

静态代码块 > 构造代码块 > 构造函数代码块 > 普通代码块

相关文章

网友评论

      本文标题:Java中静态代码块,构造代码块,构造函数代码块

      本文链接:https://www.haomeiwen.com/subject/hwhrvctx.html