谁是狸猫谁是太子?--戏说java构造器
故事背景
《狸猫换太子》在我国民间文学中很出名,故事剧情大致如下:北宋第三位皇帝宋真宗赵恒年长无子,他的两个妃子刘妃与李妃同时怀了身孕。真宗召见二人,各赐信物,并声明哪个生了儿子就立谁为皇后。生性阴险的刘妃在太监郭槐的帮助下,把李妃生下的孩子换成了剥了皮的狸猫,命承御寇珠将孩子抛人九曲桥下淹死。
寇珠不忍,求计于太监陈琳,将太子藏入妆盒,密送八贤王赵德芳处抚养。刘妃诬告李妃产下妖摩,于是真宗将李妃贬入冷宫,册封刘妃为皇后。郭槐告发寇珠与陈琳在九曲桥私会,刘皇后命陈琳拷问寇珠,寇珠不屈,触柱而亡。刘皇后又命郭槐火烧冷官,李妃被内监救出,流落民间。
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解惑
谁是狸猫谁是太子?--戏说java构造器的更多相关文章
- scjp考试准备 - 7 - Java构造器
题目——如下代码的执行结果: class Hello{ String title; int value; public Hello(){ title += " World!"; } ...
- 戏说Java多线程
戏说Java多线程. package com.cmp.chengfu.app.jdk6.desktop; import java.awt.Desktop; import java.io.File; i ...
- 【原】戏说Java
戏说Java 本文只是个人闲余之际写的,查阅了些许资料,仅当娱乐.如有雷同,纯属巧合. 如果要学好一个东西,就应该要把他拟人化,当做一个你的好朋友,对他产生兴趣,那么你自然而然就会学习好他了.俗话 ...
- Java构造器浅析
Java构造器 问题引出 1.先看一段简单创建对象的例子: public class constructTest { public static void main(String[] args) { ...
- JAVA构造器,重载与重写
1. java构造器 构造器也叫构造方法(constructor), 用于对象初始化. 构造器是一个创建对象时被自动创建的特殊方法,目的是对象的初始化. 构造器 的名称与类的名称一致. JAVA通过n ...
- 浅谈Java构造器
Java构造器 每个类都有构造方法.如果没有显式地为类定义构造方法,Java编译器将会为该类提供一个默认构造方法. 在创建一个对象的时候,至少要调用一个构造方法.构造方法的名称必须与类同名,一个类可以 ...
- java构造器级简单内存分析
java构造器的使用(基础篇) 构造方法也叫构造器,是创建对象时执行的特殊方法,一般用于初始化新对象的属性. 基本定义语法: 访问控制符 构造方法名([参数列表]){ 方法体 } 注:"访问 ...
- 2016年,谁是最受欢迎的 Java EE 服务器?
[编者按]本文作者为性能监控工具 Plumbr 创始人 Nikita Salnikov-tarnovski,主要介绍2016年度最广为使用的 Java EE 容器及其排名变化情况.本文系国内 ITOM ...
- java构造器
java的构造器不是方法,因为没有返回值. 构造器可以重载. 构造器的访问说明符: private:只有本类可以使用这个构造器. protected:这个类的子类和包中的类都可以使用此构造器. pub ...
随机推荐
- OCP培训 MySQL OCP认证实战培训【低价送OCP考证名额】
一.OCP培训 MySQL 5.7 OCP认证全套实战培训[低价送OCP考试名额] 课程目标: 风哥为满足想参加MySQL OCP考证的学员,而设计的一套比较全面OCP实战培训课程. 课程涉及MySQ ...
- AI资源对接需求汇总:第3期
更好的阅读体验,请查看首发原文链接:AI资源对接需求汇总:第3期 平台介绍 平台由人工智能领域几个知名原创公众号发起,总读者约25万. 主要面向人工智能领域的从业者,涵盖图像处理.三维计算机视觉.机器 ...
- 洛谷 P1640 【连续攻击游戏】
question bank :luogu question Number :1640 title :Continuous attacking game link :https://www.luogu. ...
- C#开发BIMFACE系列18 服务端API之获取模型数据3:获取构件属性
系列目录 [已更新最新开发文章,点击查看详细] 本篇主要介绍如何获取单文件/模型下单个构建的属性信息. 请求地址:GET https://api.bimface.com/data/v2/fil ...
- SPOJ - QTREE5 Query on a tree V 边分治
题目传送门 题意:给你一棵树, 然后树上的点都有颜色,且原来为黑,现在有2个操作,1 改变某个点的颜色, 2 询问树上的白点到u点的最短距离是多少. 题解: 这里用的还是边分治的方法. 把所有东西都抠 ...
- 最短路算法 Dijkstra 入门
dijkstra算法 是一种单源点最短路算法求出一个点到其他所有点的最短路. 给你这样的一个图,需要求出1号点到其他点的最短距离是多少. 首先我们开一个数组 d[N],d[x] 代表着从起点出发到x点 ...
- 福建工程学院16级第一周寒假作业E题----第七集,奇思妙想
第七集,奇思妙想 ...
- CodeForces 917A The Monster 贪心+思维
As Will is stuck in the Upside Down, he can still communicate with his mom, Joyce, through the Chris ...
- win10 无法安装/启用 .net framework 3.5
有些程序依赖.net framework 3.5 win10可以在控制面板->程序和功能->启用或关闭windows功能 启用 但有时会报错 比如 0x800f0950 官方论坛的解决办法 ...
- 原来JS是这样的 - 对象属性
引子 在上一篇(原来JS是这样的 (2))刚发布的时候就阅读了那篇文章的人可能会注意到那篇曾用过"JavaScript 中万物皆对象"的说法,而在随后我发现错误后立即更新改掉了这个 ...