由Android 自定义dialog的变量赋值问题引发的自己对 Java 变量初始化的误区

首先先做一个测试:
1.创建父类:

   public abstract class BaseTest {

      public BaseTest() {
          initData();
      }

      public abstract void initData();
  }

2.创建子类:

   public class Test extends BaseTest {

      private int a = 3;

      @Override
      public void initData() {
          a= 5;
      }

      public int getA(){
          return a;
      }
  }

3.实例化并取值:

  Test test = new Test();
  int a = test.getA();
  Log.i("Test", a +"");// 此时a的值是3。

原因:
1.首先加载父类,初始化父类的静态成员变量和静态代码块
2.初始化子类静态方法和静态代码块
3.执行子类构造方法的super方法,super会实例化父类对象即初始化父类里面的成员变量,构造代码块,然后是父类构造方法
4.实例化子类即初始化子类的成员变量,构造代码块,最后执行子类的构造方法

综上,当实例化Test的时候会先执行BaseTest 的构造方法,BaseTest的构造方法会调用intiData,此时会给a赋值为5。之后执行Test的成员变量的初始化,所以a的值被赋值为了3.

你可能感兴趣的:(由Android 自定义dialog的变量赋值问题引发的自己对 Java 变量初始化的误区)