本文相关章节:第十章 内部类 10.10 内部类可以被覆盖吗

  在读至本节第二个范例代码时(及下方的代码),我对输出结果中的第一个“Egg.Yolk()”很不理解,为什么它会第一个地方输出。

  我起初认为是在调用BigEgg.Yolk的构造器时初始化其父类调用父类构造器输出的,毕竟在main方法中第一行是在调用BigEgg的构造器,而它的构造器中首先调用了BigEgg.Yolk的构造器,在调用BigEgg.Yolk构造器时初始化其父类Egg.Yolk才输出的“Egg.Yolk()”。但书中却明确说明了第二个“EGG.Yolk()”是子类BigEgg.Yolk初始化其父类输出的,这就使我产生了迷惑——那第一个“Egg.Yolk()”到底是怎么输出的呢?

  (书中范例代码,原文中因为是第二个范例所有的类都命名为“xxx2”,在这里我将所有的2都删去了)

/**
* Created by dsa44 on 2018/4/21.
*/
class Egg{ class Yolk{
public Yolk(){
System.out.println("Egg.Yolk()");
}
public void f(){
System.out.println("Egg.Yolk.f()");
}
} private Yolk y = new Yolk(); public Egg(){
System.out.println("new Egg()");
} public void insertYolk(Yolk yy){
y = yy;
} public void g(){
y.f();
}
}
public class BigEgg extends Egg{ public class Yolk extends Egg.Yolk{ public Yolk() {
System.out.println("BigEgg.Yolk()");
} public void f(){
System.out.println("BigEgg.Yolk.f()");
}
} public BigEgg(){
insertYolk(new Yolk());
} public static void main(String[] args){
Egg e = new BigEgg();
e.g();
}
}/* 输出结果
Egg.Yolk()
new Egg()
Egg.Yolk()
BigEgg.Yolk()
BigEgg.Yolk.f()
*/

  这其中的关键点也是书中没提到的我认为就是BigEgg构造器到底是在何时开始运行的(实际上也只有BigEgg的构造器没有输出任何信息),于是我在BigEgg的构造器中添加了输出“new BigEgg()”的语句。结果如下:

  

  我想在这里就已经真相大白了:

  在调用BigEgg构造器时,其构造器首先调用了其父类Egg的构造器(即首先初始化它自己的父类),在初始化父类Egg时首先初始化了父类的数据域,而它的父类Egg的数据域只有一个私有的Egg.Yolk类型的引用y,且在这里对y进行了初始化,调用它的构造器Egg.Yolk(),故输出了第一句“Egg.Yolk()”。

  在初始化Egg的数据域后便运行了Egg的构造器(输出“new Egg()”),在自己的父类完成初始化后BigEgg的构造器开始运行(输出“new BigEgg()”),然后运行父类Egg的方法insertYolk,在其参数部分运行BigEgg.Yolk的构造器,在这里就变成了我刚开始提到的那一部分,于是相继输出了“Egg.Yolk()”“BigEgg.Yolk()”,最后虽然BigEgg.Yolk向上转型,但因为动态绑定的关系,在调用e.f()时,依旧输出的时属于BigEgg.Yolk的f方法,输出“BigEgg.Yolk.f()”。

  总结:在这里遇到问题的主要原因还是因为对于第五章初始化部分了解的不够详细(知识点:父类初始化是在子类构造器未运行前就进行的,也可以说是在调用子类构造器时就开始了父类的初始化并在其初始化完成后开始运行子类的构造器)。

