【JAVA】父类和子类包换静态方法、静态变量的加载顺序

本文深入解析Java中类的初始化过程,包括静态变量、静态代码块的执行顺序,以及实例变量、非静态代码块的初始化流程。同时,探讨了方法重写原则和对象的多态性,通过具体代码示例解释了父类与子类在实例化过程中的调用顺序和行为差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目如下:

思考代码运行结果

Father
public class Father {
    private int i = test();
    private static int j = method();

    static {
        System.out.println("(1)");
    }

    Father() {
        System.out.println("(2)");
    }

    {
        System.out.println("(3)");  //非静态代码块
    }

    private int test() {
        System.out.println("(4)");
        return 1;
    }

    private static int method() {
        System.out.println("(5)");
        return 1;
    }
}


Son

public class Son extends Father {
    private int i = test();
    private static int j = method();
    static {
        System.out.println("(6)");
    }
    Son(){
        super(); //在子类构造器中一定会调用父类构造器,写或者不写都一样!!!
        System.out.println("(7)");
    }
    {
        System.out.println("(8)");
    }
    public int test(){
        System.out.println("(9)");
        return 1;
    }
    public static int method(){
        System.out.println("(10)");
        return 1;
    }

    public static void main(String[] args) {
    	//思考运行结果
        Son s1 =new Son();
        System.out.println();
        Son s2 =new Son();
    }
}

解题所用知识点总结

类的初始化过程
1.一个类要创建实例需要先加载并初始化该,
注意:main 方法所在类需要先加载和初始化
2.一个子类要初始化,一定会先初始化父类
3.一个初始化就是执行<clinit>()方法,这个方法是编译器生成的
    <clinit>()方法由静态类变量显示复制代码和静态代码块组成
    类变量显示赋值代码和静态代码块从上到下顺序执行
    <clinit>()方法只执行一次
实例初始化过程
1.就是执行<init>()方法
       <init>()方法可能重载有多个,有几个构造器就有几个<init>方法
       <init>()方法由非静态实例变量显式赋值代码 和 非静态代码块,
       			对应构造器代码块组成。
       非静态实例变量显式赋值代码块和非静态代码快从上到下的
       			顺序执行,而对应的构造器代码最后执行。
       每次创建实例对象,调用对应的构造器,执行的就是<init>方法
       <init>方法的首行是super()或super(实参列表),即父类的<init>方法 
方法的重写Override
1) 哪些方法不会被重写
    final方法
    静态方法
    private等子类中不可见方法
2) 对象的多态性
    子类如果重写了父类的方法,通过子类对象调用的一定是子类重写过的代码
    非静态方法默认的调用对象是this
    this对象在构造器或者说<init>方法中就是正在创建的对象
解题步骤:

1)

  • 先初始化父类得:(5)(1)
  • 初始化子类得:(10)(6)

2)根据上述知识知首先分析父类

  • 父类< clinit >()
  • j = method();
  • 父类静态代码块
  • 父类实例化方法:
  • (1):super() 最前
  • (2):i = test();
  • (3):父类的非静态代码块
  • (4):父类的无参构造方法 最后
  • 非静态方法前面有一个默认的this
  • this在构造器(或)他表示的是正在创建的对象,因为这里是在创建Son对象,所以 test()执行的是子类重写的代码(面向对象多态)
  • 这里的i=test()执行的是子类重写的test()方法

3)

  • 子类实例化方法:
  • (1):super() 最前 (4)(3)(2)
  • (2):i = test(); (9)
  • (3):子类的非静态代码块 (8)
  • (4):子类的无参构造方法 最后 (7)

4) 最后: 由于创建了两个Son对象,因此实例化方法执行两次

运行结果
(5)
(1)
(10)
(6)
(4)
(3)
(2)
(9)
(8)
(7)

(4)
(3)
(2)
(9)
(8)
(7)
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值