当前位置: 移动技术网 > IT编程>开发语言>Java > java面向对象易错题(持续收集中)

java面向对象易错题(持续收集中)

2020年07月12日  | 移动技术网IT编程  | 我要评论

1.求输出结果(知识点:类初始化的过程)

public class Demo {

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

  static class X {
        Y b = new Y();//这是成员变量初始化
        X() {
            System.out.print("X");
        }
    }

    static class Y {
        Y() {
            System.out.print("Y");
        }
    }
    public static class Z extends X {
        Y y = new Y();//Y
        Z() {
   
            System.out.print("Z");//Z
        }

    }
   
}

易错答案1:XZ.          因为没考虑到属性的加载

易错答案2:YYXZ.      因为没考虑到super其实仅仅时代表了初始化父类数据

结果:YXYZ

问题:

  1. 虽然子类中构造方法默认有一个super(),(初始化)的时候,(不是)按照那个顺序进行的。(而是)按照(分层)初始化进行的。它仅仅表示)要先初始化父类数据,再初始化子类数据。

  2. 属性的加载在构造函数之前

一个类初始化的过程

 

  1. 父类静态代码块/静态变量 ( java虚拟机加载类时,就会执行该块代码,故只执行一次)
  2. 子类静态代码块/静态变量 ( java虚拟机加载类时,就会执行该块代码,故只执行一次)
  3. 父类属性对象初始化
  4. 父类普通代码块(每次new,每次执行 )
  5. 父类构造函数(每次new,每次执行)
  6. 子 类 属性对象初始化
  7. 子类普通代码块(每次new,每次执行 )
  8. 子类构造函数(每次new,每次执行)

说明:静态代码块与静态变量的执行顺序同代码定义的顺序;非静态变量与代码块的执行顺序同代码执行顺序

参考

代码https://blog.csdn.net/qq_32059827/article/details/51327007

java类的初始化顺序:https://blog.csdn.net/shenzixincaiji/article/details/82792419

本文地址:https://blog.csdn.net/weixin_43372836/article/details/107271394

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网