Java 中static和非static有什么區(qū)別

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)系如圖所示:

實(shí)例變量和靜態(tài)變量.png

可以看到,靜態(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)變量,可以使代碼更加清晰。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容