Java --對象引用與對象的區別

最近作項目時,遇到了一個錯誤:java

public class UserJobFilteredServiceImpl implements UserJobFilteredService {
    
    //方法1,業務方法,實現service層的方法
    public void getAttention(int userId) {
        //這個方法裏面須要調用方法2,我採用以下方式調用,運行時報錯
        UserJobFilteredServiceImpl  userJobFilteredServiceImpl = new UserJobFilteredServiceImpl();
        userJobFilteredServiceImpl. checkValid;
        
        //改成以下方式調用,結果正確
        UserJobFilteredServiceImpl  userJobFilteredServiceImpl;
        userJobFilteredServiceImpl. checkValid;
        
        //被項目經理看到了,狠狠的批評了一頓,改成以下
        this. checkValid;   
    };
    
    //方法2,檢查方法,本類自帶的方法
    public void checkValid() {};
}


http://www.douban.com/note/338064780/
函數


爲了便於理解,先定義一個簡單的類this

class User{
    int userId;
    String userName;
    String age;
}

有了如上類,咱們即可以建立對象,以下:code

User user1 = new User();

建立對象的過程當中包含了以下幾個動做對象

1>右邊的new User,是以User類爲模板,在堆空間裏建立一個User類的對象。字符串

2>末尾()表示,在對象建立後,當即調用User類的構造函數,對剛生成的對象進行初始化。(構造函數是確定有的,若是咱們沒寫,系統會自動生成一個構造函數)get

3>左邊的User user1,是建立了一個User類的引用變量。io

4>=操做符使對象引用指向剛剛建好的User對象模板

其實,能夠將如上步驟分爲兩步class

1>User user1;

2>user1=new User();

這樣寫就比較清楚了,有兩個實體:一個是對象引用變量,一個是對象自己。

舉個很生動的例子:對象比如一個氣球,引用變量是一根繩,能夠用來系氣球。

若是隻是執行了第一條語句,還沒執行第二條,此時建立的引用變量user1還沒指向任何一個對象,它的值是null,引用變量是一根尚未繫上氣球的繩;當執行了第二句後,一隻新氣球作出來了,並被系在user1這根繩上。

再來一句

User user2;

此時又作了一根繩子,還沒繫上氣球,接着來一句

user2 = user1;

此時,發生了複製行爲。注意:對象自己沒有被複制,被複制的是對象引用。結果是user2也指向了user1所指向的對象,即兩根繩子都繫上同一個氣球了。

若是在建立一個對象

user2 = new User();

此時,引用變量user2改指向了第二個對象。

由如上例子,咱們得出結論:

1>一個對象引用能夠指向0個或1個對象(形象解釋:一根繩子能夠不繫氣球,也能夠系一個氣球)

2>一個對象能夠有N個引用指向它(解釋:能夠有N條繩子繫住同一個氣球)

若是再來一句

user1 =user2;

便是 user1也指向了第二個對象。這個是沒問題的,問題是第一個對象呢?沒有一條繩子繫住它,它可能會飛。正確說來,它已成爲jav的垃圾回收機制處理對象了,至於何時被回收,這處決於java回收機制了。

由此看來,下面的語句應該是不合法的,至少應該沒用

new User();

書上介紹說,它是合法的,並且是可用的,好比,咱們僅僅爲了打印而生成一個對象,就不須要引用變量來繫住它,最多見的就是打印字符串:

System.out.println("I am java");

字符串對象"I am java"在打印後就被丟掉。有人稱之爲這種對象爲臨時對象。

相關文章
相關標籤/搜索