這一節我們來學習java語言中一個新的關鍵字就是static關鍵字。
當然對于每一個關鍵字,我們都要明確的是它有什么作用,怎么用。我們先來看一個例子:
~~~
class Person
{
String name;//姓名
String country = "中國";//國籍
public void printInfo()
{
System.out.println(name+":"+country);
}
}
class StaticTest
{
public static void main(String[] args)
{
Person p = new Person();
p.name = "小強";
p.printInfo();
Person p1 = new Person();
p1.name = "小明";
p1.printInfo();
Person p2 = new Person();
p2.name = "小紅";
p2.printInfo();
}
}
~~~
我們看看這個例子的運行結果:

我們會發現創建的三個對象中,姓名不同,但是國籍是相同的,那么對于很多個對象呢,國籍是相同的,那么我們就會想能不能把國籍獨立起來放到一個空間中供所有對象直接引用就可以了,而在對象中只需要有姓名這個屬性即可。
java語言給我了我們解決這個問題的途徑,那就是我們現在要說的static關鍵字。
很明顯,我們也就明確了static關鍵字的作用:就是把特有數據謎面所有對象都能共享的數據,也稱為對象的共享數據。
那么上面的代碼用static關鍵字進行優化:
~~~
class Person
{
String name;//姓名
static String country = "中國";//國籍
public void printInfo()
{
System.out.println(name+":"+country);
}
}
~~~
當然結果還是我們上面看到的結果,但是實際上,內存中會把country專門存放在一個獨立的空間中,而每個對象中都只有name屬性,這樣就節省了很多不必須的空間。
我們剛才看了static關鍵字的作用,那么下面我們再來看static關鍵字有哪些特點呢?
我們通過上面的例子,引申總結出以下四條特點:
**1.static既是關鍵字,也是修飾符,用于修飾成員。**這里的成員就是成員變量和成員函數。
**2.static關鍵字修飾的數據是共享數據。**我們前面看到了static的作用就是修飾共享數據,而對象中存儲的數據就是每個對象的特有數據。
**3.static關鍵字修飾的成員隨著類的加載而加載。**這是由于static修飾的數據要被所有對象共享,所以要在對象共享之前就存在,因此java語言就賦予了static這樣的功能。
**4.static關鍵字修飾的成員優先于對象存在,**因為static成員是隨著類的加載面存在的。
**5.static關鍵字修飾的成員多了一種調用方法,可以直接被類名調用,即:類名.靜態成員 的調用方式。**
比如上面的例子中,我們可以這樣調用:
~~~
class StaticTest
{
public static void main(String[] args)
{
Person p = new Person();
//p.name = "小強";
//p.printInfo();
System.out.println(Person.country);
}
}
~~~
結果:

我們看到staitc修飾的成員我們可以直接用類名去調用,也就是說我們不需要創建對象就可以直接調用,因為static成員隨著類的加載而存在,實現了相同數據被不多個對象的共享。
當然,既然我們的java是面向對象語言,如果我們把所有的成員都用static修飾,也就是說沒有對象了,那是一件多么可怕的事情呢。但是,不管怎么說,共享數據個人認為確實還是比較爽的。
- 前言
- 1.1 基本常識
- 1.2 Java語言概述
- 1.3 Java語言的環境搭建
- 1.4 Java程序開發之初體驗--Hello World
- 2.1 關鍵字
- 2.2 標識符
- 2.3 注釋
- 2.4 常量
- 2.5 進制掃盲
- 2.6 變量和數據類型(1)
- 2.7 變量和數據類型(2)
- 2.8 運算符
- 3.1 if語句
- 3.2 switch語句
- 3.3 while和do-while語句
- 3.4 for語句
- 3.5 for循環的嵌套
- 3.6 break語句與continue語句
- 4.1 函數的定義
- 4.2 定義函數的兩個明確
- 4.3 函數的內存加載過程
- 4.4 函數的重載
- 5.1 數組的定義
- 5.2 數組的內存分配及特點
- 5.3 數組操作中常見問題
- 5.4 數組常用操作(1)
- 5.5 數組常用操作(2)
- 5.6 二維數組
- 6.1 面向對象的概述
- 6.2 類與對象的關系
- 6.3 對象的內存體現
- 6.4 成員變量與局部變量
- 6.5 類類型參數與匿名對象
- 6.6 基本數據類型參數與引用數據類型參數的傳遞過程
- 6.7 封裝
- 7.1 構造函數概述與默認構造函數
- 7.2 構造函數與一般函數的區別
- 7.3 構造函數的重載
- 7.4 構造函數的內存加載
- 7.5 構造函數需要注意的幾個細節
- 7.6 this關鍵字的原理
- 7.7 this關鍵字的細節與應用
- 8.1 static關鍵字之特點
- 8.2 成員變量與靜態變量的區別
- 8.3 static關鍵字使用的注意細節
- 8.4 main函數的解析與細節
- 8.5 static關鍵字的使用場景
- 8.6 靜態的內存加載
- 8.7 靜態代碼塊
- 8.8 構造代碼塊
- 9.1 繼承
- 9.2 單繼承與多重繼承
- 9.3 子父類中成員變量特征體現