随笔 - 1683  文章 - 619 评论 - 440 trackbacks - 0

故事背景

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

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

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解惑

posted on 2019-09-27 09:00  一天不进步,就是退步  阅读(...)  评论(... 编辑 收藏