看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构造方法为什么不能覆盖,我的钻牛角尖病又犯了....的更多相关文章

  1. 详解Java中的clone方法

    详解Java中的clone方法 参考:http://blog.csdn.net/zhangjg_blog/article/details/18369201/ 所谓的复制对象,首先要分配一个和源对象同样 ...

  2. java基础(十五)----- Java 最全异常详解 ——Java高级开发必须懂的

    本文将详解java中的异常和异常处理机制 异常简介 什么是异常? 程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常. Java异常的分类和类结构图 1.Java中的所 ...

  3. 实例详解 Java 死锁与破解死锁

    锁和被保护资源之间的关系 我们把一段需要互斥执行的代码称为临界区.线程在进入临界区之前,首先尝试加锁 lock(),如果成功,则进入临界区,此时我们称这个线程持有锁:否则呢就等待,直到持有锁的线程解锁 ...

  4. 详解Java GC的工作原理+Minor GC、FullGC

    详解Java GC的工作原理+Minor GC.FullGC 引用地址:http://www.blogjava.net/ldwblog/archive/2013/07/24/401919.html J ...

  5. Protocol Buffer技术详解(Java实例)

    Protocol Buffer技术详解(Java实例) 该篇Blog和上一篇(C++实例)基本相同,只是面向于我们团队中的Java工程师,毕竟我们项目的前端部分是基于Android开发的,而且我们研发 ...

  6. 异常处理器详解 Java多线程异常处理机制 多线程中篇(四)

    在Thread中有异常处理器相关的方法 在ThreadGroup中也有相关的异常处理方法 示例 未检查异常 对于未检查异常,将会直接宕掉,主线程则继续运行,程序会继续运行 在主线程中能不能捕获呢? 我 ...

  7. 第三节:带你详解Java的操作符,控制流程以及数组

    前言 大家好,给大家带来带你详解Java的操作符,控制流程以及数组的概述,希望你们喜欢 操作符 算数操作符 一般的 +,-,*,/,还有两个自增 自减 ,以及一个取模 % 操作符. 这里的操作算法,一 ...

  8. 第十八节:详解Java抽象类和接口的区别

    前言 对于面向对象编程来说,抽象是它的特征之一. 在Java中,实现抽象的机制分两种,一为抽象类,二为接口. 抽象类为abstract class,接口为Interface. 今天来学习一下Java中 ...

  9. 详解java动态代理机制以及使用场景

    详解java动态代理机制以及使用场景 https://blog.csdn.net/u011784767/article/details/78281384 深入理解java动态代理的实现机制 https ...

随机推荐

  1. ACM学习历程——POJ3295 Tautology(搜索,二叉树)

    Description WFF 'N PROOF is a logic game played with dice. Each die has six faces representing some ...

  2. Linux中vsftpd安装和配置

    目录 Redhat/CentOS安装vsftp软件 Ubuntu/Debian安装vsftp软件 Redhat/CentOS安装vsftp软件 1. 安装vsftp $ yum install vsf ...

  3. 洛谷 P3804 [模板] 后缀自动机

    题目:https://www.luogu.org/problemnew/show/P3804 模仿了一篇题解,感觉很好写啊. 代码如下: #include<cstdio> #include ...

  4. bzoj4763

    $分块$ $一个很有趣的技巧$ $在树上选sqrt(n)个关键点,每两个关键点之间的距离<=sqrt(n),每个关键点属于一条链$ $预处理出每两个关键点的bitset$ $每次询问就暴力向上爬 ...

  5. 面试问题 - C# 接口和抽象类的区别

    这个问题基本上可以说是 面试时的必问问题 C# 中的接口和抽象类 相同点: 1. 都不能直接实例化,都可以通过继承实现其抽象方法 2. 都是面向抽象编程的技术基础,实现了诸多的设计模式 不同点: 1. ...

  6. Javascript中的"\r\n"

    我们知道 \r 代表的是 回车符(ACSII: 13 或0x0d), 也就是"硬回车" \n 代表的是 换行符(ACSII: 10 或 0x0a), 也就是 "软回车&q ...

  7. Python 如何连接并操作 Aws 上 PB 级云数据仓库 Redshift

    Python 如何连接并操作 Aws 上 PB 级云数据仓库 Redshift 一.简介 Amazon Redshift 是一个快速.可扩展的数据仓库,可以简单.经济高效地分析数据仓库和数据湖中的所有 ...

  8. ASP.NEt ajax 弹出窗口在页面无法关闭

    <meta http-equiv="X-UA-Compatible" content="IE=9" />     今天又有客戶投訴公司的網頁有問題. ...

  9. FZU - 2109 Mountain Number 数位dp

    Mountain Number One integer number x is called "Mountain Number" if: (1) x>0 and x is a ...

  10. PHP之递归函数

    https://www.cnsecer.com/4146.html http://www.jb51.net/article/71424.htm //一列数字的规则如下:1,1,2,3,5,8,13,2 ...