由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.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 这是16年5月份编辑的一份比较杂乱适合自己观看的学习记录文档,今天18年5月份再次想写文章,发现简书还为我保存起的...
    Jenaral阅读 7,876评论 2 9
  • 一:java概述: 1,JDK:Java Development Kit,java的开发和运行环境,java的开发...
    慕容小伟阅读 5,791评论 0 10
  • 整理来自互联网 1,JDK:Java Development Kit,java的开发和运行环境,java的开发工具...
    Ncompass阅读 5,401评论 0 6
  • 面向对象笔记 一、 对象在内存中的存放方法以及被调用过程 class文件首先被加载到方法区中的class文件内容区...
    VictorBXv阅读 3,318评论 0 2
  • 《白夜行》 一个人能有多坚强 又能独自承受多少 没有人可以在没有太阳的情况下生存 男孩儿为女孩儿杀父 女孩儿为保护...
    小先生吖阅读 2,206评论 0 0