1. 程式人生 > >Java中static關鍵字解析以及類載入順序例題

Java中static關鍵字解析以及類載入順序例題

一.static關鍵字的用途

在《Java程式設計思想》P86頁有這樣一段話:

  “static方法就是沒有this的方法。在static方法內部不能呼叫非靜態方法,反過來是可以的。而且可以在沒有建立任何物件的前提下,僅僅通過類本身來呼叫static方法。這實際上正是static方法的主要用途。”

  這段話雖然只是說明了static方法的特殊之處,但是可以看出static關鍵字的基本作用,簡而言之,一句話來描述就是:

  方便在沒有建立物件的情況下來進行呼叫(方法/變數)。

  很顯然,被static關鍵字修飾的方法或者變數不需要依賴於物件來進行訪問,只要類被載入了,就可以通過類名去進行訪問。

  static可以用來修飾類的成員方法、類的成員變數,另外可以編寫static程式碼塊來優化程式效能。

1)static方法

  static方法一般稱作靜態方法,由於靜態方法不依賴於任何物件就可以進行訪問,因此對於靜態方法來說,是沒有this的,因為它不依附於任何物件,既然都沒有物件,就談不上this了。並且由於這個特性,在靜態方法中不能訪問類的非靜態成員變數和非靜態成員方法,因為非靜態成員方法/變數都是必須依賴具體的物件才能夠被呼叫。

  但是要注意的是,雖然在靜態方法中不能訪問非靜態成員方法和非靜態成員變數,但是在非靜態成員方法中是可以訪問靜態成員方法/變數的。舉個簡單的例子:

  在上面的程式碼中,由於print2方法是獨立於物件存在的,可以直接用過類名呼叫。假如說可以在靜態方法中訪問非靜態方法/變數的話,那麼如果在main方法中有下面一條語句:

  MyObject.print2();

  此時物件都沒有,str2根本就不存在,所以就會產生矛盾了。同樣對於方法也是一樣,由於你無法預知在print1方法中是否訪問了非靜態成員變數,所以也禁止在靜態成員方法中訪問非靜態成員方法。

  而對於非靜態成員方法,它訪問靜態成員方法/變數顯然是毫無限制的。

  因此,如果說想在不建立物件的情況下呼叫某個方法,就可以將這個方法設定為static。我們最常見的static方法就是main方法,至於為什麼main方法必須是static的,現在就很清楚了。因為程式在執行main方法的時候沒有建立任何物件,因此只有通過類名來訪問。

  另外記住,即使沒有顯示地宣告為static,類的構造器實際上也是靜態方法

2)static變數

  static變數也稱作靜態變數,靜態變數和非靜態變數的區別是:靜態變數被所有的物件所共享,在記憶體中只有一個副本,它當且僅當在類初次載入時會被初始化。而非靜態變數是物件所擁有的,在建立物件的時候被初始化,存在多個副本,各個物件擁有的副本互不影響。

  static成員變數的初始化順序按照定義的順序進行初始化。

3)static程式碼塊

  static關鍵字還有一個比較關鍵的作用就是 用來形成靜態程式碼塊以優化程式效能。static塊可以置於類中的任何地方,類中可以有多個static塊。在類初次被載入的時候,會按照static塊的順序來執行每個static塊,並且只會執行一次。

  為什麼說static塊可以用來優化程式效能,是因為它的特性:只會在類載入的時候執行一次。下面看個例子:

