chapter04_Java基础知识_1_main,类的成员初始化

本文深入解析Java中main函数的修饰符作用,解释为何需要public、static、void等关键字,以及main函数在类加载和实例化过程中的执行顺序。探讨了静态变量、静态代码块与非静态成员的初始化时机及顺序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 为什么 main函数要 public static void修饰?

    static方法存储在__静态存储区__,只要类被加载后,不需要实例化对象就可以使用该方法;如果main方法不声明为静态的,JVM就必须创建main类的实例,而因为构造器可以被重载,JVM就没法确定调用哪个main方法;

    public的原因是任何类或对象都可以访问;

    void的原因是main函数是入口,返回值没有意义

  • (1) 一个类里面可以有多个main函数,但是只有__与文件名相同的 + 符合命名规范的 main()函数才可以作为函数的入口__

    (2) 可以用final, synchronized修饰main()方法,但是不能用abstract修饰

  • main()入口函数不一定最先被执行,因为__静态块__中的内容在__类加载__的时候就会被调用

      static {  ...  }
    
  • 类成员的初始化顺序

    (1) 原则

    1° 静态变量 优先于 非静态变量 (静态变量在类加载的时候就被加载了,非静态变量是在创建实例时才有的)

    2° 父类的变量 优先于 子类的变量

    3° 按照成员变量的定义顺序进行初始化(即使变量定义散布在方法定义之中,它们依然在任何方法被调用之前初始化(包括构造函数)

    (2) 初始化顺序

      父类静态变量、父类静态代码块 --> 
      子类静态变量、子类静态代码块 --> 
      父类非静态变量、父类非静态代码块 --> 父类构造函数 -->
      子类非静态变量、子类非静态代码块 --> 子类构造函数
    

    类构造器先于实例构造器进行,所以先初始化静态部分(类变量)

    执行子类的类构造器之前一定先会执行父类的类构造器,所以父类的各种静态xxx一定先于子类的各种静态xxx

    执行子类的实例构造器之前一定先会执行父类的实例构造器,所以父类的各种非静态xxx一定先于子类的各种非静态xxx

    静态变量、静态代码块(或者非静态变量、非静态代码块也成立),初始化的顺序是源代码中的出现顺序

    事实上,有5种情况下需要进行类的初始化,此时类的静态变量和静态代码块就会被执行;但是这5种情况并不都是要创建类的实例,所以创建类的实例时,对象的非静态变量、非静态初始化块才会被执行,一起放在堆里面,没有实例之前内存中是没有类的非静态变量的数据的

  • 只要类被加载,JVM就会给类的静态变量分配空间;

    类的成员变量,在类被实例化时,成员变量会被分配空间并初始化,当类的实例化对象的生命周期结束时,成员变量的生命周期才结束。

  • 类的初始化和实例对象的初始化是两个过程,永远都是类的初始化先进行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值