为什么人们很少在Java中使用匿名构造函数
昨天,我学习了java中的匿名构造函数,而不是匿名类。我以前没有见过这个构造函数,所以我在谷歌上搜索它。结果是我知道如何使用它以及它是什么。但是关于这种用法的信息很少 匿名构造函数是由一对大括号包围的块代码。匿名将在公共构造函数之前运行,并在静态代码块之后运行 我想知道为什么没有人使用这个匿名构造函数。当我们使用java应用程序时,是否存在一些不良影响 谢谢你的帮助 以下是匿名构造函数的示例:为什么人们很少在Java中使用匿名构造函数,java,Java,昨天,我学习了java中的匿名构造函数,而不是匿名类。我以前没有见过这个构造函数,所以我在谷歌上搜索它。结果是我知道如何使用它以及它是什么。但是关于这种用法的信息很少 匿名构造函数是由一对大括号包围的块代码。匿名将在公共构造函数之前运行,并在静态代码块之后运行 我想知道为什么没有人使用这个匿名构造函数。当我们使用java应用程序时,是否存在一些不良影响 谢谢你的帮助 以下是匿名构造函数的示例: public class Static_Super_Conustruct {
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
}
继续沿着推测的路线,有时会有一个构造函数前调用和构造函数后调用的愿望,特别是在您无法完全控制层次结构实现方式的时候 例如,您没有Base的源代码,但希望在其构造函数运行之前初始化一些实例变量。这是一个边缘案件,但它确实出现了 我同意另一张海报,这是一种反直觉的方法,甚至有人可能会说它有一种黑客的感觉,但它可以从理论上解决这个例子。1)我认为它没有被使用,可能是因为
anonymous constructor {
do A
}
regular constructor {
do B
}
基本上与
regular constructor {
do A
do B
}
后者更为明确
2) 大多数人并不真正了解它。我自己完全忘记了它的存在。
但现在我想起我读过这篇文章
在SCJP书中出现过一次,但那是很久以前的事了。
该构造称为实例初始值设定项。我怀疑它很少使用,因为大多数初始化可以在字段初始值设定项或构造函数中执行 不过,我确实用过一次,它派上了用场。我有一个初始化为某个内容的字段,我想在指定默认值之前将其更改为检查几个属性。我本可以在构造函数中编写该代码,但构造函数位于文件的另一端。将实例初始值设定项放在声明和记录字段的位置旁边非常有用和方便。由于代码样式的原因,很少使用此构造 我想大多数人不喜欢这些实例初始化程序块的主要原因是,实例初始化在源代码中变得支离破碎。例如,大多数人会直接在字段声明或构造函数体中查找字段初始化 双括号表示法 然而,有一个实例初始值设定项块的使用,我不时会绊倒。考虑下面的表达式:<代码> new java .UTI.HASSET(){{“添加”(Foo));添加(“bar”);}} /Cuth>。这个一行程序创建了一个新的哈希集,其中插入了初始字符串值
“foo”
和“bar”
。这里使用的构造有时被称为“双大括号表示法”,尽管它不是自己的构造,但它是两个构造的混合体:外部大括号创建HashSet的匿名子类,内部大括号是该子类的实例初始值设定项。在这样的构造中,如果不重写任何方法,则可以安全地在实例初始值设定项块中调用可重写的方法
静态初始值设定项块
尽管它不是相同的构造,但值得注意的是,对于静态类初始化存在相同的东西:
static{}
。这似乎更常见,因为类初始化没有“构造函数”。没有“匿名构造函数”这样的东西。它是一个实例初始值设定项。这是一个示例,用于显示匿名构造函数的工作方式和调用匿名构造函数的时间。不是一个完整的应用程序。这些代码可以运行良好。再次。。。没有这样的事。请看重复的问题。我认为人们并不真正知道如何使用它。关于程序员偏好的问题怎么可能是关于程序语言结构之间差异的问题的重复?