-
为什么 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就会给类的静态变量分配空间;
类的成员变量,在类被实例化时,成员变量会被分配空间并初始化,当类的实例化对象的生命周期结束时,成员变量的生命周期才结束。
-
类的初始化和实例对象的初始化是两个过程,永远都是类的初始化先进行。
chapter04_Java基础知识_1_main,类的成员初始化
最新推荐文章于 2024-12-25 15:48:25 发布