java 執行順序_Java代碼執行順序

程序中代碼執行的順序非常重要,稍有不慎便會是程序運行出錯,那么我將結合實例來分析代碼中的執行。

名詞解釋

首先了解幾個名詞:

非靜態代碼塊

直接由 { } 包起來的代碼,稱為非靜態代碼塊

靜態代碼塊

直接由 static { } 包起來的代碼,稱為靜態代碼塊

形參

比如你定義一個函數void add(int a, int b),這里的a和b就是形參。

當你進行函數調用的時候,add(1, 2),這里的1和2就是實參。

向前引用

所謂向前引用,就是在定義類、接口、方法、變量之前使用它們。

成員變量

在類體里面定義的變量稱為成員變量;

如果該成員變量有 static 關鍵字修飾,則該成員變量稱為 靜態變量 或 類變量;

如果該成員變量沒有 static 關鍵字修飾,則該成員變量被稱為 非靜態變量 或 實例變量。

局部變量

形參、方法內定義的變量、代碼塊中定義的變量,都屬于局部變量。

類變量 (靜態變量)

可以向前引用

變量屬于類本身

類變量不依賴類的實例,類變量只在初始化時候在方法區中被分配一次空間,無論類的實例被創建幾次,都不再為類變量分配空間

通過類的任意一個實例來訪問類變量,底層都將將其轉為通過類本身來訪問類變量,它們的效果是一樣的

一旦類變量的值被改變,通過類或類的任意一個實例來訪問類變量,得到的都將是被改變后的值

將在類的初始化之前初始化

實例變量(非靜態變量)

不能向前引用,如果向前引用,則稱為非法向前引用,這是不允許的

變量屬于類的實例對象

隨著類的實例被創建而分配內存空間

實例演示

public class Parent {

public int parentNum=0;

public static int staticParentNum=0;

{

System.out.println("Parent---執行非靜態代碼塊了1!");

}

{

System.out.println("Parent---執行非靜態代碼塊了2!");

}

static{

System.out.println("Parent---執行靜態代碼塊了1!");

}

static{

System.out.println("Parent---執行靜態代碼塊了2!");

}

public Parent(){

System.out.println("Parent---無參構造函數!");

}

public Parent(int parentNum){

this.parentNum=parentNum;

System.out.println("Parent---有參構造函數!");

}

public void ParentMethod(int parentNum){

this.parentNum=parentNum;

System.out.println("Parent---非靜態方法/parentNum="+parentNum);

}

public static void staticParentMethod(int staticParentNum){

Parent.staticParentNum=staticParentNum;

System.out.println("Parent---靜態方法/staticParentNum="+staticParentNum);

}

}

public class Child extends Parent{

public int childNum=0;

public static int staticChildNum=0;

{

System.out.println("Child---執行非靜態代碼塊了1!");

}

{

System.out.println("Child---執行非靜態代碼塊了2!");

}

static{

System.out.println("Child---執行靜態代碼塊了1!");

}

static{

System.out.println("Child---執行靜態代碼塊了2!");

}

public Child(){

super();

System.out.println("Child---無參構造函數!");

}

public Child(int childNum){

super(childNum);

System.out.println("Child---有參構造函數!");

}

public void childMethod(int childNum){

this.childNum=childNum;

System.out.println("Child--非靜態方法/childNum="+childNum);

}

public static void staticChildMethod(int staticChildNum){

Child.staticChildNum=staticChildNum;

System.out.println("Child---靜態方法/staticChildNum="+staticChildNum);

}

}

package test;

