1. 程式人生 > >java中靜態程式碼塊、靜態方法、static關鍵字詳解

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  程式碼塊 就是一塊程式碼,是一對大括號括起來的內容  方法中:限制變數的生命週期 類中 方法外: 構造程式碼塊:沒有關鍵字修飾,在每次建立物件時,在構造方法執行前進行執行 用途:可以對成員 變