2016/4/30

static:Java為例

本篇參考   http://openhome.cc/Gossip/Java/Static.html


1
2
3
4
5


class Ball {
    double radius;
    final double PI = 3.14159;
    ...}


如果你建立了多個Ball物件,那每個物件都有自己的資料成員,如下圖:



PI明明是固定的,這樣豈不是浪費記憶體嗎?這時可用static


1
2
3
4
5


class Ball {
    double radius;
    static final double PI = 3.141596;
    ...}


PI就不會被物件個別擁有,而會屬於class,如下圖:


被宣告成static成員,將類別名稱作為名稱空間,現在可以這樣取得PI:

System.out.println(Ball.PI);

透過class名稱.operator,直接取得static成員



也可將method宣告成static:


1
2
3
4
5
6
7


class Ball {
    double radius;
    static final double PI = 3.141596;
    static double toRadians(double angdeg) { // 角度轉徑度
        return angdeg * (Ball.PI / 180);
    }}


現在可以透過class.operator來呼叫static的method

System.out.println(Ball.toRadians(100));

你可能會想說就算不用static也可以存取資料物件啊,像這樣:

1
2
3
4
5
6
7
8
9
10
11
12


class Ball {
    double radius;
    final double PI = 3.14159;
    double toRadians(double angdeg) { // 角度轉徑度
        return angdeg * (PI / 180);
    }}
public class Main {
    public static void main(String[] args) {
        Ball ball = new Ball();
        System.out.println(ball.PI);                // 極度不建議
        System.out.println(ball.toRadians(100));  // 極度不建議


看了原作者的說明,它只是什麼命名原則,但我還是不懂為何不能這樣new,要用static,只知道命名最好class名稱都首字大寫,

method名稱首字小寫



所以現在我們知道常用的System.out  System.in  就是static成員了

System.out.println(Math.PI);也是

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class ClassA {
  static void method1() {
    System.out.println("method1() in ClassA");
 }
  static void method2() {
    System.out.println("method2() in ClassA");
  }
}
class ClassB extends ClassA {
  static void method1() {
     System.out.println("method1() in ClassB");
   }
  static void method3() {
    System.out.println("method3() in ClassB");
   }
}
public class ClassC {
  public static void main(String[] args) {
    ClassA a = new ClassB();
    a.method1();  // method1() in ClassA
    a.method2();  // method2() in ClassA
    a.method3();  // compile-time error
   }
}
method1 method2 method3都屬static,和多行無關,編譯器直接使用靜態連結(static link),而不會留到執行期才動態地決定真正該呼叫的 method 為何。因為編譯器在編譯期就做必須決定 method, 所以編譯器完全依賴形式型態,這麼一來「a.method1()」等於是「ClassA.method1()」, 「a.method2()」等於是「ClassA.method2()」
static重點:

1.不能用this

2.只有static能用static

3.屬class層級擁有的成員

4.存取static資料成員語法  class名稱.變數名稱,存取static method語法  class名稱.method名稱(參數1,參數2)

5.static method不能直接用instance變數,與instance method,必須在static method中建立物件,並使用物件參考名稱才可用instance method與instance變數

6.instance method可直接用static method與static 變數







1 則留言:

  1. The King Casino | Situs Judi Slot Online Terbaik 2021
    Play ford fusion titanium online https://deccasino.com/review/merit-casino/ Pragmatic Play Slots https://vannienailor4166blog.blogspot.com/ at The King Casino - Member Baru & Terpercaya 2021! Rating: 98% · https://septcasino.com/review/merit-casino/ ‎240,388 votes

    回覆刪除