Java 类主体中的大括号做什么?
我有一个由其他开发人员编写的类:Java 类主体中的大括号做什么?,java,Java,我有一个由其他开发人员编写的类: public class ManifestFile implements Serializable { private final static DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); private final static XPathFactory xPathFactory = XPathFactory.newInstance
public class ManifestFile implements Serializable {
private final static DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
private final static XPathFactory xPathFactory = XPathFactory.newInstance();
private final static DateFormat YYYYMMDD = new SimpleDateFormat("yyyyMMdd");
private final String uuid;
private final Set<File> attachments = new LinkedHashSet<File>();
private final transient ApplicationContext applicationContext = JavaService.INSTANCE.getApplicationContext();
private final transient File attachmentDirectory;
private final Date processAfter = new Date(System.currentTimeMillis() + 3 * 1000 * 60);
{
try {
documentBuilderFactory.setNamespaceAware(true);
final SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = sf.newSchema(new StreamSource(getClass().getResourceAsStream("/StrategicEmail5.xsd")));
documentBuilderFactory.setSchema(schema);
documentBuilderFactory.setValidating(true);
} catch (Throwable t) {
throw new RuntimeException(t);
}
}
有人能解释一下这段代码有效吗?在任何方法体之外使用{}有什么好处?这是一个实例初始化程序块。它作为类实例初始化的一部分被调用
您还可以在这样一个块前面加上“static”,以便在初始化类时调用它一次。这称为静态初始值设定项
从:
8.6。实例初始值设定项
在创建类的实例时,会执行类中声明的实例初始值设定项(§12.5、§15.9、§8.8.7.1)。
- 如果实例初始值设定项无法正常完成,则为编译时错误(§14.21)
- 如果返回语句(§14.17)出现在实例初始值设定项中的任何位置,则为编译时错误
- 允许实例初始值设定项通过关键字this(§15.8.3)引用当前对象,使用关键字super(§15.11.2,§15.12),并使用范围内的任何类型变量
- 即使这些实例变量在作用域中,但在使用后以文本形式显示其声明的实例变量的使用有时会受到限制。有关实例变量正向引用的精确规则,请参见§8.3.2.3
它是一个实例初始值设定项。它在创建对象时被调用,就在构造函数中的
super()
之后
请参阅下面的示例:
public class Test {
//instance initializer
{
System.out.println("init block");
}
public Test() {
super();
System.out.println("constructor");
}
//invoke to test
public static void main (String ... args) {
new Test();
}
}
运行main将打印以下两行:
init block
constructor
这是因为构造函数实际上看起来像这样:
public Test() {
super();
{
System.out.println("init block");
}
System.out.println("constructor");
}
括号表示实例初始值设定项。这是在运行任何构造函数之前直接运行的。这是实例初始值设定项块。Java编译器将初始值设定项块复制到每个构造函数中。因此,此方法可用于在多个构造函数之间共享一个代码块。它是实例初始化块。实例初始化块代码在构造函数中调用
super()
后立即运行,换句话说,在所有超级构造函数运行后运行。初始化块在类中出现的顺序很重要。如果一个类有多个类,它们都会按照它们在类文件中出现的顺序运行
Some rules to remember:
1.Initialization blocks execute in the order they appear.
2.Static Initialization blocks run once when the class is first loaded.
3.Instance Initialization blocks run every time a class instance is created.
4.Instance Initialization blocks run after the constructor’s call to super().
有关更多信息,请单击。非常感谢!给你和其他提供了正确答案的人。
Some rules to remember:
1.Initialization blocks execute in the order they appear.
2.Static Initialization blocks run once when the class is first loaded.
3.Instance Initialization blocks run every time a class instance is created.
4.Instance Initialization blocks run after the constructor’s call to super().