程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java編程那些事兒65——static修飾符

Java編程那些事兒65——static修飾符

編輯:關於JAVA

修飾符的作用是讓被修飾的內容具備特定的功能,在程序中合理使用修飾符可以在語法和功能上實現很多需要的效果。Java語言中的修飾符主要有5個:static、final、native、abstract和synchronized。這裡首先講解static、final和native的作用。 8.7.1 static修飾符

static關鍵字的中文意思是靜態的,該修飾符可以修飾成員變量,成員常量和成員方法。使用該關鍵字修飾的內容,在面向對象中static修飾的內容是隸屬於類,而不是直接隸屬於對象的,所以static修飾的成員變量一般稱作類變量,而static修飾的方法一般稱作類方法。另外,static還可以修飾代碼塊,下面進行詳細的介紹。

8.7.1.1 靜態變量

static修飾的變量稱作靜態變量。靜態變量和一般的成員變量不同,一個類在加載到內存時,靜態變量只初始化一次,也就是說所有對象的靜態變量在內存中都只有一個存儲位置,每個對象中的靜態變量都指向內存中同一個地址,它是在所有的對象之間共享的數據。另外靜態變量在引用時比較方便。所以一般在需要實現以下兩個功能時使用靜態變量:

l 在對象之間共享值時

l 方便訪問變量時

下面首先說一下非靜態變量(沒有static修飾符修飾的成員變量)在內存中如何存儲的。示例代碼如下:

//文件名Box.java
public class Box{
 int length;
 int width;
 int height;
 public Box(int l,int w,int h){
  length = l;
  width = w;
  height = h;
 }
}
//文件名TestBox.java
public class TestBox{
 public static void main(String[] args){
  Box a = new Box(10,20,30);
  Box b = new Box(40,20,10);
 }
}

則對象a和對象b在內存中的存儲格式如下圖所示:

對象a                 對象b

10 20 30 length width height 40 20 10 length width height   

從上面的圖可以看出,非靜態變量的值在每個對象中都有獨立的存儲空間,不同對象間這些值之間沒有管理,也就是說每個對象都為內部的每個非靜態的變量分配獨立的存儲空間,所以每個對象中非靜態變量是隸屬於對象,也就是說在每個對象中可能是不同的。

簡單介紹了非靜態變量在對象中的存儲以後,下面再來看一下靜態變量是如何進行存儲的。示例代碼如下:

//文件名StaticVar.java
public class StaticDemo{
 static int m;
 int n;
 char c;
}
//文件名TestStaticVar.java
public class TestStaticVar{
 public static void main(String[] args){
  StaticVar sv1 = new StaticVar();
  StaticVar sv2 = new StaticVar();
 }
}

則對象sv1和對象sv2在內存中存儲的格式如下圖所示:

對象sv1               對象sv2

0 m 0 n 0 c 0 n 0 c       

對於StaticDemo類型的對象sv1和sv2來說,由於使用默認的構造方法進行構造,所以每個成員變量都被初始化為對應數據類型的默認值,int的默認值為0,char的默認值為編號為0的字符,所以sv1和sv2對象中存儲的值如上圖所示。

而靜態變量的存儲和非靜態變量的存儲不同,在Java虛擬機內部,第一次使用類時初始化該類中的所有靜態變量,以後就不再進行初始化,而且無論創建多少個該類的對象,靜態變量的存儲在內存中都是獨立於對象的,也就是Java虛擬機單獨為靜態變量分配存儲空間,所以導致所有的對象內部的靜態變量在內存中存儲時只有一個空間。這樣就導致使用任何一個對象對該值的修改都是使該存儲空間中的值發生改變,而其它對象在後續引用時就跟著發生了變化。靜態變量就是使用這樣的方式在所有的對象之間進行數值共享的。

靜態變量在實際使用時,可以通過只存儲一次來節約存儲空間,這個特性導致在類內部定義的成員常量一般都做成靜態的,因為常量的值在每個對象中都是相同的,而且使用static修飾也便於對成員常量的引用。

在類外部訪問某類中靜態變量(常量)的語法格式為:

類名.成員變量(常量)

例如:

StaticDemo.m

這樣方便對於成員變量的訪問。當然,語法上也不禁止使用:對象.成員變量,這樣的語法格式進行訪問,但是一般不推薦這樣使用,而且有些類是無法創建對象的。

注意:static關鍵字不能修飾成員方法或構造方法內部的變量。

8.7.1.2 靜態方法

static修飾的方法稱作靜態方法。靜態方法和一般的成員方法相比,不同的地方有兩個:一是調用起來比較方便,二是靜態方法內部只能使用靜態的成員變量。所以一般靜態方法都是類內部的獨立的功能方法。例如為了方便方法的調用,Java API中的Math類中所有的方法都是靜態的,而一般類內部的static方法也是方便其它類對該方法的調用。

示例代碼如下:

//文件名MyMath.java
public class MyMath{
 public static int max(int a,int b){
  return (a > b ? a : b);
 }
}
//文件名TestMyMath.java
public class TestMyMath{
 public static void main(String[] args){
  int m = 10;
  int n = 20;
  int k = MyMath.max(m,n);
 }
}

靜態方法在類的外部進行調用時不需要創建對象,使用類名.方法名(參數)這樣的語法格式進行調研,簡化了代碼的編寫。

使用靜態方法時,需要特別注意的是靜態方法內部使用該類的非靜態成員變量,否則將出現語法錯誤。

靜態方法是類內部的一類特殊方法,只有在需要時才將對應的方法聲明成靜態的,一個類內部的方法一般都是非靜態的。

8.7.1.3 靜態代碼塊

靜態代碼塊指位於類聲明的內部,方法和構造方法的外部,使用static修飾的代碼塊。靜態代碼塊在該類第一次被使用時執行一次,以後再也不執行。在實際的代碼中,如果需要對類進行初始化的代碼,可以寫在靜態代碼塊的內部。

示例代碼如下:

//文件名StaticBlock.java
public class StaticBlock{
 static{
  System.out.println(“靜態代碼塊!”);
 }
}

靜態代碼塊是一種特殊的語法,熟悉該語法的特點,在實際程序中根據需要使用。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved