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 ...
随机推荐
- 外部容器出现塌陷现象(伪类after、before的使用)
伪类after.before的使用 ::before//伪元素 :hover//伪类 #all::after{ display:table; clear:both; content:"&qu ...
- PTA-括号问题
括号问题 作者: 李廷元 单位: 中国民用航空飞行学院 时间限制: 400 ms 内存限制: 64 MB 代码长度限制: 16 KB 问题描述 给定一串字符,不超过100个字符,可能包括括号.数字.字 ...
- Java面向对象六大原则
引用自百度知道: ——根据首字母快速记忆SOLID(固体,坚固的),具体请参考这里 1) Open-Close Principle(OCP),开-闭原则, 讲的是设计要对扩展有好的支持,而对修改要严格 ...
- JavaWeb基础—VerifyCode源码
package com.jiangbei.verifycodeutils; import java.awt.BasicStroke; import java.awt.Color; import jav ...
- 准确率,召回率,F值
下面简单列举几种常用的推荐系统评测指标: 1.准确率与召回率(Precision & Recall) 准确率和召回率是广泛用于信息检索和统计学分类领域的两个度量值,用来评价结果的质量.其中精度 ...
- JavaScript总结(六)
使用DOM操纵样式表 ✍ 操纵元素的Style样式属性(所有的均对于CSS的内联式) 对于每个CSS样式,Style对象都包含了一个相对应的属性,只需要用到style属性即可: Div.style.c ...
- 【转载】基于MFC的ActiveX控件开发(3)
原文:http://iysm.net/?p=122 3.事件 ActiveX 控件使用事件通知容器控件上发生了某些事情.事件的常见示例包括单击控件.使用键盘输入数据和控件状态更改.当发生这些操作时,控 ...
- css绘制常见的几何图形
前言:终于我的大一生活结束了,迎来了愉快的暑假,大家都开始了各自的忙碌.一直忙着一些项目的事情,终于决定今天要更新一篇博客了,对上一阶段的学习做简单的总结. 这次我主要总结一下用Css绘制各种形状的技 ...
- stringObject.substring(start,stop)
用于提取字符串中 介于两个指定下标之间的字符. start 必需.一个非负的整数 stop 可选.一个非负的整数
- WordPress函数wp_page_menu详解
说明 该标签显示带有链接的WordPress页面列表,并且可以选择将 Home(主页)自动显示为列表中的一员.该标签是自定义侧边栏和标题栏的好帮手,同时还可以用在其它模板中. WordPress教程 ...