重點: 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;
}
}
沒有留言:
張貼留言
歡迎提供意見, 謝謝 (註 : 留言經過版主審核通過才會發布)