java中类的加载顺序

xiaoxiao2021-02-28  142

java中类加载顺序:

1)静态代码块只执行一次;静态代码块首先被初始化 2)构造代码块在每次创建对象都会执行;构造函数都是最后执行的。 3)按照父子类继承关系进行初始化,先执行父类的初始化; 4)程序运行时,先加载父类,(类加载顺序的问题) 5)静态方法会被首先加载,但是不会被执行;只有调用的时候才会被执行。

Java中普通代码块,构造函数,静态代码块执行顺序

(优先级从高到低)静态代码块----->mian方法----->非静态代码块----->构造方法。

JAVA类首次装入时,会对静态成员变量或方法进行一次初始化,但方法不被调用是不会执行的,静态成员变量和静态初始化块级别相同,非静态成员变量和非静态初始化块级别相同。

1、虚拟机在首次加载Java类时,会对静态代码块、静态成员变量、静态方法进行一次初始化

2、只有在调用new方法时才会创建类的实例

3、类实例创建过程按照父子继承关系进行初始化,首先执行父类的初始化块部分,然后是父类的构造方法;再执行本类继承的子类的初始化块,最后是子类的构造方法(子类创建对象时,首先父类进行初始化

4、类实例销毁时候,首先销毁子类部分,再销毁父类部分。

一、静态代码块和非静态代码块的异同点如下:

相同点:都是JVM加载类时且在构造函数执行之前执行,在类中都可以定义多个,一般在代码块中对一些static变量进行赋值。 不同点:静态代码块在非静态代码块之前执行(静态代码块 > 非静态代码块)。静态代码块只执行一次,之后不再执行。而非静态代码块每new一次就执行一次。

静态代码块是在类加载时自动执行的,非静态代码块在创建对象自动执行的代码,不创建对象不执行该类的非静态代码块。 顺序: 静态代码块 –>非静态代码块 –>类构造函数。

二、构造函数

子类继承父类的时候会自动继承父类的默认构造函数(也就是继承那个无参数的构造函数)。而如果类里面已经有一个带有参数的构造函数了,如果没有写那个默认的不带参数的构造函数的话,继承的时候子类就会报错,因为系统不知道要不继承哪个构造函数,必须明确的使用super()关键字来描述。(如果都是有参数的构造函数,也自动继承)

代码如下:

package com.example; public class Test { public static void main(String[] args) { //java类的加载顺序: Child child = new Child(); } }

代码的执行结果:

初始化父类的静态代码--->初始化子类的静态代码--->初始化父类的非静态代码块--->初始化父类构造函数--->初始化子类非静态代码块--->初始化子类构造函数.

子类child代码:

package com.example; /** * Created on 2017/5/5. * Author:crs * Description:Child类 */ public class Child extends Parent { { System.out.println("子类中的初始化代码块"); } Child() { System.out.println("子类中的构造函数"); } static{ System.out.println("子类中的静态代码块"); } public static int childStaticMethod() { System.out.println("子类中的静态方法"); return 1000; } } 父类Parent代码:

package com.example; /** * Created on 2017/5/5. * Author:crs * Description:Parent类 */ public class Parent { Parent() { System.out.println("父类中的构造方法"); } { System.out.println("父类中的初始化代码块"); } static { System.out.println("父类中的静态代码块"); } public static int parentStaticMethod1() { System.out.println("父类中的静态方法1"); return 1; } public static int parentStaticMethod2() { System.out.println("父类中的静态方法2"); return 1; } }

阿里巴巴的面试题:

package com.example; /** * Created on 2017/5/5. * Author:crs * Description:XXX */ public class Test1 { public static void main(String[] args){ A a = new A(); //求输出的顺序 load B--->load A--->create B---->create A //先有父类才能有子类 //程序运行时,加载AB两类,因为A是B子类,所以先加载B类,Load B,再加在A类 LoadA。 } } package com.example; /** * Created on 2017/5/5. * Author:crs * Description:XXX */ public class B extends Object { static { System.out.println("load B"); } public B() { System.out.println("Create B"); } }

package com.example; /** * Created on 2017/5/5. * Author:crs * Description:XXX */ public class A extends B { static { System.out.println("load A"); } public A() { System.out.println("Create A"); } }

转载请注明原文地址: https://www.6miu.com/read-26504.html

最新回复(0)