伊莉討論區

標題: 有個java ,public and static 問題 [打印本頁]

作者: b2581167    時間: 2018-4-16 01:30 AM     標題: 有個java ,public and static 問題

提示: 作者被禁止或刪除 內容自動屏蔽
作者: codewice    時間: 2018-4-17 01:57 AM

首先,static 關鍵字的意義,Java 跟 C 很不一樣,所以你在 Java 裡面看見 static 的時候,先把 C 學到的東西忘掉吧。

Java 裡面有類別 Class 跟物件 Object 的概念,前幾天剛好有寫到:如果還不很清楚類別跟物件的差別,可以去想像紅龜粿的製作過程。class 就是那個模版,把麵糰塞進去敲一下就是一個物件(Object, 有時候叫實體 instance) 出來。

簡單來說 static 的變數跟著類別,非 static 的變數跟著物件。用上面的例子,static 的變數就是刻在模版上面
  1. class Foobar {
  2.     public static String sName = "Foobar";
  3.     public static String mName = "blah";
  4. }

  5. System.out.println(Foobar.sName);  // "Foobar", 即使沒有產生任何 instance 也能直接拿這個類別的變數來用
  6. Foobar a = new Foobar();
  7. Foobar b = new Foobar();
  8. a.mName = "A";
  9. b.mName = "B";        System.out.println(a.sName); // "Foobar"
  10. System.out.println(b.sName); // Foobar
  11. System.out.println(a.mName); // "A"
  12. System.out.println(b.mName); // "B"
  13. a.sName = "AAA";
  14. System.out.println(a.sName); // "AAA"
  15. System.out.println(b.sName); // "AAA"
複製代碼
public / private 用來修飾存取的權限,跟 static 與否是分開的概念。先把 static 的觀念釐清之後,對物件系統或類別繼承會比較清楚,這時候回頭看 public/protected/private 就會瞬間秒懂了。

「加 static 的差別在哪」大致上可以這麼回答:你如果覺得某個變數是某個類別,以及它所衍生出來的物件都要共有的,就把它加上 static 掛在類別上面。如果你覺得是每個衍生出來的徒子徒孫(物件)要分開區別的,就不要加上 static。

java 中的四種就是 public/protected/private/不寫用預設值,可以 google "Controlling Access to Members of a Class"

最後,在 inner/nested class 的情況下,才需要把它宣告成 static class。這已經是一個滿細微的議題了,我建議現在不要花時間理解這個 XD,我可以先說結論滿足好奇心:static class 的作用,跟一個獨立檔案的 class 檔是等價的,只是它寫的位置比較特別,寫在另外一個 class 檔案裡面而已。
作者: johnwanz    時間: 2018-4-19 12:48 PM

C, 有 static function. 可能只是你沒有用到.

不過, 與JAVA的static, 行為不同.
作者: lilyandtom    時間: 2018-5-16 06:45 PM

學到東西了!!謝謝分享~~
作者: zaq12345    時間: 2020-4-4 12:46 AM

兩個之間的差別,也可以參考這篇文章...
stackoverflow.com/questions/45560770/how-access-specifier-affect-static-methods




歡迎光臨 伊莉討論區 (http://www10.eyny.com/) Powered by Discuz!