Java之static靜態關鍵字詳解

2021-01-09 小碼哥編程學習

前言

在Java語言中,static表示「靜態」的意思,使用場景可以用來修飾成員變量和成員方法,當然也可以是靜態代碼塊。static的主要作用在於創建獨立於具體對象的域變量或者方法。本文主要來去講解一下static的來龍去脈。

static要解決什麼問題?

我們知道,當我們通過new關鍵字去創建對象的時候,那麼數據的存儲空間才會被分配,類中的成員方法才能被對象所使用。但是呢有兩種特殊的情況:1、我們通過new關鍵字創建的對象共享同一個資源,而不是說每個對象都擁有自己的數據,或者說根本就不需要去創建對象,這個資源和對象之間是沒有關係的。2、希望某個方法不與包含它的類的任何對象聯繫在一起。總結下來就是說:即使沒有創建對象,也能使用屬性和調用方法,static目的就是在於解決這個問題。

格式

修飾變量:static 數據類型 變量名

修飾方法:【訪問權限修飾符】 static 方法返回值 方法名(參數列表)

特點

static可以修飾變量,方法被static修飾的變量或者方法是獨立於該類的任何對象,也就是說,這些變量和方法不屬於任何一個實例對象,而是被類的實例對象所共享。在類被加載的時候,就會去加載被static修飾的部分。被static修飾的變量或者方法是優先於對象存在的,也就是說當一個類加載完畢之後,即便沒有創建對象,也可以去訪問。

static靜態變量

被static修飾的成員變量叫做靜態變量,也叫做類變量,說明這個變量是屬於這個類的,而不是屬於是對象,沒有被static修飾的成員變量叫做實例變量,說明這個變量是屬於某個具體的對象的。

靜態變量和實例變量的區別

實例變量:每次創建對象,都會為每個對象分配成員變量內存空間,實例變量是屬於實例對象的,在內存中,創建幾次對象,就有幾份成員變量。

靜態變量:靜態變量由於不屬於任何實例對象,是屬於類的,所以在內存中只會有一份,在類的加載過程中,JVM為靜態變量分配一次內存空間。

static靜態方法

被static修飾的方法也叫做靜態方法,因為對於靜態方法來說是不屬於任何實例對象的,那麼就是說在靜態方法內部是不能使用this的,因為既然不屬於任何對象,那麼就更談不上this了。

static應用場景

如果某個成員變量是被所有對象所共享的,那麼這個成員變量就應該定義為靜態變量。

static如何去訪問

靜態變量:

類名.靜態變量

對象.靜態變量(不推薦的)

靜態方法:

類名.靜態方法

對象.靜態方法(不推薦)

這裡呢就囉嗦一句,由於被static修飾的變量和方法是不屬於任何實例對象的,所以在這裡,強烈建議不要通過對象的方式去訪問靜態的變量或者方法。

static使用注意事項

在靜態方法中沒有this關鍵字因為靜態是隨著類的加載而加載,而this是隨著對象的創建而存在的。靜態比對象優先存在。靜態可以訪問靜態的,但是靜態不能訪問非靜態的。非靜態的可以去訪問靜態的。

總結

靜態只能訪問靜態。非靜態既可以訪問非靜態的,也可以訪問靜態的。

每日一題

下列哪些語句關於內存回收的說明是正確的()

A、程式設計師必須創建一個線程來釋放內存。

B、內存回收程序負責釋放無用內存。

C、內存回收程序允許程式設計師直接釋放內存。

D、內存回收程序可以在指定的時間釋放內存對象

