Java代码块细节(二)
4、创建一个对象时,在一个类调用顺序是:(重点,难点):
1)调用静态代码块和静态属性初始化(注意:静态代码块和静态属性初始化调用的优先级一样,如果有多个静态代码块和多个静态变量初始化,则按他们定义的顺序调用)。
package com.z.codeblock;
public class CodeBockDetail02 {
public static void main(String[] args) {
A a = new A();
}
}
class A{
//静态属性初始化
private static int n1 = getN1();
static{
System.out.println("A静态代码块01...");
}
public static int getN1(){
System.out.println("getN1被调用~~~");
return 10;
}
}
输出:
getN1被调用~~~
A静态代码块01...
2)调用普通代码块和普通属性的初始化(注意:普通代码块和普通属性初始化调用的优先级一样,如果有多个普通代码块和多个普通属性初始化,则按定义顺序调用)。
3)调用构造方法。
package com.z.codeblock;
public class CodeBockDetail02 {
public static void main(String[] args) {
A a = new A();
}
}
class A{
public A(){
System.out.println("构造器A()被调用~~~");
}
private int n2 = getN2();//普通属性初始化
{
System.out.println("A普通代码块01...");
}
//静态属性初始化
private static int n1 = getN1();
static{
System.out.println("A静态代码块01...");
}
public static int getN1(){
System.out.println("getN1被调用~~~");
return 10;
}
public static int getN2(){
System.out.println("getN2被调用~~~");
return 10;
}
}
输出:
getN1被调用~~~
A静态代码块01...
getN2被调用~~~
A普通代码块01...
构造器A()被调用~~~
5、构造器的最前面其实隐含了super()和调用普通代码块,静态相关的代码块,属性初始化,在类加载时就执行完毕,因此是优先于构造器和普通代码块执行的。
class A{
//这里由隐藏的执行要求
//(1)super();
//(2)调用普通代码块
System.out.println("ok");
}
package com.z.codeblock;
public class CodeBockDetail03 {
public static void main(String[] args) {
new BBB();
}
}
class AAA{
{
System.out.println("AAA的普通代码块~~~");
}
public AAA(){
System.out.println("AAA()构造器被调用~~~");
}
}
class BBB extends AAA{
{
System.out.println("BBB的普通代码块~~~");
}
public BBB(){
System.out.println("BBB()构造器被调用~~~");
}
}
输出:
AAA的普通代码块~~~
AAA()构造器被调用~~~
BBB的普通代码块~~~
BBB()构造器被调用~~