[Java] 什麼是 Static 靜態類別、變數呢?

這是海芋最近碰到的一個小問題,為什麼在同一個類別中,Static Method 不能存取 Non-Static Method 呢?於是海芋就想啊想的,加上翻了一下資料,終於恍然大悟,就把他寫下來,避免將來忘記。

 

就程式語言的變數、類別來說,分為 Static 和 Non-Static 分為兩種不同的型態,則 Java 大概可以分為四種資料成員,分別為「class field」、「class method」、「instance filed」、「instance method」,而這麼多的型態,我們該如何去分辨呢?

 

在Java中,你可以把 Static 看成是類別所擁有的,而且是一開始就放置於記憶體中的,而 Instance 則是伴隨著物件產生而產生的。

所以,如果我們有下列片段程式碼:

public class CD
{
    public static double PI = Math.PI;
    public double area = 0;
    public CD()
    {
      .........
    }
}

 

 

而這段程式碼之中,因為PI這個變數是宣告為 Static 的,所以他是屬於 CD 類別,因此若您要在別的類別存取他,只要使用「CD.PI」即可,其中「CD為類別名稱」、「PI則為變數名稱」。

再來,因為 area 不為 static 物件,因此您只能建立物件,再存取他,所以您如果要在別的類別存取他,只能這樣使用。

CD cd = new CD()
double area = cd.area;

 

 

又倒底是什麼原因,讓 static method 只能存取 static method 呢?原因很簡單,因為在同一個類別之中,沒有建立自己的物件,既然沒有建立物件,那如何存取instance method呢?

 

在 instance method 中,則是可以存取到 static method,但是仍然要以「類別名稱.變數/method名稱」來存取,這點是相當重要的喔!

所以總結如下:

  1. 在同一個類別中,若有method宣告為static,則此method只能呼叫其它宣告為static的method。
  2. 在不同的類別中,若要呼叫其它class的static method/field,則使用下列程式碼:
    className.fieldName
    className.methodName
  3. 若要呼叫class method或是class filed,則需先建立物件,再使用下列程式碼:
    objectVariableName.fieldName
    objectVariableName.methodName
  4. 但是,在同一類別中,instance method和instance method間,可以互相呼叫。

文章打完也說完了,如果是您不是程式設計師,或許會看得霧殺殺!那就略過吧!
~( ̄▽ ̄)~(_△_)~( ̄▽ ̄)~(_△_)~( ̄▽ ̄)~!

Subscribe
Notify of
guest

6 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
奇奇
8 years ago

謝謝分享你的心得 寫得很棒 感謝!

劉効哲
8 years ago

寫的不錯喔~~~~很清楚!!

王佳斌
8 years ago

劉効哲你看得懂哦

孫小勛
7 years ago

淺顯易懂的說明~~大感恩~

sophie
7 years ago

那個…總結中”class method或是class filed”應該是”instance filed或是instance method”
因為class method、class filed是static,不一定要生成物件

jeff
jeff
7 years ago
Reply to  sophie

應是誤植,應為instance method, instance field