关于JAVA继承类的静态变量、成员变量、父子类构造方法调用顺序的研究

本文通过具体示例详细解析了JAVA中继承类的静态变量、成员变量及构造方法的调用顺序。阐述了继承时静态变量与代码块的执行顺序,并介绍了如何正确理解构造函数的调用流程。

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

综合网上的相关帖子和我自己的调试,研究了一下关于JAVA继承类的静态变量、成员变量、父子类构造方法调用顺序问题。首先看一段程序:

class X {
 Y b = new Y();// 7、这里是父类成员变量初始化

 static Y sb = new Y();// 1行、父类静态变量,输出static Y(静态代码块先初始化),2行:Y

 static {
  System.out.println("static X父类静态代码块");// 3行、执行静态代码块
  new Y();// 4行、这里只是输出Y,有static Y(静态代码块只执行一次)
 }
 
 X() {
  System.out.println("X");// 8、父类成员变量初始化之后,执行父类构造器输出X
 }
}

class Y {
 static {
  System.out.println("static Y");
 }

 Y() {// 执行构造函数
  // 这里有个super()==Object()
  System.out.println("Y");
 }
}

public class Zextends X { //从这里开始继承会调用父类的static和static成员变量:2:
 final static int mead=45;
    final byte b=16;
    static Y sb= new Y();//5行、子类的静态变量,输出Y
    static{      
        System.out.println("static Z");//6行、子类的静态代码块
    }
    Y y = new Y();//9、这里是子类成员变量初始化

    Z() {
        //这里有super()==new X()
        this.y = null;
        System.out.println("Z");//10、子类成员变量初始化之后,执行子类构造器输出Z
    }

 

 public static void main(String[] args) {
  new Z();
 }
}

/*总结:1:继承类时会调用父类的Static的成员变量和Static代码块、顺序是按照2个Static代码的先后顺序执行
 * 2:继承情况下,首先是从顶层父类的静态变量和代码块开始执行,依次向下。同一个类中,执行的顺序是依照静态变量和静态代码在类中的编码顺序执行,
 * 变量和代码块无任何优先级之分。全部继承树中的类静态变量和代码块都初始化完毕后,开始从顶层父类执行非静态的类变量和类代码块初始化,执行顺序同静态,
 * 然后紧接着是执行构造函数,完毕后才向下,执行子类的类变量、代码块和构造函数。 非静态内部类中不能定义类静态代码块和非final的类静态变量;静态内部类,
 * 可以声明非final的静态变量和静态代码块。
 */

     

    本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/pisota/archive/2010/02/27/5332848.aspx

    评论 1
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值