为什么在使用初始化器,构造函数和方法调用时print语句按此顺序执行?
这是我正在运行的代码,此代码的输出是4 2 1 3,有人可以解释为什么结果按此顺序打印。
public class goFuncTest { goFuncTest() { System.out.print("1 "); } { System.out.print("2 "); } public static void main(String[] args) { new goFuncTest().go(); } void go() { System.out.print("3 "); } static { System.out.print("4 "); } }
根据您最近的问题编辑,您的输出将是4 2 1 3.首先运行静态初始化程序,然后运行实例初始化程序。 如果您有多个相同类型的初始值设定项,它们将按照它们在类中出现的顺序执行。
// static initializer first static { System.out.print("4 "); } // then instance initializer { System.out.print("2 "); }
接下来构造函数会启动,它会为您提供:
goFuncTest() { System.out.print("1 "); }
最后调用该方法:
void go() { System.out.print("3 "); }
正如JB Nizet在第一次评论中指出的那样,结果应该是2,4,3,1。
接下来,首先执行静态块,然后执行初始化块。 在您的代码中,没有静态块,只有inti块。
初始化块执行的顺序是它们在源代码-2,4中的顺序。
根据构造函数和方法调用剩下两个结果。 1,3
现在你可以看到答案了吗?
原因:
- 你有一个实例块,它按顺序执行,出现在你的类定义中。 所以2首先是4然后输出2 4
- 接下来,您将调用new goFuncTest(),它将调用您的构造函数,因此您将在输出中看到1。
- 现在你的实例上你正在调用go方法打印3。
似乎主要的混乱只是因为不理解一个class级可以拥有的各种块;
这个答案给出了一个很好的例子和解释;
这是他们给出的代码:
public class Test { static int staticVariable; int nonStaticVariable; // Static initialization block: // Runs once (when the class is initialized). static { System.out.println("Static initalization."); staticVariable = 5; } // Instance initialization block: // Runs before the constructor each time you instantiate an object { System.out.println("Instance initialization."); nonStaticVariable = 7; } public Test() { System.out.println("Constructor."); } public static void main(String[] args) { new Test(); new Test(); } }
该类具有static initialiser
, instance initialisation block
, constructor
和class method
。
static initialiser
: static {...}
instance initialiser
: {...}
constructor
: Public ClassName(){...}
class method
: Public Static Whatever classMethod(String[] args){...}
在不同情况下调用这些中的每一个; 在加载类时调用static initialiser
器,没有其他方法可以调用它,甚至不能通过reflection来实现它,因为它从未由method instance
表示,它由JVM调用。
每当您在构造函数之前创建类的实例时,都会调用instance initialiser
。
您可以拥有多个static initialiser
和多个instance initialiser
,并且它们按照它们在代码中出现的顺序执行。
你可能已经知道的constructor
和class method
。
在您的示例中,稍微重新排列代码可能会更有帮助,以更好地反映该层次结构;
public class goFuncTest { //static instance initialiser static { System.out.print("4 "); } //instance initialiser { System.out.print("2 "); } //Constructor goFuncTest(){ System.out.print("1 "); } //Class method void go(){ System.out.print("3 "); } public static void main(String[] args){ new goFuncTest().go(); } }
(编辑以添加静态关键字)
- java.lang.NullPointerException:尝试在空对象引用上调用虚方法’boolean java.lang.String.equals(java.lang.Object)’
- 通过JDBC从Linux机器通过Windows身份validation连接到SQL Server
- Android尝试替换字符并更改单词的颜色
- 使用android从stripe生成银行帐户令牌
- 使用令牌和ID添加标头
- “java.net.MalformedURLException:未找到协议”读取到html文件
- 将复选框添加到导航抽屉ListView时出错
- ElasticSearch – 使用FilterBuilders
- 如何获得一个月第一天的名字?