我在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
}
}
答案 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
对象创建这些类的新实例。