最近在看内部类, 但是被“为什么匿名内部类或者局部内部类使用方法的局部变量时, 局部变量一定得是final类型”困扰着, 在网上查找资料的时候, 发现我对类初始化完全不了解, 之前的认识都是错误! 所以回头又看了看基础的初始化, 在看初始化的时候, 就发现一点, 就是“为什么只能在构造器的第一行写this() 或者super()?” 我比较笨,又想了好久,上网查了下资料,看了看书才明白。

在说这个问题之前,首先得要明白super()和this()的意义:

  1. this() 之所以存在, 我个人认为原因很简单, 就是为了代码的复用(纯粹的个人观点, 不知道是否正确)
  2. super()之所以存在, 是有很重要的原因的! 因为子类与父类之间是继承关系, 而继承就意味着得到父类中所有的成员变量和方法. 既然能够得到父类的这些成员, 也就意味着子类可以访问父类的方法和成员变量(当然, 得到不意味着就可以任意使用, 使用的前提是必须是有相应的访问权限) , 如果子类在使用父类成员的时候, 父类内的成员变量没有得到正确的初始化, 那么就会发生意想不到的错误, 所以问题就出现在了这里, 如何保证父类成员是安全的呢? 这就得保证父类得到了正确的初始化, 而父类对象正确的初始化就离不开父类的构造函数, super存在的意义也正是如此. 在子类的构造函数中,如果没有显式使用super() , 并且第一行没有使用this()调用子类的构造函数, 那么编译器就会自动在第一行补齐super()来调用父类的默认构造函数, 如果父类没有默认的构造函数就会报错.

为什么一定要在第一行?

  super()在第一行的原因就是: 子类有可能访问了父类对象, 比如在构造函数中使用父类对象的成员函数和变量, 在成员初始化使用了父类, 在代码块中使用了父类等, 所以为保证在子类可以访问父类对象之前要完成对父类对象的初始化

  this()在第一行的原因就是: 为保证父类对象初始化的唯一性. 我们假设一种情况, 类B是类A的子类, 如果this()可以在构造函数的任意行使用, 那么会出现什么情况呢? 首先程序运行到构造函数B()的第一行, 发现没有调用this()和super(), 就自动在第一行补齐了super() , 完成了对父类对象的初始化, 然后返回子类的构造函数继续执行, 当运行到构造函数B()的"this(2) ;"时, 调用B类对象的B(int) 构造函数, 在B(int)中, 还会对父类对象再次初始化! 这就造成了对资源的浪费, 当然也有可能造成某些意想不到的结果, 不管怎样, 总之是不合理的, 所以this() 不能出现在除第一行以外的其他行!

当创建一个子类对象的时候, 该对象会包含一个父类的子对象, 不管你是否使用.

//thinking in java笔记,如果有不对的地方,还望指正^_^

最新文章

  1. hive 调优总结
  2. 第一篇:Entity Framework 简介
  3. Boom.TV完成350万美元融资,目标直指VR电竞直播
  4. 基于@AspectJ和schema的aop(一)
  5. asp.net错误日志写入
  6. IOS APP配置.plist汇总(转自coolweather )
  7. NET,ASP.NET,C#,WinFrom之间的联系与区别
  8. [译]Java 设计模式之适配器
  9. 【十八】php文件下载源码
  10. 利用PowerDesigner15在win7系统下对MySQL 进行反向工程(三)
  11. bugku 逆向 take the maze
  12. 2018-2019-2-20175225 实验一 《Java开发环境的熟悉》实验报告
  13. tomcat7的catalina.sh配置说明
  14. 【PE结构】PIMAGE_FILE_HEADER中TimeDateStamp的时间戳与标准时间转换
  15. L0/L1/L2范数(转载)
  16. 【LeetCode】235. Lowest Common Ancestor of a Binary Search Tree (2 solutions)
  17. [UE4]C++ getter and setter
  18. 1.2Linux下C语言开发基础(学习过程)
  19. 【二分图最大匹配】【匈牙利算法】zoj3988 Prime Set
  20. 机器学习:让我们彻底搞懂CNN【转】

热门文章

  1. FastNet C++/Python 网络通信库之 协议
  2. 2019天梯赛练习题(L1专项练习)
  3. Mysql中max函数取得的值不是最大
  4. SVN服务器的部署与安装
  5. String字符串的遍历
  6. Python 迭代器&生成器,装饰器,递归,算法基础:二分查找、二维数组转换,正则表达式,作业:计算器开发
  7. 76. Spring Boot完美解决(406)Could not find acceptable representation原因及解决方法
  8. 洛谷P1759 通天之潜水
  9. 【三分+精度问题】G. Toxophily
  10. react.js 给标识ref,获取内容