谁是狸猫谁是太子?--戏说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 ...
随机推荐
- [Python] 将视频转成ASCII符号形式、生成GIF图片
一.简要说明 简述:本文主要展示将视频转成ASCII符号形式展示出来,带音频. 运行环境:Win10/Python3.5. 主要模块: PIL.numpy.shutil. [PIL]: 图像处理 [n ...
- javascript之操作数组方法
掌握如何操作数组,会让你的开发变得更加高效 1.栈和队列方法(以下四个方法都改变原数组) arr.push() //接受任意类型的参数,逐个添加到数组的末尾,并返回数组的长度 改变原数组 arr.po ...
- filter修改post参数
前景:公司项目web渗透测试中提出管理登录时,传输密码不能为明文,需要加密传输,但是迫于系统架构,后端代码不能修改,只能在filter中解密参数. 1.前端加密处理: <script type= ...
- python暴力算法快乐数
编写一个算法来判断一个数是不是"快乐数". 一个"快乐数"定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 ...
- python控制窗口移动(画圆)
import win32con import win32gui import time import math notepad = win32gui.FindWindow("Notepad& ...
- CodeForces - 1118 F2 Tree Cutting
题目传送门 题解: 先注意到一定存在k种颜色,切成k个块, 然后要求每个块内的颜色都一样,所以可以发现同一种颜色一定在同一个块内,故任意2个相同颜色的最短路劲上的点的颜色都是该颜色. 我们可以先把任意 ...
- HDU 1003 Max Sum * 最长递增子序列(求序列累加最大值)
Max Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Sub ...
- 洛谷p2015二叉苹果树&yzoj1856多叉苹果树题解
二叉 多叉 有一棵苹果树,如果树枝有分叉,可以是分多叉,分叉数k>=0(就是说儿子的结点数大于等于0)这棵树共有N个结点(叶子点或者树枝分叉点),编号为1~N,树根编号一定是1.我们用一根树枝两 ...
- ☆1003 Dijstra
循环N次 算法分为两部分: 1)找到距离最小的城市,找不到距离更小的城市时退出方法 2)更新距离 实际操作时,先初始化: 更新dis为INF,更新dis[start] = 0: 变种: 找最短路径的条 ...
- csapp:第八章 异常控制流ECF
第八章 异常控制流ECF 8.1 异常 Exception graph LR E[异常Exception]-->E2[中断:异步异常] E-->E3[同步异常] E3-->陷阱 E3 ...