Java中静态代码块、构造代码块、构造代码块、普通代码块

本文详细解析了Java中静态代码块、构造代码块、构造方法代码块和普通代码块的执行顺序及原理。静态代码块在类加载时执行,构造代码块和构造方法在创建对象时调用,普通代码块位于方法体内。main方法作为程序入口,必须是静态的,以便JVM直接调用。理解这些概念对于Java编程至关重要。

1、先来看下面代码:

public class Code {
    String name;
    static {
        System.out.println("静态代码块");
    }
    {
        System.out.println("构造代码块");
    }
    public Code(String name) {
        this.name = name;
        System.out.println("有参构造代码块"+name);
    }
    public Code(){
        System.out.println("无参构造代码块");
    }
    public void test(){
        System.out.println("普通代码块");
    }

   运行:

 可以看出来执行的顺序是:静态代码块>main方法>构造代码块>构造方法代码块(有参和无参的顺序是创建对象的的顺序决定的,而非代码块的顺序)>普通代码块

并且每实例化一次对象,构造代码快就会被执行一次。 因此上面构造代码块被执行两次。

定义:

1、构造代码块:写在大括号里的代码。

  

 2、静态代码块:有static修饰的代码。

  

 3、构造方法代码块:有参构造方法和无参构造方法里面的代码。

     

4、普通代码块:就是成员方法里面的代码。 

 

 2、执行时机

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

    

静态代码块的作用:

  一般情况下,如果有些代码需要在项目启动的时候就执行,这时候就需要静态代码块。比如一个项目启动需要加载的很多配置文件等资源,我们就可以都放入静态代码块中

  

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

  这个应该很好理解,首先我们要明确静态代码块是在类加载的时候就要运行了。我们分情况讨论:

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

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

(2)、main方法代码块:main方法代码块被static修饰,是静态方法,更是程序的入口,所以先执行。

public static void main(String[] args) {}

main方法为什么是静态的

main函数其实也是所在类的一个方法,就比如一个类是test,那么该类的main其实就是test.main(String[] args),众所周知如果一个方法不是静态的,则要先实例化该类,比如要这样 test t=new test(); 
然后才能调用 test.main(); 
而这对于运行一个程序的主函数来说是不现实的,所以比如把main函数定义为static,使test.main()可以直接被调用。

因为是程序入口啊  
不然你从哪里开始new对象 ?

所有static成员都是在程序装载时初始化的,被分配在一块静态存储区域。这个区域的成员一旦被分配,就不再改变地址啦。直到程序结束才释放。
main()就存储在这里。
尽管包含main()的类还没有被实例化,但是main()方法已经可以使用啦。

为什么main方法是静态的(static)

1、正因为main方法是静态的,JVM调用这个方法就不需要创建任何包含这个main方法的实例。/2

2、因为C和C++同样有类似的main方法作为程序执行的入口。
3、如果main方法不声明为静态的,JVM就必须创建main类的实例,因为构造器可以被重载,JVM就没法确定调用哪个main方法。

4、静态方法和静态数据加载到内存就可以直接调用而不需要像实例方法一样创建实例后才能调用,如果main方法是静态的,那么它就会被加载到JVM上下文中成为可执行的方法。
 

为什么main方法是公有的(public)

     Java指定了一些可访问的修饰符如:private、protected、public,任何方法或变量都可以声明为public,Java可以从该类之外的地方访问。因为main方法是公共的,JVM就可以轻松的访问执行它。

为什么main方法没有返回值(Void) 

     因为main返回任何值对程序都没任何意义,所以设计成void,意味着main不会有任何值返回

关于java中main方法为什么必须是静态的

https://blog.csdn.net/weixin_42400413/article/details/83217937

(3)、构造方法代码块

    构造代码块在创建对象时被调用,每次创建对象都会调用一次,但是优先于构造方法执行。需要注意的是,听名字我们就知道,构造代码块不是优先于构造方法执行,而是依托于构造方法,也就是说,如果你不实例化对象,构造代码块是不会执行的。

并且每实例化一次对象,构造代码快就会被执行一次。

(4)、构造方法代码块

       分为有参构造方法代码块或无参构造方法代码块,执行顺序以创建的对象来定,若先创建有参方法,即先执行有参构造方法代码块,反之成立。

       a、构造函数的功能主要用于在类的对象创建时定义初始化的状态。它没有返回值,也不能用void来修饰。这就保证了它不仅什么也不用自动返回,而且根本不能有任何选择。而其他方法都有返回值,即使是void返回值。尽管方法体本身不会自动返回什么,但仍然可以让它返回一些东西,而这些东西可能是不安全的;

  b、构造函数不能被直接调用,必须通过new运算符在创建对象时才会自动调用;而一般的方法是在程序执行到它的时候被调用的;

  c、当定义一个类的时候,通常情况下都会显示该类的构造函数,并在函数中指定初始化的工作也可省略,不过Java编译器会提供一个默认的构造函数.此默认构造函数是不带参数的。而一般的方法不存在这一特点;

(5)、普通代码块

      普通代码块和构造代码块的区别是,构造代码块是在类中定义的,而普通代码块是在方法体中定义的。且普通代码块的执行顺序和书写顺序一致。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值