如果引用或轉貼,麻煩註明出處與本網誌連結,否則視為侵權。

2005年11月24日

[超基本] Java Static and non-Static


重點: Class 未被初始化(New instance)以前靜態方法(static method)只能存取靜態變數(static variable) 與區域變數 local variable
如下面範例 c2,c3,c4,c5無法被static method - main所存取


public class j0227 extends Object {
    static int c1=5; // 靜態變數
    public int c2=6;
    private int c3=7;
    final int c4=8;
    int c5=0;

    public static void main(String args[]) {
        int c6=4;  // 區域變數
        System.out.println(c1);
        System.out.println(c2);
        System.out.println(c3);
        System.out.println(c4);
        System.out.println(c5);
        System.out.println(c6);
    }
}


/*
產生compile error如下:
E:\JavaExercise\Fred>javac -d . j0227.java
j0227.java:10: non-static variable c2 cannot be referenced from a static context
System.out.println(c2);
^
j0227.java:11: non-static variable c3 cannot be referenced from a static context
System.out.println(c3);
^
j0227.java:12: non-static variable c4 cannot be referenced from a static context
System.out.println(c4);
^
j0227.java:13: non-static variable c5 cannot be referenced from a static context
System.out.println(c5);
*/

結果靜態方法main()只能讀取靜態變數C1與區域變數C6

 
同樣,Class 未被初始化(New instance)以前靜態方法static method(如main)不能直接呼叫非靜態方法non-static method。

public class TypeConversion {
    public static void main(String[] args){  // 靜態方法 main()
        int a = 10;
        long b = testConvert(a);    // 因為class TypeConversion 尚未初始化,因此會產生錯誤
        System.out.println(b);
    }

    long testConvert(long a) {  // 非靜態方法
        return a;
    }
}

靜態方法main()無法直接呼叫非靜態方法testConvert(),會產生錯誤

只要改成這樣就可以了
(1)
public class TypeConversion {
    public static void main(String[] args){
// 靜態方法 main()

         int a = 10;
        TypeConversion1 t = new TypeConversion(); // 加上這行用來產生初始化物件
        long b = t.testConvert(a);  // 呼叫此物件的方法
        System.out.println(b);
    }

    long testConvert(long a) {  // 非靜態方法
        return a;
    }

為該非靜態方法所在的class建立初始化物件,再用該物件呼叫該非靜態方法

 

(2)
public class TypeConversion {
    public static void main(String[] args){
        int a = 10;
        Conversion c = new Conversion();  // 建立另一個class "Conversion"的初始化物件
        long b = c.testConvert(a);   // 呼叫這個物件的方法
        System.out.println(b);
    }
}

class Conversion {    // 將該非靜態方法放在另一個class
    long testConvert(long a) {
        return a;
    }
}

沒有留言:

張貼留言

歡迎提供意見, 謝謝 (註 : 留言經過版主審核通過才會發布)