最近作項目時,遇到了一個錯誤: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"在打印後就被丟掉。有人稱之爲這種對象爲臨時對象。