public class Test {

// static{

// System.out.println("Test---靜態代碼塊!");

// }

public static void main(String[] args) {

int key=10;

switch (key) {

case 0:

Parent parent=new Parent();

break;

// Parent---執行靜態代碼塊了1!

// Parent---執行靜態代碼塊了2!

// Parent---執行非靜態代碼塊了1!

// Parent---執行非靜態代碼塊了2!

// Parent---無參構造函數!

// 說明:先加載靜態代碼塊,后加載非靜態代碼塊

case 1:

Child b= new Child();

break;

// Parent---執行靜態代碼塊了1!

// Parent---執行靜態代碼塊了2!

// Child---執行靜態代碼塊了1!

// Child---執行靜態代碼塊了2!

// Parent---執行非靜態代碼塊了1!

// Parent---執行非靜態代碼塊了2!

// Parent---無參構造函數!

// Child---執行非靜態代碼塊了1!

// Child---執行非靜態代碼塊了2!

// Child---無參構造函數!

// 說明:創建子類,會先執行父類,先執行父類靜態——>子類靜態——>父類非靜態——>父類構造

//——>子類非靜態——>子類構造

case 2:

Child c= new Child(4);

//這個構造函數中指明了調用父類的有參構造函數,若不指定,則調用父類無參構造函數

break;

// Parent---執行靜態代碼塊了1!

// Parent---執行靜態代碼塊了2!

// Child---執行靜態代碼塊了1!

// Child---執行靜態代碼塊了2!

// Parent---執行非靜態代碼塊了1!

// Parent---執行非靜態代碼塊了2!

// Parent---有參構造函數!

// Child---執行非靜態代碼塊了1!

// Child---執行非靜態代碼塊了2!

// Child---有參構造函數!

說明:靜態代碼塊或非靜態代碼塊執行順序,按照代碼前后編寫順序。

case 3:

Child d= new Child();

Child e= new Child(4);

break;

// Parent---執行靜態代碼塊了1!

// Parent---執行靜態代碼塊了2!

// Child---執行靜態代碼塊了1!

// Child---執行靜態代碼塊了2!

// Parent---執行非靜態代碼塊了1!

// Parent---執行非靜態代碼塊了2!

// Parent---無參構造函數!

// Child---執行非靜態代碼塊了1!

// Child---執行非靜態代碼塊了2!

// Child---無參構造函數!

// Parent---執行非靜態代碼塊了1!

// Parent---執行非靜態代碼塊了2!

// Parent---有參構造函數!

// Child---執行非靜態代碼塊了1!

// Child---執行非靜態代碼塊了2!

// Child---有參構造函數!

說明:創建多個子類,但父類靜態代碼塊只執行一次。

case 4:

Child.staticChildMethod(4);

break;

// Parent---執行靜態代碼塊了1!

// Parent---執行靜態代碼塊了2!

// Child---執行靜態代碼塊了1!

// Child---執行靜態代碼塊了2!

// Child---靜態方法/staticChildNum=4

說明:靜態方法只可以調用靜態變量。

case 5:

Parent.staticParentMethod(5);

break;

// Parent---執行靜態代碼塊了1!

// Parent---執行靜態代碼塊了2!

// Parent---靜態方法/staticParentNum=5

說明:靜態方法可通過 父類名.靜態方法() 調用。

case 6:

System.out.println("父類的靜態變量值staticParentNum="+Parent.staticParentNum);

break;

// Parent---執行靜態代碼塊了1!

// Parent---執行靜態代碼塊了2!

// 父類的靜態變量值staticParentNum=0

說明:調用靜態變量時,靜態代碼塊會執行。

case 7:

System.out.println("子類的靜態變量值staticChildNum="+Child.staticChildNum);

break;

// Parent---執行靜態代碼塊了1!

// Parent---執行靜態代碼塊了2!

// Child---執行靜態代碼塊了1!

// Child---執行靜態代碼塊了2!

// 子類的靜態變量值staticChildNum=0

說明:調用子類靜態變量,父類靜態代碼塊和子類靜態代碼塊會被執行。

case 8:

System.out.println("父類的靜態變量值staticParentNum="+Parent.staticParentNum);

System.out.println("子類的靜態變量值staticChildNum="+Child.staticChildNum);

break;

// Parent---執行靜態代碼塊了1!

// Parent---執行靜態代碼塊了2!

// 父類的靜態變量值staticParentNum=0

// Child---執行靜態代碼塊了1!

// Child---執行靜態代碼塊了2!

// 子類的靜態變量值staticChildNum=0

case 9:

Child f= new Child();

f.ParentMethod(3);

break;

// Parent---執行靜態代碼塊了1!

// Parent---執行靜態代碼塊了2!

// Child---執行靜態代碼塊了1!

// Child---執行靜態代碼塊了2!

// Parent---執行非靜態代碼塊了1!

// Parent---執行非靜態代碼塊了2!

// Parent---無參構造函數!

// Child---執行非靜態代碼塊了1!

// Child---執行非靜態代碼塊了2!

// Child---無參構造函數!

// Parent---非靜態方法/parentNum=3

說明:創建子類,用子類調用父類方法,非靜態方法可以調用靜態變量。

default:

break;

}

}

}

總結

Java代碼初始化順序

