打字猴:1.700441602e+09
1700441602
1700441603 {
1700441604
1700441605 setOperator(Ops.ADD);
1700441606
1700441607 }
1700441608
1700441609 };
1700441610
1700441611 System.out.println(c1.getResult());
1700441612
1700441613 }
1700441614
1700441615 这段匿名类的代码非常清晰:接收两个参数1和2,然后设置一个操作符号,计算其值,结果是3,这毫无疑问,但是这中间隐藏着一个问题:带有参数的匿名类声明时到底是调用的哪一个构造函数呢?我们把这段程序模拟一下:
1700441616
1700441617 //加法计算
1700441618
1700441619 class Add extends Calculator{
1700441620
1700441621 {
1700441622
1700441623 setOperator(Ops.ADD);
1700441624
1700441625 }
1700441626
1700441627 //覆写父类的构造方法
1700441628
1700441629 public Add(int_i, int_j){
1700441630
1700441631 }
1700441632
1700441633 }
1700441634
1700441635 匿名类和这个Add类是等价的吗?可能有人会说:上面只是把匿名类增加了一个名字,其他的都没有改动,那肯定是等价的啦!毫无疑问!那好,你再写个客户端调用Add类的方法看看。是不是输出结果为0(为什么是0?这很容易,有参构造没有赋值)。这说明两者不等价,不过,原因何在呢?
1700441636
1700441637 原来是因为匿名类的构造函数特殊处理机制,一般类(也就是具有显式名字的类)的所有构造函数默认都是调用父类的无参构造的,而匿名类因为没有名字,只能由构造代码块代替,也就无所谓的有参和无参构造函数了,它在初始化时直接调用了父类的同参数构造,然后再调用了自己的构造代码块,也就是说上面的匿名类与下面的代码是等价的:
1700441638
1700441639 //加法计算
1700441640
1700441641 class Add extends Calculator{
1700441642
1700441643 {
1700441644
1700441645 setOperator(Ops.ADD);
1700441646
1700441647 }
1700441648
1700441649 //覆写父类的构造方法
1700441650
1700441651 public Add(int_i, int_j){
[ 上一页 ]  [ :1.700441602e+09 ]  [ 下一页 ]