1 2 3 4 5 6 7 8 9 10 11 12 13 class Person{ private Date birthDate; public Person(Date birthDate) { this.birthDate = birthDate; } boolean isBornBoomer() { Date startDate = Date.valueOf("1946"); Date endDate = Date.valueOf("1964"); return birthDate.compareTo(startDate)>=0 && birthDate.compareTo(endDate) < 0; } }

  isBornBoomer是用來這個人是否是1946-1964年出生的,而每次isBornBoomer被呼叫的時候,都會生成startDate和endDate兩個物件,造成了空間浪費,如果改成這樣效率會更好:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 class Person{ private Date birthDate; private static Date startDate,endDate; static{ startDate = Date.valueOf("1946"); endDate = Date.valueOf("1964"); } public Person(Date birthDate) { this.birthDate = birthDate; }

相關推薦

Javastatic關鍵字解析以及載入順序例題

一.static關鍵字的用途 在《Java程式設計思想》P86頁有這樣一段話:   “static方法就是沒有this的方法。在static方法內部不能呼叫非靜態方法,反過來是可以的。而且可以在沒有建立任何物件的前提下,僅僅通過類本身來呼叫static方法

Javastatic關鍵字解析

地方 通過 特性 inf 優化 href compare 筆試 star Java中的static關鍵字解析   static關鍵字是很多朋友在編寫代碼和閱讀代碼時碰到的比較難以理解的一個關鍵字,也是各大公司的面試官喜歡在面試時問到的知識點之一。下面就先講述一下static

javastatic關鍵字解析

代碼塊 高效率 ava 周期 隨著 提高 修飾 方法 相同 靜態的特點:   A:隨著類的加載而加載   B:優先於對象而存在   C:靜態是被所有對象共享的數據      這也是我們來判斷是否使用靜態的標準   D:靜態的出現,讓我們的調用方式多了一種     類名.靜態

Javastatic關鍵字用法總結

副本 大括號 跟著 rac clas main 靜態成員變量 abstract 全局變量 1. 靜態方法 通常,在一個類中定義一個方法為static,那就是說,無需本類的對象即可調用此方法 聲明為static的方法有以下幾條限制: · 它們僅能調用其他的sta

javastatic關鍵字淺談

基本規則 Java中static關鍵字修飾的成員變數和方法是靜態變數和方法,使用規則如下: 1. static方法只能呼叫static方法或static變數,不能呼叫非static方法或非static變數,換句話說就是,靜態方法只能呼叫靜態方法或靜態變數,不能呼叫非靜態方法或非靜態變數。

Java基礎-static 關鍵字解析

參考文章: https://www.cnblogs.com/dolphin0520/p/3799052.html static的應用: 1.static是為了在沒有建立任何物件的前提下,僅僅通過類本身來呼叫static方法。 只要類被載入了,就能通過類名進行訪問。 2.static 可以用來修飾類的成

javastatic關鍵字的奧妙

1.一句話概述:方便在沒有建立物件的情況下來進行呼叫(方法/變數) 2.static變數也稱作靜態變數,靜態變數和非靜態變數的區別是:靜態變數被所有的物件所共享,在記憶體中只有一個副本,它當且僅當在類初次載入時會被初始化。而非靜態變數是物件所擁有的,在建立物件的時候被初始化

javastatic關鍵字的使用--靜態方法

一、靜態方法中只能有靜態成員。 static修飾的方法可以被類直接呼叫,不需要new物件。所以static方法內部的變數和方法也是需要被類呼叫的,所以static方法內部的變數和方法都是static的。 package com.keyword.test; /** * 靜態方法

javastatic關鍵字的使用--靜態成員變數

一、修飾成員變數 沒有被static修飾的成員變數,叫做例項變數。 被static修飾的成員變數,稱為靜態成員變數,也叫做類變數 特點: 所有物件共享靜態成員變數。 可以使用類名直接呼叫。(使用物件名仍能呼叫) 二、使用 package com.key

java各種集合解析以及區別

一,java中各種集合的關係圖 Collection 介面的介面 物件的集合 ├ List 子介面 按進入先後有序儲存 可重複 │├ LinkedList 介面實現類 連結串列

深入分析Javastatic關鍵字

  static是Java中的一個比較重要的關鍵字。它具有多種的用法,合適地運用static關鍵字可以有效地提高程式的執行效能,優化程式的結構。static關鍵字主要具有以下四種應用場景和用途: 修飾成員變數 修飾成員方法 靜態程式碼塊 靜態導包 1

java核心機制——jvm執行以及載入全過程

jvm執行和類載入 為啥要研究類載入全過程? ~~有助於瞭解JVM執行過程 ~~更深入瞭解java動態性,(解熱部署,動態載入)提高程式來的靈活性。 類載入機制 ~JVM把class檔案

JAVAstatic關鍵字的作用

static關鍵字特點:1.static是一個修飾符,用於修飾成員變數、成員方法。static修飾的成員變數稱之為靜態變數或類變數。          2.static修飾的成員變數被所有的物件共享。          3.static優先於物件存在,因為static的成員隨

Javastatic關鍵字作用

import static java.lang.System.out; public class StaticTest{ public static String name = "test";//可修飾成員變數,在類載入時載入 public Integer

java static關鍵字作用

static關鍵字主要有兩種作用: 第一,為特定資料型別或物件分配單一的存貯空間,而與建立物件的個數無關。第二,希望某個方法或屬性與類而不是物件關聯在一起,也就是說, 在不建立物件的情況下就可以通過類來直接呼叫方法或使用類的屬性。具體而言,static在ja

javastatic關鍵字的用法

static是靜態修飾符,在java中,static可以作用在變數、方法、類上,以及還可以在類中獨立成一個靜態塊。被static修飾的,一般都是屬於類本身的,在類載入的過程中,靜態的變數就會被初始化

javastatic關鍵字

static關鍵字Static可以用來修飾某個類的成員變數和成員方法。需要記住一點是:用static修飾的變數或方法,是類例項所共有,如果沒有用static修飾,那麼需要用new關鍵字建立一個物件,記憶體就是為這個物件分配空間,是來存放成員變數和方法。如果用static修飾,

面試題--JAVA靜態塊、靜態變數載入順序詳解

public class test { //1.第一步,準備載入類 public static void main(String[] args)

Java相同全限定名的載入順序

相同的類指:類的全限定名一樣 問題: 怎麼優先載入自己寫的類 1. 解析:  class檔案所在位置, 直接在classpath下, 在jar包中  a: 相同的類, 一個在web-inf/classes目錄下, 一個在jar包中: 此時優先載入classes目錄下

Tomcat目錄結構以及載入順序

Tomcat是一個優秀的Servlet容器,本身使用java語言編寫。Tomcat是Apache開源軟體組織的一個軟體專案。Tomcat執行穩定、可靠,而且有著開源的優勢,Tomcat已成為目前企業開