由 static 關鍵字修飾的(如:類變量(靜態變量)、靜態代碼塊)將在類被初始化創建實例對象之前被初始化,而且是按順序從上到下依次被執行。靜態(類變量、靜態代碼塊)屬于類本身,不依賴于類的實例。

沒有 static 關鍵字修飾的(如:實例變量(非靜態變量)、非靜態代碼塊)初始化實際上是會被提取到類的構造器中被執行的,但是會比類構造器中的代碼塊優先執行到,非靜態(實例變量、非靜態代碼塊)的地位是相等的,它們將按順序被執行。

類變量(靜態變量)、實例變量(非靜態變量)、靜態代碼塊、非靜態代碼塊的初始化時機

由 static 關鍵字修飾的(如:類變量[靜態變量]、靜態代碼塊)將在類被初始化創建實例對象之前被初始化,而且是按順序從上到下依次被執行;

沒有 static 關鍵字修飾的(如:實例變量[非靜態變量]、非靜態代碼塊)初始化實際上是會被提取到類的構造器中被執行的,但是會比類構造器中的 代碼塊優先執行到,其也是按順序從上到下依次被執行。

容易混淆的一個知識點

靜態方法只允許直接訪問靜態成員,而實例方法中可以訪問靜態成員和實例成員,原因是類還沒有實例化,所實例成員也沒有被創建,靜態方法中因此也不能用this。

歡迎關注公眾號交流!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/542656.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/542656.shtml
英文地址,請注明出處:http://en.pswp.cn/news/542656.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

mysql 包含的那些文件

*.frm是描述了表的結構 *.MYD保存了表的數據記錄 *.MYI則是表的索引 ibd是MySQL數據文件、索引文件,無法直接讀取。 轉載于:https://www.cnblogs.com/07byte/p/5823667.html

math 計算float_Java Math類靜態float min(float f1,float f2)與示例

math 計算float數學類靜態浮點數min(float f1,float f2) (Math Class static float min(float f1 , float f2) ) This method is available in java.lang package. 此方法在java.lang包中可用。 This method is used to return the minimum one of both the given a…

vector 不初始化時什么狀態_Vue原理解析(三):初始化時created之前做了什么?...

讓我們繼續this._init()的初始化之旅,接下來又會執行這樣的三個初始化方法:initInjections(vm) initState(vm) initProvide(vm)5. initInjections(vm): 主要作用是初始化inject,可以訪問到對應的依賴。inject和provide這里需要簡單的提一下&a…

switch 字符串 java_JDK7新特性switch支持字符串

