版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ScongHW/article/details/81565185
public class Demo {
{
System.out.println("父类普通代码块执行!");
}
static{
System.out.println("父类静态代码块执行!");
}
public Demo(){
System.out.println("父类构造函数执行!");
}
public static void main(String[] args) {
Demo1 d = new Demo1();
d.Demo2();
}
}
class Demo1 extends Demo{
{
System.out.println("子类普通代码块执行!");
}
static{
System.out.println("子类静态代码块执行!");
}
public Demo1(){
System.out.println("子类构造函数执行!");
}
public void Demo2(){
System.out.println("普通方法执行!");
}
}
执行结果:
父类静态代码块执行!
子类静态代码块执行!
父类普通代码块执行!
父类构造函数执行!
子类普通代码块执行!
子类构造函数执行!
普通方法执行!
执行顺序:静态代码块>普通代码块>构造函数>普通方法
public class Demo {
{
a=2;
}
int a = 1 ;
int b = 2;
{
b = 1;
}
@Test
public void test01(){
System.out.println("a="+a);
System.out.println("b="+b);
}
}
执行结果:a=1 b=1
出现这种现象的原因:程序开始前会先初始化a=0,b=0,然后程序按顺序执行。因此可以理解为普通属性先被初始化。
public class Demo {
public static String name= "zhangsan";
static{
System.out.println(name);
}
static{
System.out.println(name2); //程序会报错
}
public static String name2= "lisi";
}
上述代码块会报错,原因:name2属性未被定义,因此可以理解为静态代码块和静态属性谁在前谁先被加载。
public class Demo {
public static String name= "zhangsan";
public static void fun01(){
name = "lisi";
}
static{
System.out.println(name);
}
public static void main(String[] args) {
System.out.println(name);
fun01();
System.out.println(name);
}
}
执行结果:
zhangsan
zhangsan
lisi
因此:静态函数在类被加载时就会被加载,但只有当其被调用时才会被执行。
综上:加载顺序:静态变量(静态代码块或静态函数)>普通属性 > 普通代码块 > 构造函数 > 普通函数
静态变量、静态代码块、静态函数的加载顺序由它们所在的位置有关
执行顺序:静态变量(静态代码块) > 普通属性 > 普通代码块 > 构造函数
静态函数和普通函数只有被调用才会执行
注:静态变量和静态代码块只会执行一次