昨天,我在java中学习了匿名构造函数,而不是匿名类。我以前没见过这个构造函数,所以我在Google上搜索它。结果是我知道如何使用它以及它是什么。但是关于这种用法的信息很少。
匿名构造函数是一个带有一对大括号的块代码。匿名将在公共构造函数之前运行,并在静态代码块之后运行。
我想知道为什么没有人使用这个匿名构造函数。当我们使用它时,是否会对我们的java应用程序产生一些不良影响?
感谢您的帮助。
以下是匿名构造函数的示例:
public class Static_Super_Conustruct {
static class Base{
{
System.out.println("Base anonymous constructor");
}
public Base() {
System.out.println("Base() common constructor");
}
static{
System.out.println("Base static{} static block");
}
}
static class Sub extends Base{
{
System.out.println("Sub anonymous constructor");
}
public Sub() {
System.out.println("Sub() common constructor");
}
static{
System.out.println("Sub static{} static block");
}
}
/**
* @param args
*/
public static void main(String[] args) {
new Sub();
}
// Results:
// Base static{}static block
// Sub static{}static block
// Base anonymous constructor
// Base() common constructor `enter code here`
// Sub anonymous constructor
// Sub() common constructor
}
答案 0 :(得分:1)
该构造称为实例初始值设定项。我怀疑它很少使用,因为大多数初始化可以在字段初始化器或构造函数中执行。
但是,我曾经使用过一次,它派上了用场。我有一个初始化为某个字段的字段,我想在分配默认值之前更改它以检查几个属性。我本可以在构造函数中编写该代码,但构造函数位于文件的另一端。将实例初始化器放在声明和记录字段的位置旁边是有用且方便的。答案 1 :(得分:0)
继续沿着推测的路线,不时有前后构造函数调用的愿望,特别是在你无法完全控制层次结构实现的时候。
比如说,例如你DIDN&T已经拥有Base的源代码,但是想在构造函数运行之前初始化一些实例变量。这是一个边缘案例,但它确实出现了。
我同意另一张海报,这是一个反直觉的方法,有人甚至可能会说有一种hackish的感觉,但它理论上可以解决这个例子。
答案 2 :(得分:0)
1)我认为它没有被使用,可能是因为
anonymous constructor {
do A
}
regular constructor {
do B
}
与
基本相同regular constructor {
do A
do B
}
后者更明确,更明确。
2)大多数人并不真正了解它
我自己完全忘记它的存在
但现在我回想起我已经读过它了
曾经在SCJP书中,但那是很久以前的事。
答案 3 :(得分:0)
我猜大多数人不喜欢这些实例初个化块的主要原因是,实例初始化在源代码中被碎片化了。例如,大多数人会直接在字段声明或构造函数体中查找字段初始化。
然而,我不时会偶然发现实例初始化程序块的使用。请考虑以下表达式:new java.util.HashSet<String>() {{ add("foo"); add("bar"); }}
。此单行创建一个新的HashSet,其中插入了初始字符串值"foo"
和"bar"
。这里使用的构造有时被称为“双括号”,即使它不是自己的构造,但是两个构造的混合:外大括号创建HashSet的匿名子类,内大括号是实例初始化器对于这个子类。在这样的构造中,没有方法被覆盖,在实例初始化程序块中调用可覆盖的方法是安全的。
尽管它不是相同的构造,但值得注意的是,静态类初始化存在相同的东西:static { }
。这个东西似乎更常见,因为类初始化没有“构造函数”。