1. 程式人生 > 其它 >技術收藏之Shell中去除字串前後空格的方法

技術收藏之Shell中去除字串前後空格的方法

this代表它所在函式所屬物件的引用。簡單說:哪個物件在呼叫this所在的函式,this就代表哪個物件。

this關鍵字主要有以下三個作用:

this呼叫本類中的屬性,也就是類中的成員變數;
this呼叫本類中的其他方法;
this呼叫本類中的其他構造方法,呼叫時要放在構造方法的首行。(this語句只能定義在建構函式的第一行,因為在初始化時須先執行)
this關鍵字的基本用法
引用成員變數
public class Person{
String name; //定義成員變數name
private void SetName(String name) { //定義一個引數(區域性變數)name
this.name=name; //將區域性變數的值傳遞給成員變數
}
}

如上面這段程式碼中,Person類中有一個成員變數name,同時在SetName方法中有一個形式引數,名字也是name,然後在方法中將形式引數name的值傳遞給成員變數nam。

雖然我們可以看明白這個程式碼的含義,但是作為Java編譯器它是怎麼判斷的呢?到底是將形式引數name的值傳遞給成員變數name,還是反過來將成員變數name的值傳遞給形式引數name呢?也就是說,兩個變數名字如果相同的話,那麼Java如何判斷使用哪個變數?

此時this這個關鍵字就起到作用了。this這個關鍵字其代表的就是物件中的成員變數或者方法。也就是說,如果在某個變數前面加上一個this關鍵字,其指的就是這個物件的成員變數或者方法,而不是指成員方法的形式引數或者區域性變數。

因此在上述程式碼中,this.name代表的就是物件中的成員變數,又叫做物件的屬性,而後面的name則是方法的形式引數,程式碼this.name=name就是將形式引數的值傳遞給this指向物件的成員變數。

一看到這個this關鍵字就知道現在引用的變數是成員變數或者成員方法,而不是區域性變數。這無形中就提高了程式碼的閱讀性。

呼叫類的構造器方法
public class Person {
public Person(){ //無參構造器方法
this(“Hello!”);
}
public Person(String name){ //定義一個帶形式引數的構造方法
}
}

在上述程式碼中,定義了兩個構造方法,一個帶引數,另一個沒有帶引數。在第一個沒有帶引數的構造方法中,使用了this(“Hello!”)這句程式碼,這句程式碼表示什麼含義呢?在構造方法中使this關鍵字表示呼叫類中的構造方法。

如果一個類中有多個構造方法,因為其名字都相同,跟類名一致,那麼這個this到底是呼叫哪個構造方法呢?其實,這跟採用其他方法引用構造方法一樣,都是通過形式引數來呼叫構造方法的。

Tip:

語法限制:利用this關鍵字來呼叫構造方法,只有在無引數構造方法中第一句使用this呼叫有引數的構造方法。否則的話,翻譯的時候,就會有錯誤資訊。這跟引用成員變數不同。如果引用成員變數的話,this關鍵字是沒有位置上的限制的。

返回物件的引用
this關鍵字除了可以引用變數或者成員方法之外,還有一個關鍵的作用就是返回物件的引用。

/**
* 資源url
*/
public HttpConfig url(String url) {
urls.set(url);
//return this就是返回當前物件的引用(就是實際呼叫這個方法的例項化物件)
return this;
}

呼叫:

HttpConfig config = HttpConfig.custom();
config = config.url(url);
return this就是返回當前物件的引用(就是實際呼叫這個方法的例項化物件)

this關鍵字和super關鍵字
在JAVA類中使用super來引用父類的成分,用this來引用當前物件

如果一個類從另外一個類繼承,我們new這個子類的例項物件的時候,這個子類物件裡面會有一個父類物件。怎麼去引用裡面的父類物件呢?使用super來引用,this指的是當前物件的引用,super是當前物件裡面的父物件的引用

class FatherClass {
public int value;
public void f() {
value=100;
System.out.println("父類的value屬性值="+value);
}
}

class ChildClass extends FatherClass {
/**
* 子類除了繼承父類所具有的valu屬性外,自己又獨立聲明瞭一個value屬性,
*/
public int value;

/**
* 在子類ChildClass裡面重寫了從父類繼承下來的f()方法裡面的實現,即重寫了f()方法的方體。
*/
public void f() {
	super.f();//使用super作為父類物件的引用物件來呼叫父類物件裡面的f()方法
	value=200;//這個value是子類自己定義的那個value,不是從父類繼承下來的那個value
	
	System.out.println("子類的value屬性值="+value);
	System.out.println(value);//打印出來的是子類自定義的那個value的值,這個值是200
	
	/**
	* 打印出來的是父類裡面的value值,由於子類在重寫從父類繼承下來的f()方法時,
	* 第一句話“super.f();”是讓父類物件的引用物件呼叫父類物件的f()方法,
	* 即相當於是這個父類物件自己呼叫f()方法去改變自己的value屬性的值,由0變了100。
	* 所以這裡打印出來的value值是100。
	*/
	System.out.println(super.value);
}

}

/**

  • 測試類

*/
public class TestInherit {
public static void main(String[] args) {
ChildClass cc = new ChildClass();
cc.f();
}
}
屬性的區別:this訪問本類中的屬性,如果本類沒有此屬性則從父類中繼續查詢。super訪問父類中的屬性。
方法的區別:this訪問本類中的方法,如果本類沒有此方法則從父類中繼續查詢。super訪問父類中的方法。
構造的區別:this呼叫本類構造,必須放在構造方法的首行。super呼叫父類構造,必須放在子類構造方法首行。
其他區別:this表示當前物件。super不能表示當前物件
Tips:

在對擁有父類的子類進行初始化時,父類的構造方法也會執行,且優先於子類的建構函式執行;因為每一個子類的建構函式中的第一行都有一條預設的隱式語句super();
(如果子類的構造方法中沒有手動呼叫父類的構造方法,則會預設呼叫父類的無參構造方法)
this() 和super()都只能寫在建構函式的第一行;
this() 和super() 不能存在於同一個建構函式中。第一,this()和super()都必須寫在建構函式的第一行;第二,this()語句呼叫的是當前類的另一個建構函式而這個另一個建構函式中必然有一個父類的構造器,再使用super()又呼叫一次父類的構造器, 就相當於呼叫了兩次父類的構造器,編譯器不會通過;
this和super不能用於static修飾的變數,方法,程式碼塊;因為this和super都是指的是物件/例項。