java中this關鍵字
1、我們瞭解this作用之前,先了解this是什麼?在記憶體方面是怎樣的?
- 其實呢this是個變數,是個引用,儲存當前物件的記憶體地址,指向自身。this代表的就是“當前物件”;它是儲存在堆記憶體中當前物件的內部
- 一個物件一個this
在記憶體中的存在:
需要注意的是圖中只畫了類中的一個物件。我們再建立個物件,也是一樣的,this還在物件內部,只不過這個物件的地址改變了而已,當然this所指的地址也會改變,假如這裡我們建立了個物件為c2,那this所指的地址和c2也是一樣的,這個物件地址是什麼,this所指的地址就是什麼。
2、this只能使用在例項方法中,誰呼叫這個例項方法,this就是誰,所以this代表的是:當前物件,這裡我們定義了一個People類,並對屬性進性封裝,已經構造方法:
public class PeopleTest{
public static void main(String[] args){
People people = new People();
people.setName("李四");
System.out.println(people.getName);
}
}
class People {
private String name;
public People() {
}
public People(String name) {
this.name = name;
}
public String getName() {
return name;
}
/*public void setName(String c){
name = c;
}
public void setName(String name){
name = name;
}
*/
public void setName(String name) {
this.name = name;
}
}
我們只對get和set方法進行解釋,構造方法中也是同樣的;
<1>、我們可以看到兩種set方法都可以傳入引數,可對name進行修改,可是第一種傳入String c明顯的不合適,這個c到底是什麼,我們很明確的知道,我們需要傳入的name,這樣傳參肯定會造成誤解
<2>、而第二種使用 name = name的方式,這樣編譯器會直接給警告,由於java語言的就近原則,這個區域性變數name傳入的就不是例項變數name,我們執行起來,可以發現並沒有對例項變數name進行賦值;
<3>、接下來也是最平常的set方法,this.name = name;在第二種name = name的方式中並沒對例項變數name進行賦值,主要是是沒有物件的參與,setget方法都是例項方法,那我們就在需要賦值的例項變數前加this. 的方法,這樣表示當前物件的name,我們再測試類中建立物件,呼叫set方法,就知道了當前的物件是people,形象的說this.name 就相對於people.name了,只要建立物件對例項變數name進行賦值,this都會指向當前物件,建立一個people物件那麼這個name就是people物件的,建立一個animal物件那這個name就是animal物件的name
3、 有的時候this也是可以省略的,我們再來看一種情況,再上面的程式當中加入跑步的方法。
public void run(){
System.out.println(name+"在跑步");
}
這裡的name裡並沒有this,按理來說應該有物件的參與,通過引用. 的方式來訪問name,不過這裡把this省略了而已,我們不省略this也是可以的
public void run(){
System.out.println(this.name+"在跑步");
}
這樣也可正常執行,在我們建立物件呼叫run()方法,run()就已經知道預設呼叫它的是該物件,所以這裡的this也就會被省略。
4、this代表當前物件,靜態方法中不存在當前物件。
static關鍵字修飾的變數是靜態變數,修飾的方法是靜態方法,靜態方法的呼叫不許要物件的建立,直接使用類名.方法名的方式訪問,static關鍵字再之前的部落格也進行了詳細解釋。我們再把之前的run()方法該文靜態的方法,
這裡name就出現錯誤提示了,因為靜態方法中不需要物件的參與,我們這裡的name物件參與的,應該是this.name的格式,只不過我們把this省略了,如果我們需要呼叫這個name,就需要建立物件來呼叫
如圖
通過上述的幾個例子當中國可以發現:在例項方法中,或者構造方法中,為了區分區域性變數和例項變數,這種情況下this是不能省略;
6、this()
我們來看接下來的題目要求,就之前的日期類,有兩個構造方法,無參和有參的,需要再無參的構造方法中進行初始化賦值,分別是1970年1月1日;我們來看程式碼片段:
這樣寫完全沒沒問題,接下來我們對程式碼進行優化:
通過this呼叫本類的構造方法,這樣方便了很多
結論:
this除了使用在例項方法中,也可以使用在構造方法中;通過當前的構造方法去呼叫另一個本類的構造方法,
但是在呼叫無參構造方法是,只能呼叫本類的構造方法,並且this()只能出現在無參構造方法的第一行;
相關文章
- Java中final關鍵字Java
- java中的instanceof關鍵字Java
- java中的static關鍵字Java
- Java中this與super關鍵字Java
- Java中transient關鍵字的作用Java
- java中static關鍵字的作用Java
- 在Java中this關鍵字的使用Java
- Java中final關鍵字如何使用?Java
- Java中的各種關鍵字Java
- java中的static和final關鍵字Java
- Java 中 instanceof 關鍵字 object instanceof ClassJavaObject
- [java]transient關鍵字Java
- Java native關鍵字Java
- Java Final關鍵字Java
- 深入理解Java中的volatile關鍵字Java
- Java 中 final 關鍵字有什麼用Java
- Java volatile關鍵字作用Java
- Java volatile關鍵字解析Java
- Java 關鍵字之 finalJava
- Java 的 static 關鍵字Java
- Java關鍵字(八)——synchronizedJavasynchronized
- [java基礎]之JAVA關鍵字Java
- JAVA面試題 淺析Java中的static關鍵字Java面試題
- 併發系列之「Java中的synchronized關鍵字」Javasynchronized
- java基礎-關鍵字finalJava
- Java™ 教程(使用super關鍵字)Java
- Java併發--final關鍵字Java
- Java進階——super關鍵字Java
- Java關鍵字volatile的理解Java
- Java面試題:請談談Java中的volatile關鍵字?Java面試題
- scala中yield關鍵字
- Java 中的 transient 關鍵字和物件序列化Java物件
- DM 關鍵字、遮蔽關鍵字
- Java併發—— 關鍵字volatile解析Java
- Java併發——關鍵字synchronized解析Javasynchronized
- 多多關鍵字API php java PythonAPIPHPJavaPython
- java oop 修飾符&關鍵字JavaOOP
- java併發之volatile關鍵字Java