在JDK7中,switch語句的判斷條件增加了對字符串類型的支持。由于字符串的操作在編程中使用頻繁,這個新特性的出現為Java編程帶來了便利。接下來通過一個案例演示一下在switch語句中使用字符串進行匹配。public class Example {public static void main(String[] args) {String w…

cisco packet tracer路由器配置_【干貨】思科交換機路由器怎么配置密碼?

今天帶大家看看如何在思科的交換機路由器當中配置安全特性,也就是密碼的配置方式。在學習配置之前,我們先回顧一下密碼相關知識。密碼學是研究信息系統安全保密的科學。人類有記載的通信密碼始于公元前400年,古希臘人是置換密碼學的發明者。密…

perl 哈希數組的哈希_使用哈希檢查兩個數組是否相似

perl 哈希數組的哈希Prerequisite: Hashing data structure 先決條件: 哈希數據結構 Problem statement: 問題陳述: Check whether two arrays are similar or not using the hash table. The arrays are of the same size. 使用哈希表檢查兩個數組是否…

codevs3872 郵遞員送信(SPFA)

郵遞員送信 時間限制: 1 Sec 內存限制: 64 MB提交: 10 解決: 5[提交][狀態][討論版] 題目描述 有一個郵遞員要送東西,郵局在節點1.他總共要送N-1樣東西,其目的地分別是2~N。由于這個城市的交通比較繁忙,因此所有的道路都是單行的&#xff0…

java上傳csv文件上傳_java處理csv文件上傳示例詳解

前言:示例只是做了一個最最基礎的上傳csv的示例,如果要引用到代碼中去,還需要根據自己的業務自行添加一些邏輯處理。readcsvutil工具類package com.hanfengyeqiao.gjb.utils;import java.io.*;import java.util.*;/*** csv工具類*/public cla…

360更新補丁一直提示正在安裝_遠程利用POC公布|CVE20200796:微軟發布SMBv3協議“蠕蟲級”漏洞補丁通告...

更多全球網絡安全資訊盡在邑安全www.eansec.com0x00 事件描述2020年3月11日,360CERT監測到有海外廠家發布安全規則通告,通告中描述了一處微軟SMBv3協議的內存破壞漏洞,編號CVE-2020-0796,并表示該漏洞無需授權驗證即可被遠程利用&…

字符串的回文子序列個數_計算給定字符串中回文子序列的數量

字符串的回文子序列個數Problem statement: 問題陳述: Given a string you have to count the total number of palindromic subsequences in the giving string and print the value. 給定一個字符串,您必須計算給定字符串中回文子序列的總數并打印該值…

Linux-破解rhel7-root密碼

破解7的密碼1.linux16 rd.break2.mount -o remount,rw /sysroot3.chroot /sysroot4.passwd5.touch /.autorelabelexitexit7版本grub菜單加密1.grub2-mkpasswd-pbkdf22.vi /etc/grub.d/40_customset superusers"root"password_pbkdf2 root grub.pbkdf2.sha512.10000.…

適配接口 java_【Java 設計模式】接口型模式--Adapter(適配器)模式

簡介:【Java設計模式】接口型模式–Adapter(適配器)模式Adapter模式的宗旨就是:向客戶提供接口,并使用現有的類所提供的服務,以滿足客戶的需求。 或者說,現在有classA的方法滿足客戶的部分要求,將另一部分需…

deepinu盤制作工具_u盤啟動盤制作工具怎么制作 u盤啟動盤制作工具制作方法【詳細步驟】...

在電腦城很多技術人員都會使用u盤裝系統的方法給用戶電腦安裝系統,他們是怎么操作的呢?其實很簡單,就是通過u盤啟動盤來安裝系統的。而u盤啟動盤是需要用 u盤啟動盤制作工具 來制作的。那么問題又來了,u盤啟動盤制作工具怎么制作呢?下面就給…

openstack私有云_OpenStack-下一代私有云的未來

openstack私有云The OpenStack project is an open source cloud computing platform for all types of clouds, which aims to be simple to implement, massively scalable, and feature rich. Developers and cloud computing technologists from around the world create t…

outlook2010客戶端無法預覽及保存word,excel問題

outlook2010客戶端遇到的EXCEL預覽及保存問題今天遇到了一個這樣的問題,outlook2010打開以后其他的excel都可以打開預覽及保存,這個excel無法預覽既保存,經查是outlook2010預覽及打開的緩存有限制,超過后就無法預覽了,…

python自動化框架pytest pdf_Python 自動化測試框架 unittest 和 pytest 對比

一、用例編寫規則1.unittest提供了test cases、test suites、test fixtures、test runner相關的類,讓測試更加明確、方便、可控。使用unittest編寫用例,必須遵守以下規則:(1)測試文件必須先import unittest(2)測試類必須繼承unittest.TestCase(3)測試方法必須以“test_”開頭(4…

freemarker的測試結果框架_java必背綜合知識點總結(框架篇)

框架篇一、Struts1的運行原理在啟動時通過前端總控制器ActionServlet加載struts-config.xml并進行解析,當用戶在jsp頁面發送請求被struts1的核心控制器ActionServlet接收,ActionServlet在用戶請求時將請求參數放到對應的ActionForm對象中的成員變量中&am…

Java SecurityManager checkPackageDefinition()方法與示例

SecurityManager類的checkPackageDefinition()方法 (SecurityManager Class checkPackageDefinition() method) checkPackageDefinition() method is available in java.lang package. checkPackageDefinition()方法在java.lang包中可用。 We call getProperty("package.d…

java容器詳解_詳解Java 容器(第①篇)——概覽

![](http://img.blog.itpub.net/blog/2020/04/02/9d89d3008962c127.png?x-oss-processstyle/bb)容器主要包括 Collection 和 Map 兩種,Collection 存儲著對象的集合,而 Map 存儲著鍵值對(兩個對象)的映射表。# 一、Collection![](https://upload-images…

python圖形界面庫哪個好_8個必備的Python GUI庫

Python GUI 庫有很多,下面給大家羅列常用的幾種 GUI庫。下面介紹的這些GUI框架,能滿足大部分開發人員的需要,你可以根據自己的需求,選擇合適的GUI庫。1. wxPython wxPython 是一個跨平臺的 GUI 工具集,是 Python 語言的…