花括号下的语句是不是首先加载?
Posted
技术标签:
【中文标题】花括号下的语句是不是首先加载?【英文标题】:Are statements under curly braces load first?花括号下的语句是否首先加载? 【发布时间】:2015-01-27 19:09:24 【问题描述】:我知道静态内容首先加载到内存中,但为什么我没有提到它是静态的,但为什么在“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();
【问题讨论】:
【参考方案1】:System.out.print(" IT");
等初始化程序块在构造函数之前执行。实际上,它们被复制到每个构造函数的开头。
初始化实例成员
通常,您会将初始化实例变量的代码放在 构造函数。使用构造函数有两种选择 初始化实例变量:初始化块和最终方法。
实例变量的初始化块看起来就像静态的 初始化块,但没有 static 关键字:
// 初始化所需的任何代码都放在这里
Java 编译器将初始化程序块复制到每个构造函数中。 因此,这种方法可以用来在之间共享一个代码块 多个构造函数。
(Source)
更准确地说,这是JLS 中描述的初始化顺序:
将构造函数的参数分配给此构造函数调用新创建的参数变量。
1234563如果该构造函数调用突然完成,则此过程出于相同原因而突然完成;否则,继续第 5 步。此构造函数不以显式构造函数调用同一类中的另一个构造函数开始(使用 this)。如果此构造函数用于 Object 以外的类,则此构造函数将以显式或隐式调用超类构造函数开始(使用 super)。使用这五个相同的步骤递归地评估超类构造函数调用的参数和过程。如果该构造函数调用突然完成,则此过程出于相同的原因突然完成。否则,继续第 4 步。
执行该类的实例初始化程序和实例变量初始化程序,将实例变量初始化程序的值分配给相应的实例变量,按照它们在源代码中的文本出现的从左到右的顺序班级。如果执行这些初始化程序中的任何一个导致异常,则不会处理更多初始化程序,并且此过程会突然完成相同的异常。否则,继续第 5 步。
执行此构造函数的其余部分。如果该执行突然完成,则此过程出于同样的原因突然完成。否则,此过程正常完成。
请注意,实例初始化程序在第 4 步中执行,在构造函数主体之前(第 5 步)。
【讨论】:
非常感谢,内容丰富..真的很感激 :)以上是关于花括号下的语句是不是首先加载?的主要内容,如果未能解决你的问题,请参考以下文章
给定JSP代码如下所示,在括号处编写语句,可以使得程序运行后该页面输出的结果是1。
在C语言中,if和else if是否在不加花括号的情况下也是一个复合语句