详解Java构造方法为什么不能覆盖,我的钻牛角尖病又犯了....
一
看Think in Java,遇到个程序
class Egg2 {
protected class Yolk {
public Yolk() {
System.out.println("Egg2.Yolk()");
}
public void f() {
System.out.println("Egg2.Yolk.f()");
}
}
private Yolk y = new Yolk();
public Egg2() {
System.out.println("New Egg2()");
}
public void insertYolk(Yolk yy) {
y = yy;
}
public void g() {
y.f();
}
}
public class BigEgg2 extends Egg2 {
public class Yolk extends Egg2.Yolk {
public Yolk() {
System.out.println("BigEgg2.Yolk()");
}
public void f() {
System.out.println("BigEgg2.Yolk.f()");
}
}
public BigEgg2() {
insertYolk(new Yolk());
}
public static void main(String[] args) {
// Egg2 e1 = null;
// Egg2 e2 = new BigEgg2();
// new Egg2();
new BigEgg2();
// e2.g();
}
} ///:~
输出
Egg2.Yolk()
New Egg2()
Egg2.Yolk()
BigEgg2.Yolk()
二
其实基本上我根据后面的几个注释,也大概明白了看的顺序构造顺序是什么,见图

构造顺序图

三
但是,看了输出,我就纳闷为什么,为什么第三行不是BigEgg2.Yolk(),不能覆盖吗?
Egg2.Yolk()
New Egg2()
Egg2.Yolk()
BigEgg2.Yolk()
四
分析一下
BigEgg2是Egg2的子类,他们都有Yolk的内部类,而且BigEgg2.Yolk继承了Egg2.Yolk。注意此处,同名类可以继承。
那么,他们构造方法为什么不能覆盖,都是Public Yolk(){}。
当然,网上都说子类继承父类除构造方法以外的所有方法,但这是结果,我要知道为什么!!
五
先说几个错误的观点
1.
有说构造方法的方法名与类名必须一样,父子类不能同名,故不能继,所以不能覆盖构造方法。
这个不用多说,这个例子,就是大神写出来打这样说的人的脸的。
2.
有说因为子类继承父类的时候,先运行父类构造函数;具体的说就是运行父类时就会先“调用”父类的构造函数,注意“调用”和继承不是一个含义,实质上是“自动运行”。
这个强行用中文语法来解释的,达到中文6级了啊。
3.
有说构造方法不是成员函数,故不能继承,所以谈不上覆盖。
这个真的有道理,是java官方文档上的。大多数人找到这里估计就满足了。
但是,跟太阳从东方升起西方落下那样,我想知道为甚么这么设计啊啊啊啊啊啊!!!!!
4.
正确答案
(1).构造器代表这个类本身,在创建之时申请内存。
(2).子类创建的时候,会默认在构造方法的第一行调用父类的默认构造方法-,若修改了必须显示调用。(这就是为什么创建子类时先创建完父类的原因了)
那么很明显了,要是同名类之间可以覆盖了,子类创建时就是创建了两个自己而没有父类。
Java设计的时候,他们绝对想到有些人会像强迫症那样折腾个同名类继承,然后实现构造覆盖的场景吧....
总结
构造方法是唯一的,不能又造爸爸又造儿子
详解Java构造方法为什么不能覆盖,我的钻牛角尖病又犯了....的更多相关文章
- 详解Java中的clone方法
详解Java中的clone方法 参考:http://blog.csdn.net/zhangjg_blog/article/details/18369201/ 所谓的复制对象,首先要分配一个和源对象同样 ...
- java基础(十五)----- Java 最全异常详解 ——Java高级开发必须懂的
本文将详解java中的异常和异常处理机制 异常简介 什么是异常? 程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常. Java异常的分类和类结构图 1.Java中的所 ...
- 实例详解 Java 死锁与破解死锁
锁和被保护资源之间的关系 我们把一段需要互斥执行的代码称为临界区.线程在进入临界区之前,首先尝试加锁 lock(),如果成功,则进入临界区,此时我们称这个线程持有锁:否则呢就等待,直到持有锁的线程解锁 ...
- 详解Java GC的工作原理+Minor GC、FullGC
详解Java GC的工作原理+Minor GC.FullGC 引用地址:http://www.blogjava.net/ldwblog/archive/2013/07/24/401919.html J ...
- Protocol Buffer技术详解(Java实例)
Protocol Buffer技术详解(Java实例) 该篇Blog和上一篇(C++实例)基本相同,只是面向于我们团队中的Java工程师,毕竟我们项目的前端部分是基于Android开发的,而且我们研发 ...
- 异常处理器详解 Java多线程异常处理机制 多线程中篇(四)
在Thread中有异常处理器相关的方法 在ThreadGroup中也有相关的异常处理方法 示例 未检查异常 对于未检查异常,将会直接宕掉,主线程则继续运行,程序会继续运行 在主线程中能不能捕获呢? 我 ...
- 第三节:带你详解Java的操作符,控制流程以及数组
前言 大家好,给大家带来带你详解Java的操作符,控制流程以及数组的概述,希望你们喜欢 操作符 算数操作符 一般的 +,-,*,/,还有两个自增 自减 ,以及一个取模 % 操作符. 这里的操作算法,一 ...
- 第十八节:详解Java抽象类和接口的区别
前言 对于面向对象编程来说,抽象是它的特征之一. 在Java中,实现抽象的机制分两种,一为抽象类,二为接口. 抽象类为abstract class,接口为Interface. 今天来学习一下Java中 ...
- 详解java动态代理机制以及使用场景
详解java动态代理机制以及使用场景 https://blog.csdn.net/u011784767/article/details/78281384 深入理解java动态代理的实现机制 https ...
随机推荐
- RTSP协议
1.RTSP与几个相关协议 RTSP(Real Time Streaming Protocol)实时流协议,是用来控制声音或影像的多媒体串流协议,并允许同时多个串流需求控制,传输时所用的网络通 ...
- BZOJ-4327:JSOI2012 玄武密码(AC自动机模板题)
在美丽的玄武湖畔,鸡鸣寺边,鸡笼山前,有一块富饶而秀美的土地,人们唤作进香河.相传一日,一缕紫气从天而至,只一瞬间便消失在了进香河中.老人们说,这是玄武神灵将天书藏匿在此. 很多年后,人们终于在进香 ...
- C#操作SQL Server中的Image类型数据
该例子是一个对SQL Server数据类型的一个操作例子,具有写入.读取功能. 1:准备数据库 1)创建数据库 Test 2)创建表 Table_1 (分别有2个字段:id(Int).photo(Im ...
- CF-845B
B. Luba And The Ticket time limit per test 2 seconds memory limit per test 256 megabytes input stand ...
- Uncommon Words from Two Sentences
https://leetcode.com/problems/uncommon-words-from-two-sentences We are given two sentences A and B. ...
- strlen细节以及sizeof细节
strlen细节以及sizeof细节前者会忽略结束符号,后者不会忽略结束符
- Java负数的位运算
/** * 求负数的位运算 *///1. -10 >> 2 = ?//2. -10的原码: 1000 0000 0000 0000 0000 0000 0000 1010 最高位代表符号位 ...
- IIS 上传大文件 30MB 设置限制了上传大小
用uploadify在IIS6下上传大文件没有问题,但是迁移到IIS7下面,上传大文件时,出现HTTP 404错误. 查了半天,原来是IIS7下的默认设置限制了上传大小.这个时候Web.Config中 ...
- 文本主题抽取:用gensim训练LDA模型
得知李航老师的<统计学习方法>出了第二版,我第一时间就买了.看了这本书的目录,非常高兴,好家伙,居然把主题模型都写了,还有pagerank.一路看到了马尔科夫蒙特卡罗方法和LDA主题模型这 ...
- Fedora下Msitools使用
msitools学习 msitools使用 wixl-heat使用 概述 打包程序就是把程序依赖的所有库文件和可执行文件以及其他一些资源文件按照源目录结构进行压缩,知道自己的程序依赖哪些库是简单的,但 ...