要点
- 静态的代码块一定比构造方法先执行
- 如果都是静态代码,一个类里面,按照先后顺序执行,父子之间,父类静态代码块先
- 静态代码只会执行一次,多次new 新的对象,构造方法,非静态代码块会多次执行
一个类里面,静态代码块,构造方法
package com.javabase;
/**
* @Description: java类作用描述
* @Author: Bsea
* @CreateDate: 2019/6/14$ 21:00$
*/
public class ConstroctTest {
// 成员变量,声明并且赋值
private static ConstroctTest test = new ConstroctTest();
//静态变量sta1 未赋予初始值
public static int sta1;
//静态变量sta1 赋予初始值20
public static int sta2 = 20;
//构造方法中对于静态变量赋值
private ConstroctTest() {
sta1 ++ ;
sta2 ++ ;
System.out.println("构造方法里面sta1=="+sta1);
System.out.println("构造方法里面sta2=="+sta2);
}
public static void main(String[] args) {
//1, 静态变量的赋值一定比构造方法先执行
//2,如果都是静态变量,按照顺序执行
//3, 基本类型,没有初始化的时候,会有默认值
//4, 这个类一共有三个静态变量(按代码顺序:test,stat1,stat2)
//5. 在给静态变量test赋值的时候,会需要调用构造方法
//这个时候,构造方法把stat1变成了1,stat2也变成了1
//6, test,赋值完成以后stat1,stat1都是1
//7. public static int sta1;这里只声明,没有赋值所以没
//有改变sta1的值
//8.public static int sta2 = 20;做了赋值运算
//把sta2从1变成了20
System.out.println(ConstroctTest.sta1);//1
System.out.println(ConstroctTest.sta2);//20
}
}
运行结果
com.javabase.ConstroctTest
构造方法里面sta11
构造方法里面sta21
1
20
父子之间
package com.javabase;
/**
* @Description: java类作用描述
* @Author: Bsea
* @CreateDate: 2019/6/14$ 22:02$
*/
public class A {
static {
System.out.println("A的静态块");
}
private static String staticStr = getStaticStr();
private String str = getStr();
{
System.out.println("A的实例块");
}
public A() {
System.out.println("A的构造方法");
}
private static String getStaticStr() {
System.out.println("A的静态属性初始化");
return null;
}
private String getStr() {
System.out.println("A的实例属性初始化");
return null;
}
public static void main(String[] args) {
new B();
new B();
}
}
class B extends A{
private static String staticStr = getStaticStr();
static {
System.out.println("B的静态块");
}
{
System.out.println("B的实例块");
}
public B() {
System.out.println("B的构造方法");
}
private String str = getStr();
private static String getStaticStr() {
System.out.println("B的静态属性初始化");
return null;
}
private String getStr() {
System.out.println("B的实例属性初始化");
return null;
}
}
执行结果:
A的静态块
A的静态属性初始化
B的静态属性初始化
B的静态块
A的实例属性初始化
A的实例块
A的构造方法
B的实例块
B的实例属性初始化
B的构造方法
A的实例属性初始化
A的实例块
A的构造方法
B的实例块
B的实例属性初始化
B的构造方法
Process finished with exit code 0