课程咨询 :186 8716 1620      qq:2066486918

昆明Java培训 > 达内新闻 > java培训:匿名类的构造函数很特殊
  • java培训:匿名类的构造函数很特殊

    发布:昆明Java培训      来源:达内新闻      时间:2016-09-30

  • 在上一建议中昆明Java培训机构的老师讲到匿名类虽然没有名字,但可以有一个初始化块来充当构造函数,那这个构造函数是否就和普通的构造函数完全不一样呢?我们来看一个例子,设计一个计算器,进行加减运算,代码如下

    1 public class Calculator {

    2    enum Ops {

    3        ADD, SUB

    4    };

    5

    6    private int i, j, result;

    7

    8    //无参构造

    9    public Calculator() {

    10

    11    }

    12

    13    //有参构造

    14    public Calculator(int _i, int _j) {

    15        i = _i;

    16        j = _j;

    17    }

    18

    19    //设置符号,是加法运算还是减法运算

    20    protected void setOperator(Ops _ops) {

    21        result = _ops.equals(Ops.ADD) ? i + j : i - j;

    22    }

    23

    24    //取得运算结果

    25    public int getResult() {

    26        return result;

    27    }

    28

    29 }

    代码的意图是,通过构造函数传递两个int类型的数字,然后根据设置的操作符(加法还是减法)进行运算,编写一个客户端调用:

    public static void main(String[] args) {

    Calculator c1 = new Calculator(1, 2) {

    {

    setOperator(Ops.ADD);

    }

    };

    System.out.println(c1.getResult());

    }

    这段匿名类的代码非常清晰:接收两个参数1和2,然后设置一个操作符号,计算其值,结果是3,这毫无疑问,但是这中间隐藏着一个问题:带有参数的匿名类声明时到底调用的是哪一个构造函数呢?我们把这段程序模拟一下:

    //加法计算

    class Add extends Calculator{

    {

    setOperator(Ops.ADD);

    }

    //覆写父类的构造方法

    public Add(int _i, int _j){

    }

    }

    匿名类和这个Add类等价吗?可能有人会说:上面只是把匿名类增加了一个名字,其它的都没有改动,那肯定是等价了,毫无疑问,那好,编写一个客户端调用Add类的方法看看。代码就略了,因为很简单new Add,然后调用父类的getR esult方法就可以了,经过测试,输出结果为0(为什么而是0?这很容易,有参构造没有赋值)。这说明两者不等价,不过,原因何在呢?

    因为匿名类的构造函数特殊处理机制,一般类(也就是没有显示名字的类)的所有构造函数默认都是调用父类的无参构造函数的,而匿名类因为没有名字,只能由构造代码块代替,也就无所谓有参和无参的构造函数了,它在初始化 时直接调用了父类的同参数构造函数,然后再调用了自己的构造代码块,也就是说上面的匿名类和下面的代码是等价的:

    //加法计算

    class Add extends Calculator{

    {

    setOperator(Ops.ADD);

    }

    //覆写父类的构造方法

    public Add(int _i, int _j){

    super(_i,_j);

    }

    }

    它会首先调用父类有两个参数的构造函数,而不是无参构造,这是匿名类的构造函数与普通类的差别,但是这一点也确实鲜有人仔细琢磨,因为它的处理机制符合习惯呀,我传递两个参数,就是希望先调用父类有两个参数的构 ,然后再执行我自己的构造函数,而Java的处理机制也正是如此处理的。

    了解详情请登陆昆明达内Java培训官网(km.Java.tedu.cn)!

    推荐文章

上一篇:使用匿名类的构造函数

下一篇:让多重继承成为现实

最新开班日期  |  更多

Java--零基础全日制班

Java--零基础全日制班

开班日期:11/30

Java--零基础业余班

Java--零基础业余班

开班日期:11/30

Java--周末提升班

Java--周末提升班

开班日期:11/30

Java--零基础周末班

Java--零基础周末班

开班日期:11/30

  • 网址:http://km .java.tedu.cn      地址:昆明市官渡区春城路62号证券大厦附楼6楼
  • 课程培训电话:186 8716 1620      qq:2066486918    全国服务监督电话:400-827-0010
  • 服务邮箱 ts@tedu.cn
  • 2001-2016 达内国际公司(TARENA INTERNATIONAL,INC.) 版权所有 京ICP证08000853号-56