我知道首先将静态内容加载到内存中,但是当我没有将其称为静态内容时,为什么在“ CT”之前打印“ IT”呢?
class Person
{
Person()
{
System.out.print(" CP");
}
static
{
System.out.print("SP");
}
}
class Teacher extends Person
{
Teacher()
{
System.out.print(" CT");
}
{
System.out.print(" IT");
}
}
public class StaticTest
{
public static void main(String[] args)
{
Person p = new Teacher();
}
}
初始化程序块(例如){System.out.print(" IT");}
在构造函数之前执行。实际上,它们被复制到每个构造函数的开头。
初始化实例成员
通常,您需要将代码放在构造函数中以初始化实例变量。使用构造函数初始化实例变量有两种选择:初始化块和final方法。
实例变量的初始化程序块看起来像静态初始化程序块,但没有static关键字:
{
//初始化所需的任何代码都在这里
}Java编译器将初始化程序块复制到每个构造函数中。因此,该方法可用于在多个构造函数之间共享代码块。
(来源)
更确切地说,这是JLS中描述的初始化顺序:
将构造函数的参数分配给此构造函数调用的新创建的参数变量。
如果此构造函数以同一个类中的另一个构造函数的显式构造函数调用(第8.8.7节)开头(使用此方法),则使用这五个步骤评估参数并递归处理该构造函数调用。如果该构造函数调用突然完成,则由于相同的原因,此过程也会突然完成;否则,此过程将立即完成。否则,请继续执行步骤5。
此构造函数并不以对同一个类中的另一个构造函数的显式构造函数调用(使用此函数)开头。如果此构造函数用于Object以外的其他类,则此构造函数将以显式或隐式调用超类构造函数(使用super)开头。使用这五个相同的步骤来递归评估超类构造函数调用的参数和过程。如果该构造函数调用突然完成,则出于相同原因,此过程也会突然完成。否则,请继续执行步骤4。
执行此类的实例初始值设定项和实例变量初始值设定项,并按从左到右的顺序将实例变量初始值设定项的值分配给相应的实例变量,这些变量在文本中显示在该类的源代码中。如果执行这些初始化程序中的任何一个都会导致异常,则不会再处理其他初始化程序,并且该过程会因相同的异常而突然完成。否则,请继续执行步骤5。
执行此构造函数的其余部分。如果该执行突然完成,则出于相同原因,此过程也会突然完成。否则,此过程将正常完成。
请注意,实例构造函数在构造函数的主体(步骤5)之前在步骤4中执行。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句