java中类的加载顺序

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");
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值