java中靜態程式碼塊、靜態方法、static關鍵字詳解
最近在準備面試,複習java基礎知識,對java中和static關鍵字相關的靜態方法、靜態程式碼塊、非靜態程式碼塊、靜態成員變數的用法進行了詳細的總結。
1. 靜態成員變數
宣告為static關鍵詞修飾的變數叫做靜態成員變數,也叫作全域性變數。被static修飾的成員變數和成員方法獨立於該類的任何物件。也就是說,它不依賴類特定的例項,被類的所有例項共享。只要這個類被載入,Java虛擬機器就能根據類名在執行時資料區的方法區內找到他們。因此,static物件可以在它的任何物件建立之前訪問,無需引用任何物件。
2. 靜態程式碼塊
static 程式碼塊也叫靜態程式碼塊,是在類中獨立於類成員的static語句塊,可以有多個,位置可以隨便放,它不在任何的方法體內,JVM載入類時會執行這些靜態的程式碼塊,如果static程式碼塊有多個,JVM將按照它們在類中出現的先後順序依次執行它們,每個程式碼塊只會被執行一次。在靜態方法裡面只能直接呼叫同類中其他的靜態成員(包括變數和方法),而不能直接訪問類中的非靜態成員。因為對於非靜態的方法和變數,需要先建立類的例項物件後方可使用,而靜態方法在使用前不用建立任何物件。
宣告方式:
static
{
//do something
}
3. 非靜態程式碼塊
非靜態程式碼塊的執行順序在構造方法執行之前,類每new一次都會執行。
宣告方式:不加任何修飾符
{
//do something
}
4. 靜態方法
靜態方法可以直接通過類名呼叫,任何的例項也都可以呼叫,因此靜態方法中不能用this和super關鍵字,不能直接訪問所屬類的例項變數和例項方法 (就是不帶static的成員變數和成員成員方法),只能訪問所屬類的靜態成員變數和成員方法。因為類所屬的例項變數和例項方法需要物件建立之後才會存在。
宣告方式:
public static void dosomething() { //do something }
接下來看看下面的例子:
package staticblock;
public class Parent
{
//靜態程式碼塊,只在類裝載的時候執行
static
{
System.out.println("parent static block");
}
//非靜態程式碼塊,每new一次都會執行
{
System.out.println("parent non-static block");
}
public Parent()
{
System.out.println("parent constractor block");
}
}
package staticblock; public class Child extends Parent { //子類靜態程式碼塊 static { System.out.println("child static block"); } //子類非靜態程式碼塊 { System.out.println("child non-static block"); } //子類構造方法 public Child() { System.out.println("child constractor block"); } //靜態方法需要在呼叫 的時候才執行 public static void get() { System.out.println("this is a static method!"); } public static void main(String[] args) { new Child(); System.out.println("------------------"); new Child(); Child.get(); } }
執行之後的輸出結果:
parent static block
child static block
parent non-static block
parent constractor block
child non-static block
child constractor block
------------------
parent non-static block
parent constractor block
child non-static block
child constractor block
this is a static method!
我們看到靜態程式碼塊在執行中只執行了1次,而非靜態程式碼塊執行了兩次,靜態方法需要呼叫才會執行。執行順序是先執行父類的靜態程式碼塊,然後執行子類的靜態程式碼塊;然後執行父類的非靜態程式碼塊,再執行父類的構造方法;之後再執行子類的非靜態程式碼塊,再執行子類的構造方法。靜態程式碼塊》非靜態程式碼塊》構造方法。
相關推薦
Java中的程式碼塊(靜態程式碼塊、構造程式碼塊、同步程式碼塊)
Java中{}內的東西統稱為程式碼塊分為靜態程式碼塊、構造程式碼塊、區域性程式碼塊、同步程式碼塊 所有{}內定義的變數,其作用域僅限於該{},離開{}後其內部的變數棧空間和堆空間都被JVM(Java Virtual Machine)所回收而不能再使用。在{}中不能定以兩個同名變數,不能定義兩
java中靜態程式碼塊、靜態方法、static關鍵字詳解
最近在準備面試,複習java基礎知識,對java中和static關鍵字相關的靜態方法、靜態程式碼塊、非靜態程式碼塊、靜態成員變數的用法進行了詳細的總結。 1. 靜態成員變數 宣告為static關鍵詞修飾的變數叫做靜態成員變數,也叫作全域性變數。被static修飾的成員變數和
Java中靜態、非靜態程式碼塊, 無參、有參構造方法執行順序
基本概念 1、靜態程式碼塊和非靜態程式碼塊: 相同點:都是JVM載入類時且在建構函式執行之前執行,在類中都可以定義多個,一般在程式碼塊中對一些static變數進行賦值。 不同點:靜態程式碼塊在非靜態程式碼塊之前執行。靜態程式碼塊只在第一次new時執行一次
JAVA中的程式碼塊、靜態程式碼塊、構造方法、main方法執行順序
java中靜態程式碼塊,普通程式碼塊,構造程式碼塊區別及程式碼示例 執行順序:(優先順序從高到低)靜態程式碼塊>mian方法>構造程式碼塊>構造方法。其中靜態程式碼塊只執行一次。構造程式碼塊在每次建立物件是都會執行。 1 普通程式碼塊 普通程式碼塊:在方
java中靜態變數,靜態程式碼塊,靜態方法,例項變數,匿名程式碼塊的載入順序
1. java中靜態變數,靜態程式碼塊,靜態方法,例項變數,匿名程式碼塊 在Java中,使用{}括起來的程式碼稱為程式碼塊,程式碼塊可以分為以下四種: (1)普通程式碼塊:就是類中方法的方法體 public void xxx(){ //code }
Java中動態程式碼塊,構造程式碼塊,靜態程式碼塊之間的執行順序
Java中動態程式碼塊,構造程式碼塊,靜態程式碼塊之間的執行順序 /** * Java中動態程式碼塊,構造程式碼塊,靜態程式碼塊之間的執行順序 * @author Administrator * */ class HelloA { public HelloA() { Sys
Java靜態程式碼塊和靜態方法
1 靜態程式碼塊:有些程式碼必須在專案啟動的時候就執行,這種程式碼是主動執行的(當類被載入時,靜態程式碼塊被執行,且只被執行一次,靜態塊常用來執行類屬性的初始化) 2 靜態方法:需要在專案啟動的時候就初始化,在不建立物件的情況下,這種程式碼是被動執行的(靜態方法在類載入的時候就已經載入 可以用類
Java中靜態成員變數,靜態程式碼塊,靜態內部類何時被初始化?
關於這個問題,本文不扯理論,直接上程式碼,通過結果來驗證結論,廢話少說,測試程式碼如下: public class StaticTest { public static StaticMember staticMember = new Static
Java中普通程式碼塊,構造程式碼塊,靜態程式碼塊區別及程式碼示例
//執行順序:(優先順序從高到低。)靜態程式碼塊>mian方法>構造程式碼塊>構造方法。 其中靜態程式碼塊只執行一次。構造程式碼塊在每次建立物件是都會執行。 1 普通程式碼塊 //普通程式碼塊:在方法或語句中出現的{}就稱為普通程式碼塊。普通程式碼塊
類中靜態方法和靜態變數,靜態程式碼塊,構造方法,以及被@PostConstruct修飾的方法執行順序
第一種:當直接呼叫(沒有new物件)靜態方法時候:程式碼塊(靜態變數按照順序)就執行—–方法執行。 第二種建立物件:執行父類靜態程式碼—-執行子類的靜態程式碼—-執行父類構造方法—–執行子類的構造
關於java中的非靜態程式碼塊和靜態程式碼塊
非靜態程式碼塊如: { System.out.println("2"); }以上程式碼塊就是非靜態的程式碼塊,請注意這裡的方法名、作用域、返回值、引數一概沒有,非靜態程式碼塊會在每次類被呼叫或者被例項化時就會被執行。 靜態程式碼塊如: static { Syst
Java靜態程式碼塊和靜態方法的區別/類載入順序
(一)java 靜態程式碼塊 靜態方法區別 一般情況下,如果有些程式碼必須在專案啟動的時候就執行的時候,需要使用靜態程式碼塊,這種程式碼是主動執行的;需要在專案啟動的時候就初始化,在不建立物件的情況下,其他程式來呼叫的時候,需要使用靜態方法,這種程式碼是被動執行的.
Java靜態程式碼塊和靜態方法的區別
(一)java 靜態程式碼塊 靜態方法區別 一般情況下,如果有些程式碼必須在專案啟動的時候就執行的時候,需要使用靜態程式碼塊,這種程式碼是主動執行的;需要在專案啟動的時候就初始化,在不建立物件的情況下,其他程式來呼叫的時候,需要使用靜態方法,這種程式碼是被動執行的. 靜態
unity 靜態程式碼塊和構造方法執行時機和次數
using UnityEngine; using System.Collections; public class test : MonoBehaviour { void Start () { person p01 = new person(); person p
java中構造程式碼塊、static程式碼塊和區域性程式碼塊的區別
先上程式碼: class StaticCode{ int age; // static程式碼塊 static{ System.out.println("static程式碼塊"); } //構造程式碼塊
【Java基礎】繼承中的程式碼塊和構造方法的執行順序探索
本文講述有關一個類的靜態程式碼塊,構造程式碼塊,構造方法的執行流程問題。首先來看一個例子 /** * Created by lili on 15/10/19. */ class Person{ static { System.out.println("執行Per
靜態成員變數靜態程式碼塊和構造方法的執行順序
型別一:靜態成員變數+非靜態成員變數+構造方法 public class StaticInitialization { public static void main(String[] args) { System.out.print
java中的程式碼塊概述
程式碼塊基本概念 什麼是程式碼塊? 在java中,每個用{}引起來的程式碼的集合就被稱作程式碼塊。 程式碼塊的分類 程式碼塊可分為區域性程式碼塊,構造程式碼塊,靜態程式碼塊,同步程式碼塊。 區域性程式碼塊 在方法中定義的,隨著方法的呼叫而載入,方法結束而釋放,及早釋放,提高記
淺談java中的程式碼塊
java中的程式碼塊 簡述 靜態程式碼塊和構造程式碼塊的特點 舉例 簡述 1.區域性程式碼塊: 在方法中出現;限定變數生命週期,及早釋放,提高記憶體利用率 2.構造程式碼塊: 構造程式碼塊分為有參構造程式碼塊和無參構造程式碼塊,會
程式碼塊的解釋,構造程式碼塊,靜態程式碼塊,靜態常量和常量以及靜態成員變數和物件成員變數的區別
12 程式碼塊 就是一塊程式碼,是一對大括號括起來的內容 方法中:限制變數的生命週期 類中 方法外: 構造程式碼塊:沒有關鍵字修飾,在每次建立物件時,在構造方法執行前進行執行 用途:可以對成員 變