Think In Java读书笔记:内部类覆盖及其初始化
本文相关章节:第十章 内部类 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读书笔记:内部类覆盖及其初始化的更多相关文章
- head first java读书笔记
head first java读书笔记 1. 基本信息 页数:689 阅读起止日期:20170104-20170215 2. 标签 Java入门 3. 价值 8分 4. 主题 使用面向对象的思路介绍J ...
- think in java 读书笔记 3 —— 数据报
目录 think in java 读书笔记 1 ——移位 think in java 读书笔记 2 —— 套接字 think in java 读书笔记 3 —— 数据报 概要 1. 数据报基本知识 2 ...
- think in java 读书笔记 2 —— 套接字
目录 think in java 读书笔记 1 ——移位 think in java 读书笔记 2 —— 套接字 think in java 读书笔记 3 —— 数据报 概要 1. 套接字基本知识 2 ...
- think in java 读书笔记 1 ——移位
目录 think in java 读书笔记 1 ——移位 think in java 读书笔记 2 —— 套接字 think in java 读书笔记 3 —— 数据报 在Think in Java中 ...
- Thinking In Java读书笔记--对象导论
Thinking In Java读书笔记--对象导论[对象]服务提供者==>将对象看做一个服务提供者[程序员分类][类创造者]/[客户端程序员] [访问控制存在的原因?][1]客户端程序员无法触 ...
- TIJ读书笔记08-数组的初始化和可变长参数形参
TIJ读书笔记08-数组的初始化和可变参数形参 数组 数组的声明 数组的初始化和赋值 可变参数列表 数组 相同类型的,用一个标识符名称封装到一起的一个对象序列或者基本数据类型序列叫数组.(多么严谨的概 ...
- Java读书笔记1
Java逍遥游记读书笔记 前言 必须先来一句,这是入门级别,高手勿喷~ 写Android的时候总有一些语句不是很理解,其实大部分是Java的内容,所以想系统的学下Java. 这本书——<Java ...
- java读书笔记二
这是我的一些读书笔记: 我研究了一下面向对象: 面向对象符合人类看待事物的一般规律,对象的方法的实现细节是包装的,只有对象方法的实现者了解细节 我觉得面向过程是由过程.步骤.函数组成,过程是核心,面向 ...
- Effective Java读书笔记完结啦
Effective Java是一本经典的书, 很实用的Java进阶读物, 提供了各个方面的best practices. 最近终于做完了Effective Java的读书笔记, 发布出来与大家共享. ...
- 初读"Thinking in Java"读书笔记之第七章 --- 复用类
组合语法 将对象引用置于新类中,即形成类的组合. 引用初始化方法 在定义处初始化. 在类的构造器中初始化. 在使用这些对象之前,进行"惰性初始化". 使用实例初始化. 继承语法 J ...
随机推荐
- 五、Delphi10.3通过REST单元使类和JSON数据互相转换
一.我们定义一个简单的类 TPeople = class private FName: string; FScore: Integer; FAge: TDateTime; public propert ...
- 使用zabbix发送邮件的简易设置流程(存档用)
1.安装邮件软件 (一般默认安装sendmail,这样apache也不用重新设置.) $sudo yum install sendmail 2.在zabbix上设置发送邮件用的本地邮箱 选择管理-&g ...
- 6.Exceptions-异常(Dart中文文档)
异常是用于标识程序发生未知异常.如果异常没有被捕获,If the exception isn't caught, the isolate that raised the exception is su ...
- PPAS的MTK tool 工具使用说明
磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面: PostgreSQL基础知识与基本操作索引页 回到顶级页面:PostgreSQL索引页 [作者 高健@博客园 luckyjackg ...
- Django中表单的用法深探
[转载说明:原文排版不是很好,为方便阅读,改进了排版] django的表单设计真的很棒,涉及非常多的功能,今天介绍django较为主流的几种表单使用方法.注:本文中表单与form通用.模型与model ...
- Deep Learning综述[下]
Image understanding with deep convolutional networks 直到2012年ImageNet大赛之前,卷积神经网络一直被主流机器视觉和机器学习社区所遗弃.2 ...
- AGC 018 F - Two Trees
F - Two Trees 链接 题意: 给定两棵都是N个节点的有根树,节点均从1~N标号.给每个标号定一个权值(类似一号点的权值是x,那么两棵树中1号点的权值都是x),使在两棵树满足以任意节点为根的 ...
- [HNOI2013]比赛 搜索
[HNOI2013]比赛 搜索. LG传送门 直接暴力有60,考场上写的60,结果挂成40. 考虑在暴力的同时加个记忆化,把剩下的球队数和每支球队的得分情况hash一下,每次搜到还剩\(t\)个队的时 ...
- P4048 [JSOI2010]冷冻波
出题人你tm搞笑呢,冰霜新星翻成冷冻波,而且tm就只能打一只小精灵???巫妖王都想来砍死你 首先要搞出每个巫妖能不能打到每一个小精灵,然后二分时间,就能算出每个巫妖可以打的次数,网络流check即可 ...
- 【JUC源码解析】Phaser
简介 Phaser,阶段器,可作为一个可复用的同步屏障,与CyclicBarrier和CountDownLatch类似,但更强大. 全览图 如上图所示,phaser,支持phaser树(图中,简化为p ...