在Java中思考,第566页给出了以下示例。
class CountedInteger {
private static long counter;
private final long id = counter++;
public String toString() { return Long.toString(id); }
}
public class FilledList<T> {
private Class<T> type;
public FilledList(Class<T> type) { this.type = type; }
public List<T> create(int nElements) {
List<T> result = new ArrayList<T>();
try {
for(int i = 0; i < nElements; i++)
result.add(type.newInstance());
} catch(Exception e) {
throw new RuntimeException(e);
}
return result;
}
public static void main(String[] args) {
FilledList<CountedInteger> fl = new FilledList<CountedInteger>(CountedInteger.class);
System.out.println(fl.create(15));
}
}
关于这个例子,我有三个问题。
1)私有类类型的用法是什么?为什么要私有?
2)为什么要做以下,特别是“this.type = type;”
public FilledList(Class<T> type) { this.type = type; }
3)作者声称:
请注意,此类必须假定它使用的任何类型 有一个默认的构造函数(一个没有参数),你会得到一个 如果不是这样的例外。
我无法弄清楚这个陈述是如何反映在上面的例子中的。感谢。
答案 0 :(得分:1)
1) 不是,但这是你在Java中做的事情之一 - 不要暴露那些不需要暴露的东西。
2)将属性设置为构造函数的参数 - 即元素Java。
3)由于type.newInstance()
电话;没有默认(no-arg)构造函数,它将失败。
答案 1 :(得分:0)
它不必是私有的,但通常最好隐藏类中的内部字段,除非您希望它们可以从外部访问。我还会在类型字段上加上final修饰符以防止修改。
此行将类构造函数中传递的值分配给名为type
的实例字段。关键字this
表示它是此实例字段。
如果相应类型没有默认构造函数,type.newInstance()
代码将失败。
java.util.Collections.fill(list, value)
电话取代。
答案 2 :(得分:0)
type
只是另一个实例变量。它被宣布为私人
以防止从本课程外部访问它。
创建此类FilledList
的实例时,即
调用带有1个arg的构造函数,实例变量type
是
使用构造函数中传递的arg值进行初始化。
type.newInstance()
所做的是调用默认的no args构造函数
对于这种类型,如果是默认值,这将抛出异常
构造函数是私有的。
答案 3 :(得分:0)
1:类的所有成员都应该是私有的或受information hiding保护。但你不必这样做
2:在任何方法中,您都可以访问该类中的所有参数和所有成员变量。在这种情况下,参数名称与成员变量完全相同。因此,在这种情况下,如果您编写type
,参数名称将获胜。 this
指向当前实例,this.type
表示您指的是成员变量而不是参数。因此this.type = type
就是member = parameter
。
3:没有参数的newInstance将在T上调用默认构造函数,如果它不存在则会抛出异常。看一下链接