代码之家  ›  专栏  ›  技术社区  ›  Faraz

Java类中的这段代码是什么?[复制]

  •  2
  • Faraz  · 技术社区  · 7 年前

    我正在重新分解一些继承的代码,但是被设计决策所困扰,无法找到适合google的术语。我的前任会使用这样的块:

    public class ChildClass extends ParentClass {
        {
            inheritedVar = "someVal";
        }
    
        public ChildClass(){ /* constructor exists */ }
        // rest of code
    }
    

    声明没有关键字的代码块有什么意义?我不相信,它的行为不像静态块。它是否是构造函数中设置的替代方法?如果使用的是工厂(在本例中不是这样),这会有一些影响吗?我在这里找到了一条相关线索 this happening in C

    任何关于“为什么”的想法或想法都将不胜感激。重新考虑这一点很容易,我只是好奇。

    0 回复  |  直到 9 年前
        1
  •  33
  •   Mike    15 年前

    它是一个初始化器块。(与静态初始值设定项块相关)请参阅此页上的初始化实例成员:

    http://download.oracle.com/javase/tutorial/java/javaOO/initial.html

    它是构造函数的一种替代方法。当提供多个重载构造函数作为共享代码的方式时,可以使用它。

    然而,就我个人而言,让构造函数调用一个命名的初始值设定项方法比依赖匿名代码块更清晰。不过,编译器确实会在幕后将初始值设定项块复制到所有构造函数中,而且您可能会认为性能的提高类似于内联方法声明。

        2
  •  18
  •   Mark Byers    15 年前

    它叫做 initializer block .

    实例变量的初始值设定项块看起来就像静态初始化程序块,但没有静态关键字:

        {
            // whatever code is needed for initialization goes here
        }
    

    Java编译器将初始值设定项块复制到每个构造函数中。因此,此方法可用于在多个构造函数之间共享代码块。

        3
  •  4
  •   Erick Robertson    15 年前

    你的前任还在学习。

    public class ChildClass extends ParentClass {
        public ChildClass() {
            inheritedVar = "someVal";
        }
        // rest of code
    }
    

        4
  •  -3
  •   gdj    15 年前

    范围。块中声明的任何变量都超出了块之后的范围。将变量的作用域保持在最小范围是很有用的。