构造函数中的super(Myclass.class)在Java中意味着什么?

时间:2014-07-11 19:34:19

标签: java constructor comparator super

我在Mapreduce程序中反复看到以下类型的代码。这只是一段代码。整个代码可用here

构造函数中super调用的内容是什么?它会调用IntPair.class的构造函数吗?为什么这样的召唤是必要的。

public static class KeyComparator extends WritableComparator {
        protected KeyComparator() {
          super(IntPair.class, true);
        }
        @Override
        public int compare(WritableComparable w1, WritableComparable w2) {
          IntPair ip1 = (IntPair) w1;
          IntPair ip2 = (IntPair) w2;
          int cmp = IntPair.compare(ip1.getFirst(), ip2.getFirst());
          if (cmp != 0) {
            return cmp;
          }
          return -IntPair.compare(ip1.getSecond(), ip2.getSecond()); //reverse
        }
      }

3 个答案:

答案 0 :(得分:4)

super(),在构造函数中使用时将调用扩展类的构造函数。在这种情况下,它将调用WriteableComparator构造函数。您可以在此处的java文档中查看有关super的更多详细信息: Java super link

特别参见标题为“Subclass Constructors”的部分。

答案 1 :(得分:1)

  

它是否调用IntPair.class的构造函数?

不,这只是一个在超类构造函数中传递的参数。

  

为什么需要这样的电话?

避免调用编译器默认添加的超类构造函数。

如果超类中有多个构造函数,那么可以根据参数指定应该调用哪个超类构造函数。


示例代码:(查看创建KeyComparator对象时的输出)

class WritableComparator {
    public WritableComparator(){
        System.out.println("default constructor is called");
    }
    public WritableComparator(Class<?> clazz, boolean flag) {
        System.out.println("two arguemnts constructor is called");
    }
}

class KeyComparator extends WritableComparator {
    public KeyComparator() {
        //super(); // by default added by the compiler
        super(IntPair.class, true);
    }
}

答案 2 :(得分:1)

IntPair.class表示法用于获取对象描述此类。像这里:

Class<?> type = Integer.class;

type变量不是Integer类的实例,而是描述Integer类型的对象的实例。

某些类要求您传递它们希望它们使用的type个对象。然后,他们可以使用此type对象创建这些类的新实例。

more about Class class