您好,登錄后才能下訂單哦!
之前對于靜態代碼塊,構造代碼塊,普通代碼塊,以及類的初始化等代碼執行順序一直不是特別清楚,在此整理,方便復習!
static {
System.out.println("靜態代碼塊");
}
class Parent {
static {
System.out.println("A");
}
Parent(){
System.out.println("sdfsaf");
}
static {
System.out.println("B");
}
}
public class ExplicitStatic {
public static void main(String[] args) {
new Parent();//第一次執行,觸發了類加載
System.out.println("=========華麗的分割線=========");
new Parent();//第二次實例化,不再觸發類的加載,不再執行靜態代碼塊
}
}
運行結果:
public class Test01 {
{
System.out.println("我是構造代碼塊");
}
public static void main(String[] args) {
new Test01();
}
}
class Test02{
{
System.out.println("我是 父類 構造代碼塊");
}
}
public class Test01 extends Test02{
{
System.out.println("我是 子類 構造代碼塊1");
}
Test01(){
System.out.println("我是無參構造方法");
}
Test01(int v){
System.out.println("我是有參構造方法");
}
static {
System.out.println("靜態代碼塊");
}
{
System.out.println("我是 子類 構造代碼塊2");
}
public static void main(String[] args) {
new Test01();
System.out.println("===================華麗的分割線===================");
new Test01(6);//每次創建對象都會執行構造代碼塊
}
}
運行結果:
public void method() {
{
System.out.println("普通代碼塊1");
}
....
}
class Test02{
{
System.out.println("我是 父類 構造代碼塊");
}
}
public class Test01 extends Test02{
{
System.out.println("我是 子類 構造代碼塊");
}
static {
System.out.println("靜態代碼塊");
}
public void method(){
{
System.out.println("普通代碼塊1");
}
System.out.println("普通方法體");
{
System.out.println("普通代碼塊2");
}
}
public static void main(String[] args) {
new Test01();
System.out.println("===================華麗的分割線===================");
new Test01().method();//被調用才會執行方法中的代碼塊
}
}
運行結果:
對象實例化時的順序:
1,父類的靜態成員變量和靜態代碼塊加載
2,子類的靜態成員變量和靜態代碼塊加載
3,父類成員變量和構造代碼塊加載
4,父類的構造方法加載
5,子類成員變量和構造代碼塊加載
6,子類的構造方法加載
class Parent2 {
{
System.out.println("父類 構造代碼塊1");//5
}
Parent2() {
System.out.println("父類 的無參構造方法");//7
}
static {
System.out.println("父類 的靜態代碼塊1");//1
}
{
System.out.println("父類 構造代碼塊2");//6
}
static {
System.out.println("父類 的靜態代碼塊2");//2
}
}
public class ExplicitStatic extends Parent2 {
static {
System.out.println("子類 的靜態代碼塊1");//3
}
ExplicitStatic() {//15
super();//可省略
System.out.println("子類 無參構造方法");//16
}
ExplicitStatic(int v) {//14
this();//即 執行15
System.out.println("子類 有參構造方法");//17
}
private int initA() {
System.out.println("子類 的屬性初始化調用 普通方法A");//9
return 0;
}
static {
System.out.println("子類 的靜態代碼塊2");//4
}
private int initB() {
System.out.println("子類 的屬性初始化調用 普通方法B");//12
return 0;
}
int a = initA();//8
{
System.out.println("子類 的構造代碼塊1");//10
}
int b = initB();//11
{
System.out.println("子類 的構造代碼塊2");//13
}
public void method() {
{
System.out.println("子類 的普通代碼塊1");
}
System.out.println("子類 的普通方法method");
{
System.out.println("子類 的普通代碼塊2");
}
}
public static void main(String[] args) {
new ExplicitStatic(100);
System.out.println("=================");
new ExplicitStatic().method();
}
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。