故事背景

  《狸猫换太子》在我国民间文学中很出名,故事剧情大致如下:北宋第三位皇帝宋真宗赵恒年长无子,他的两个妃子刘妃与李妃同时怀了身孕。真宗召见二人,各赐信物,并声明哪个生了儿子就立谁为皇后。生性阴险的刘妃在太监郭槐的帮助下,把李妃生下的孩子换成了剥了皮的狸猫,命承御寇珠将孩子抛人九曲桥下淹死。

寇珠不忍,求计于太监陈琳,将太子藏入妆盒,密送八贤王赵德芳处抚养。刘妃诬告李妃产下妖摩,于是真宗将李妃贬入冷宫,册封刘妃为皇后。郭槐告发寇珠与陈琳在九曲桥私会,刘皇后命陈琳拷问寇珠,寇珠不屈,触柱而亡。刘皇后又命郭槐火烧冷官,李妃被内监救出,流落民间。

18年后,真宗死,李妃之子赵祯即位为仁宗,包拯至陈州赈济,李妃鸣冤,包拯受状查明沉冤。仁宗斩郭槐,贬刘大后,迎母亲回官,母子团聚,“狸猫换太子”真相大自。

java之狸猫太子

我们假定正确的构造方法在java中为太子,假的构造方法为狸猫,那我们看一下下面的程序会打印出什么结果吧?

public class ConstructorTest {
static {
System.out.println("who is prince? ");
}
public void ConstructorTest() {
System.out.println("i am prince!");
}
public void getName() {
System.out.println("i am not prince");
}
public static void main(String[] args) {
ConstructorTest test=new ConstructorTest();
test.getName();
}
}

我们本来想打印出太子:

who is prince?
i am prince

真实运行打印出的却是狸猫:

who is prince?
i am not prince

那到底是什么一回事呢?

原来是皇帝受奸臣void 蒙蔽了,将真假太子弄错了。

太监void后面的不是太子(构造器),而是普通方法,在main方法中并没调用该方法,而由于没有任何声明的构造器,所以编译器会帮助(真的是在帮忙吗?)生成一个公共的无参数构造器,它除了初始化它所创建的域实例之外,不做任何事情。

java之太子之争

  因构造方法可以有多个,就会产生太子之争,那么怎么识别谁才是真正的太子呢?

public class Confusing {
private Confusing(Object o) {
System.out.println("Object");
} private Confusing(double[] dArray) {
System.out.println("double array");
} public static void main(String[] args) {
new Confusing(null);
}
}

上面的题目给你了两个容易令人混淆的构造器。main 方法调用了一个构造器,但是它调用的到底是哪一个呢?该程序的输出取决于这个问题的答案。那么它到底会打印出什么呢?甚至它是否是合法的呢?

Java 的方法(包括构造器方法)触发过程是以两阶段运行的。第一阶段选取所有可获得并且可应用的方法或构造器。第二阶段在第一阶段选取的方法或构造器中选取最精确的一个。如果一个方法或构造器可以接受传递给另一个方法或构造器的任何参数,那么我们就说第一个方法比第二个方法缺乏精确性[JLS 15.12.2.5]

在我们的程序中,两个构造器都是可获得并且可应用的。构造器Confusing(Object)可以接受任何传递给Confusing(double[ ])的参数,因此Confusing(Object)相对缺乏精确性。(每一个double 数组都是一个Object,但是每一个Object 并不一定是一个double 数组。)因此,最精确的构造器就是

Confusing(double[ ])。故结果是:double array

参考资料

【1】https://baijiahao.baidu.com/s?id=1613952761238601257&wfr=spider&for=pc

【2】https://docs.oracle.com/javase/specs/jls/se12/html/jls-15.html#jls-15.12

【3】java解惑

最新文章

  1. kindeditor4整合SyntaxHighlighter,让代码亮起来
  2. 再次学习 java 类的编译
  3. 延时调用--deferred.js原码分析
  4. win10怎么取消登录密码
  5. spring 源码下载地址
  6. 递归获取字符串内的所有图片src地址
  7. 夺命雷公狗ThinkPHP项目之----企业网站1之快速搭建后台
  8. Eval is Devil-MongoDB master/slave上运行Eval遇到的问题
  9. angularjs取Sevice和directive的引用
  10. netsat -ano 查看已占用的端口以及tomcat出现端口被占或者启动失败问题
  11. JavaScript细节整理
  12. HDU 1325,POJ 1308 Is It A Tree
  13. python查询完结篇
  14. Jenkins的初级应用(2)-Invoke Phing targets
  15. JVM读书笔记之OOM
  16. oldboy s21day02
  17. TI 多模雷达1843毫米波雷达做自动泊车(用了8个雷达)
  18. CSSの変数を使う
  19. Java 数组的 12 个最佳方法
  20. Group Normalization笔记

热门文章

  1. CentOS7配置网络ip地址
  2. MySQL之Xtrabackup的使用
  3. js 截屏保存图片
  4. Codeforces 246C
  5. 洛谷 P1135 【奇怪的电梯】
  6. 牛客20347 SDOI2011计算器(bsgs
  7. 【百度之星】【java大数+C++做法】hdu 6719 Strassen
  8. 如何配置nginx和tomcat实现反向代理?
  9. 面向对象程序设计(Java) 第2周学习指导及要求
  10. Linux基础提高_系统性能相关命令