相關焦點

  • Java transient關鍵字使用小記
    總之,java 的transient關鍵字為我們提供了便利,你只需要實現Serilizable接口,將不需要序列化的屬性前添加關鍵字transient,序列化對象的時候,這個屬性就不會序列化到指定的目的地中。
  • Java面向對象之final、abstract抽象、和變量生命周期
    public static final 或者 public final static 亦或者 final static publicfinal修飾的變量是最終的變量,常量;該變量只能賦值一次,也只能在聲明時被初始化一次,不能被修改。
  • Java反射機制深入詳解
    基本的 Java類型(boolean、byte、char、short、int、long、float 和 double)和關鍵字 void 也表示為 Class 對象。Class 沒有公共構造方法。Class 對象是在加載類時由 Java 虛擬機以及通過調用類加載器中的 defineClass 方法自動構造的。
  • java修飾符
    }private boolean myFlag;static final double weeks = 9.5;protected static final int BOXWIDTH = 42;public static void main(String[] arguments) {// 方法體}
  • Java面向對象之接口——interface
    如: Walkable.java以I開頭表示接口,如:IWalkable.java接口在編譯成功之後,和類一樣,也是.class的字節碼文件。修飾符是可以省略不寫的;3.接口中定義的成員變量,實質是全局靜態常量,默認使用 public static final來修飾;public static final String NAME = "老夫不正經";4.接口中定義的內部類都是公共的靜態內部類,
  • Java之this關鍵字的用法
    給位小夥伴們大家好,在之前的文章中,小編有講過super關鍵字的用法Java之super關鍵字的用法。這次小編要介紹的是在Java當中this關鍵字的用法。具體如下:1.在本類的成員方法中,訪問本類的成員變量。
  • Java之super關鍵字的用法
    各為小夥伴們大家好,這次小編要介紹的是Java當中super關鍵字的用法,在上面的文章中小編有講過,super關鍵字是用來調用父類之間的成員變量和成員方法。現在小編來總結一下super關鍵字的用法。具體如下:1.在子類的成員方法中,訪問父類的成員變量。
  • Java中volatile關鍵字概覽
    一、第一章 volatile關鍵字概覽多線程下變量的不可見性概述在多線程並發執行下,多個線程修改共享的成員變量,會出現一個線程修改了共享變量的值後,另一個線程不能直接 看到該線程修改後的變量的最新值。{try {Thread.sleep(1000);} catch (InterruptedException e) { e.printStackTrace();}// 將flag的值更改為true this.flag = true ;System.out.println("flag=" + flag);}}public class VolatileThreadDemo {// 測試類public static
  • Java編程中基礎反射詳細解析
    類加載指的是將類的class文件讀入內存中,並為之創建一個 java.lang.Class對象,也就是說程序使用任何類的時候,都會為其創建一個class對象。使用靜態初始化塊為類變量指定初始值。類加載的時機創建類的實例的時候訪問類的靜態變量的時候調用類的靜態方法的時候使用反射方式來強制創建某個類或接口對應的java.lang.Class對象初始化某個類的子類的時候
  • 萬字梳理,帶你拿下 Java 面試題!
    9、static 關鍵字是幹什麼用的?談談你的理解。static 是 Java 中非常重要的關鍵字,static 表示的概念是靜態的,在 Java 中,static 主要用來:修飾變量,static 修飾的變量稱為靜態變量、也稱為類變量,類變量屬於類所有,對於不同的類來說,static 變量只有一份,static 修飾的變量位於方法區中;static 修飾的變量能夠直接通過
  • Java之Random類的簡單介紹
    第一步,導包:import java.util.Random第二步,創建:Random a=new Random();小括號是可以留空的第三步,使用:如果要獲取一個隨機數int數字(範圍是int所有範圍,有正負兩種):int num=a.nextInt();為了方便大家的理解,小編就先粘幾行代碼,是一個比較簡單的猜數字小遊戲,代碼如下:
  • Java之File類的構造方法
    Java之File類的簡單介紹,File類的靜態成員變量,這次小編要介紹的是File類的構造方法void main(String[] args) {//file類構造方法1show01();}private static void show01() {File f1=new
  • 零基礎java入門教程函數function實例化格式案例void返回值說明
    java基礎自學入門:函數:定義在類中的具有特定功能的一段獨立小程序有時候我們函數也稱為方法,平時我們聽到的函數也就是方法,方法也是函數,每個人的叫法不同,所以這裡要切記。老程式設計師別露餡喲。由圖1演變出函數模塊功能修飾符public static .public可以不寫,static一定要用調用被靜態修飾的內容.整數類型int獨立的功能,獨立的封裝空間。
  • Java內部類新解,你沒有見過的船新版本
    特殊之處主要在於語法使用上,實質功能是差不多的。 官方 是這樣解釋的:Nested classes are divided into two categories: static and non-static. Nested classes that are declared static are called static nested classes.
  • Java之抽象方法的使用與及接口中抽象方法的簡單介紹
    public interface 接口名稱{//接口內容}備註:換成關鍵字interface之後,編譯生成的字節碼文件仍然是:.java-->.class接口中包含的內容有>:常量,抽象方法,默認方法,靜態方法,私有方法接下來,小編要講的是,接口中抽象方法的定義和使用,首先是抽象方法的定義,格式如下:public abstract 返回值類型 方法名稱(參數列表){方法體}(接口當中的默認方法
  • Java基礎,類的繼承,粗略的理解希望對大家有所幫助!
    Java基礎:繼承讀者老爺們大家好,今天圖圖帶大家了解一下java基礎裡的繼承。首先確定一下我們今天的學習的三個目標。第一個是類的繼承;第二個是訪問控制權限;第三個方法重寫(覆蓋)override。好滴,話不多說,讓我們快樂的投身知識的海洋裡吧!
  • 程式設計師:java單例模式,為什麼要加雙重鎖?為什麼要加volatile?
    SingleObject 類有它的私有構造函數和本身的一個靜態實例。SingleObject 類提供了一個靜態方法,供外界獲取它的靜態實例。SingletonPatternDemo,我們的演示類使用 SingleObject 類來獲取 SingleObject 對象。
  • 2020年Java基礎高頻面試題匯總
    弱引用弱引用就是只要JVM垃圾回收器發現了它,就會將之回收,使用方式:WeakReference<String> wrf = new WeakReference<String>(str);可用場景
  • 程式設計師:深入理解JVM,從JVM層面來講Java多態
    在Java語言中符合「編譯期可知,運行期不可變」這個要求的方法,主要包括靜態方法和私有方法兩大類,前者與類型直接關聯,後者在外部不可被訪問,這兩種方法各自的特點決定了它們都不可能通過繼承或別的方式重寫其他版本(static修飾的靜態方法可以重載,能被子類繼承,但不能被重寫),因此它們都適合在類加載階段進行解析。
  • 你知道java反射機制中class.forName和classloader的區別嗎?
    我們寫好的程序,然後run運行,過程可以直接看下面這張圖:往細了看大致分為5個階段:(1)加載:java類運行時候會生成一個class字節碼文件,加載的過程就是去我們的作業系統尋找這個class文件。(2)連結:這個過程就是把class文件加載到java虛擬機。