静态代码块、静态变量,构造代码块、实例变量的执行顺序
程序员文章站
2024-03-23 12:45:28
...
静态代码块、静态变量,构造代码块、实例变量的执行顺序
1、父类和子类有同名同类型的属性时
public class Test {
public static void main(String[] args) {
// 使用多态
Parent chidParent = new Child();
System.out.println("Parent:" + chidParent.getAge()); //40
System.out.println("Parent:" + chidParent.age); //18 这个结果你能接受吗?哈哈
// 直接使用原本类型
Child child = new Child();
System.out.println("Child:" + child.getAge()); //40
System.out.println("Child:" + child.age); //40
}
}
@Getter
@Setter
class Child extends Parent {
public Integer age = 40;
}
@Getter
@Setter
class Parent {
public Integer age = 18;
}
-
属性属于实例自己的,所以Parent的age属性值是18,这就解释通了
-
属性不存在覆盖(即使同名),而方法是实实在在的覆盖(复写)。所以你调用
getAge()
方法返回的100%是40喽2、
public class Test { public static void main(String[] args) { new Child(); } } @Getter class Child extends Parent { static { System.out.println("Child的静态块"); } { System.out.println("Child的构造块"); } Child() { System.out.println("Child的构造方法"); } } @Getter class Parent { Integer age = 18; static { System.out.println("Parent的静态块"); } { System.out.println("Parent的构造块"); } Parent() { System.out.println("Parent的构造方法"); } }
结果输出:
Parent的静态块
Child的静态块
Parent的构造块
Parent的构造方法
Child的构造块
Child的构造方法
如果子类的构造器没有显示地调用父类的构造器,则将自动调用父类默认(没有参数) 的构造器
3、
public class StaticTest {
public static void main(String[] args) {
staticFunction();
}
// 静态变量(有实例化的过程,这就是本题的重点)
static StaticTest st = new StaticTest();
static {
//System.out.println(b); // 编译报错:因为b在构造代码块后边,此处不能引用。因此Java代码是从上到下的顺序
System.out.println("1");
}
{
System.out.println("2");
}
StaticTest() {
System.out.println("3");
System.out.println("a=" + a + ",b=" + b);
}
public static void staticFunction() {
System.out.println("4");
}
// 这两个变量写在最后面
int a = 110;
static int b = 112;
}
2
3
a=110,b=0
1
4
-
先初始化静态变量,也就是执行
new StaticTest()
,从而打印:2 -
再执行构造函数,打印:3和
a=110,b=0
- 为何a=110,而b却为0呢?
- 执行构造函数之前,必须初始化实例属性,所以a=110
- 静态变量从上到下初始化,而
st
变量还没初始化完呢,所以b此时值为0
- 为何a=110,而b却为0呢?
-
执行紧跟着的静态代码块。打印:1
-
执行静态方法
staticFunction
,打印:4
4、静态代码块属于类的,并且优先于main方法执行
public class StaticDemo1 {
public static void main(String[] args) {
speak();
//StaticDemo1 t1 = new StaticDemo1();
//System.out.println(t1.i);
}
// 静态变量
static int i = 1;
// 静态方法
static void speak() {
System.out.println("a");
}
// 静态代码块
static {
i = i + 3;
System.out.println(i);
}
// 构造函数
public StaticDemo1() {
i = i + 5;
System.out.println(i);
}
}
4
a
5、
public class StaticDemo1 {
public static void main(String[] args) {
StaticDemo1 t1 = new StaticDemo1();
System.out.println(t1.i);
speak();
}
// 静态变量
static int i = 1;
// 静态方法
static void speak() {
System.out.println("a");
}
// 静态代码块
static {
i = i + 3;
System.out.println(i);
}
// 构造函数
public StaticDemo1() {
i = i + 5;
System.out.println(i);
}
}
4
a
9
9
推荐阅读
-
静态代码块、静态变量,构造代码块、实例变量的执行顺序
-
java中子类与父类中的静态代码块、非静态代码块和构造函数的加载顺序 博客分类: JAVA基础 静态代码块非静态代码块加载顺序
-
java中子类与父类中的静态代码块、非静态代码块和构造函数的加载顺序 博客分类: JAVA基础 静态代码块非静态代码块加载顺序
-
java中的静态代码块、构造代码块、构造方法详解
-
java中的静态代码块、构造代码块、构造方法详解
-
关于Java中静态代码块的执行浅析
-
关于Java中静态代码块的执行浅析
-
Java 普通代码块静态代码块执行顺序(实例讲解)
-
java中静态代码块与构造方法的执行顺序判断
-
Java 普通代码块静态代码块执行顺序(实例讲解)