查看完整版本: 有個java ,public and static 問題
頁: [1]

b2581167 發表於 2018-4-16 01:30 AM

有個java ,public and static 問題

本帖最後由 b2581167 於 2018-4-16 01:30 AM 編輯

最近在學java因為之前已經學過c跟c++,
所以有先入為主的觀念,害我有點混淆
以下允許我用c的講法……
第一個問題是java每個函數都是被類別包著,
為什麼類別也可以定義static?
他有定義跟沒定義的差別是?
而且不只類別可以定義連函數也可以?
我知道在c裡面static 就很像全域的意思
但是在c裡面static只限用在變數上
我不了解java什麼都可以加static的差別在哪
一般來說控制類別中的函數能不能給外面使用
不是看public 或private 嗎?那加static 的意義是?
第二就是在c中有public  private  protected
但有聽說java中有四種 他們的差異是?
那他默認是哪一種?

...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div><div></div>

codewice 發表於 2018-4-17 01:57 AM

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

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

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

System.out.println(Foobar.sName);  // "Foobar", 即使沒有產生任何 instance 也能直接拿這個類別的變數來用
Foobar a = new Foobar();
Foobar b = new Foobar();
a.mName = "A";
b.mName = "B";        System.out.println(a.sName); // "Foobar"
System.out.println(b.sName); // Foobar
System.out.println(a.mName); // "A"
System.out.println(b.mName); // "B"
a.sName = "AAA";
System.out.println(a.sName); // "AAA"
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 檔案裡面而已。...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

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<br><br><br><br><br><div></div>
頁: [1]