Think In Java读书笔记:内部类覆盖及其初始化的更多相关文章

  1. head first java读书笔记

    head first java读书笔记 1. 基本信息 页数:689 阅读起止日期:20170104-20170215 2. 标签 Java入门 3. 价值 8分 4. 主题 使用面向对象的思路介绍J ...

  2. think in java 读书笔记 3 —— 数据报

    目录 think in java 读书笔记 1 ——移位 think in java 读书笔记 2 —— 套接字 think in java 读书笔记 3 —— 数据报 概要 1. 数据报基本知识 2 ...

  3. think in java 读书笔记 2 —— 套接字

    目录 think in java 读书笔记 1 ——移位 think in java 读书笔记 2 —— 套接字 think in java 读书笔记 3 —— 数据报 概要 1. 套接字基本知识 2 ...

  4. think in java 读书笔记 1 ——移位

    目录 think in java 读书笔记 1 ——移位 think in java 读书笔记 2 —— 套接字 think in java 读书笔记 3 —— 数据报 在Think in Java中 ...

  5. Thinking In Java读书笔记--对象导论

    Thinking In Java读书笔记--对象导论[对象]服务提供者==>将对象看做一个服务提供者[程序员分类][类创造者]/[客户端程序员] [访问控制存在的原因?][1]客户端程序员无法触 ...

  6. TIJ读书笔记08-数组的初始化和可变长参数形参

    TIJ读书笔记08-数组的初始化和可变参数形参 数组 数组的声明 数组的初始化和赋值 可变参数列表 数组 相同类型的,用一个标识符名称封装到一起的一个对象序列或者基本数据类型序列叫数组.(多么严谨的概 ...

  7. Java读书笔记1

    Java逍遥游记读书笔记 前言 必须先来一句,这是入门级别,高手勿喷~ 写Android的时候总有一些语句不是很理解,其实大部分是Java的内容,所以想系统的学下Java. 这本书——<Java ...

  8. java读书笔记二

    这是我的一些读书笔记: 我研究了一下面向对象: 面向对象符合人类看待事物的一般规律,对象的方法的实现细节是包装的,只有对象方法的实现者了解细节 我觉得面向过程是由过程.步骤.函数组成,过程是核心,面向 ...

  9. Effective Java读书笔记完结啦

    Effective Java是一本经典的书, 很实用的Java进阶读物, 提供了各个方面的best practices. 最近终于做完了Effective Java的读书笔记, 发布出来与大家共享. ...

  10. 初读"Thinking in Java"读书笔记之第七章 --- 复用类

    组合语法 将对象引用置于新类中,即形成类的组合. 引用初始化方法 在定义处初始化. 在类的构造器中初始化. 在使用这些对象之前,进行"惰性初始化". 使用实例初始化. 继承语法 J ...

随机推荐

  1. swoft orm中的坑(针对实体类的属性名称和数据库字段不相等)

    最近在用swoft的orm,发现了一些问题: 首先看下实体类的定义 它的属性名称和所映射的数据库字段名不一致,这个就会导致蛋疼的问题,首先,在我们使用orm的时候,应该使用哪个字段? 我直接说结论,在 ...

  2. 二级管工作原理(PN结原理)学习

    0.小叙闲言 前面已经写了两篇介绍放大器应用和MOSFET作驱动的文章:常规放大电路和差分放大电路和MOSFET使用与H桥驱动问题.但是对它们的工作原理并没有进一步研究一下,今天写下这篇文章,主要是介 ...

  3. JavaScript总结(一)

    什么是JavaScript? 首先我们要知道它是什么?JavaScript是一门专门用来对网页进行编程的脚本语言:因为我是学习Java之后再来学习JavaScript的,所以我的第一疑问JavaScr ...

  4. matplotlib绑定到PyQt5(无菜单)

    很简单的实现matplotlib绑定到PyQt5 [知识点] import matplotlib matplotlib.use("Qt5Agg") from matplotlib. ...

  5. [Qt扒手] PyQt5 基础绘画例子

    [说明] 好吧,坦白从宽,我是Qt扒手(不要鄙视我).这是我根据qt官网提供的C++版本的例子(http://doc.qt.io/qt-5/qtwidgets-painting-basicdrawin ...

  6. 指定路由器(DR/BDR)和非指定路由器(DROTHER)的区别

    一:名词解释 DR:designated router 指定路由器. BDR:backup designated router 备份指定路由器. 二:DR/BDR出现的缘由 在广播网和NBMA网络中, ...

  7. IT程序员每天的困扰:这TM为啥不可以?这TM也行?

    如果有对 Python 感兴趣的程序员,可以加我们小助手的QQ:979950755 会免费送 Python 的视频教程噢! 随着IT互联网对社会的影响越来越重要,关乎人类的未来发展进程.所以现在很多媒 ...

  8. UWP DEP0700: 应用程序注册失败。[0x80073CF9] 另一个用户已安装此应用的未打包版本。当前用户无法将该版本替换为打包版本。

    最近电脑抽风,我在[应用程序和功能]中重置了以下我的App自然灾害,居然,搞出大新闻了. 它居然从列表中消失了... vs再次编译代码的时候,提示 严重性 代码 说明 项目 文件 行 禁止显示状态 错 ...

  9. SpringBoot日记——Cache缓存篇

    通常我们访问数据的情况如下图,数据存缓存就取缓存,不存缓存就取数据库,这样可以提升效率,不用一直读取数据库的信息: 开始记录: 关于SpringBoot缓存的应用 1. 首先在pom.xml文件中添加 ...

  10. 自动化工具 fastmonkey

    Android Monkey 二次开发,实现高速点击的 Android Monkey 一.工具介绍: 1.本工具是testhome上 zhangzhao_lenovo开源出来的工具,源码暂时还未开源: ...