Java 中static和非static有什么區(qū)別
JAVA中有關(guān)鍵字static,可以修飾方法或者字段。那么,static修飾的方法和字段,與沒有static修飾的方法和字段,有什么區(qū)別呢?
在JAVA中,大部分方法和字段都是沒有被static修飾的,也被稱為實(shí)例變量和實(shí)例方法,而被static修飾的則叫做靜態(tài)變量和靜態(tài)方法。
實(shí)例方法和實(shí)例變量
實(shí)例方法一般是一個(gè)new 出來的對象關(guān)聯(lián)的方法,只能在一個(gè)new出來的實(shí)例上使用,實(shí)例變量也是與new 出來的對象關(guān)聯(lián),不同的對象之間實(shí)例變量不互相影響。
實(shí)例方法內(nèi)部可以使用實(shí)例變量和靜態(tài)變量。
下面是一個(gè)相關(guān)示例:
// 類聲明
class ClassA {
// 實(shí)例變量
private int val;
public ClassA(int val) {
this.val = val;
}
// 實(shí)例方法
public void hello() {
// 使用實(shí)例變量
System.out.println("hello" + val);
}
}
// 使用
ClassA classA1 = new ClassA(1);
// 使用實(shí)例方法
// 輸出 hello1
classA1.hello();
ClassA classA2 = new ClassA(2);
// 輸出 hello2
// classA2里面的val變量是獨(dú)立的,與classA1無關(guān)
classA2.hello();
靜態(tài)方法和靜態(tài)變量
靜態(tài)變量和靜態(tài)方法是獨(dú)立存在的,并且每個(gè)類的靜態(tài)變量只有一份,不論這個(gè)類new了多少對象。所有new出來的對象都可以訪問到這一份數(shù)據(jù),對這份數(shù)據(jù)的任何修改,其他的實(shí)例都可以看到。
靜態(tài)方法由于是獨(dú)立存在的,不和任何一個(gè)實(shí)例關(guān)聯(lián),所以不能直接訪問實(shí)例變量和實(shí)例方法。如果想要訪問,只能通過某個(gè)實(shí)例的引用來訪問實(shí)例變量和實(shí)例方法。
以下面這個(gè)類為例,解釋一下上面的關(guān)系:
class ClassA {
// 實(shí)例變量
private int val;
private static int staticVal;
}
關(guān)系如圖所示:

可以看到,靜態(tài)變量和靜態(tài)方法是獨(dú)立的,各個(gè)實(shí)例只是單向地訪問他們。另外,他們不僅僅可以被這個(gè)類的實(shí)例訪問,也可以被其他類直接訪問。
靜態(tài)變量和靜態(tài)方法的訪問方式
靜態(tài)變量和靜態(tài)方法一般通過類名訪問,比如ClassA.staticVal,它可以被實(shí)例的引用訪問,但是一般不建議,比如:classA1.staticVal。使用類名訪問可以明確標(biāo)識出這是靜態(tài)變量,可以使代碼更加清晰。