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