欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-04-19 09:08:47
java面向对象易错题...

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