最近,朋友丟出來了一段Java代碼,這個程序的結果是什麼?為什麼會這樣?竟然說面試不過,這裡給淘汰了。
<code>package com.xttblog.demo;
class SuperClass {
void method() {
System.out.println("SuperClass::method");
}
void fun() {
System.out.println("SuperClass::fun");
this.method();
}
}
class SubClass extends SuperClass {
void method() {
System.out.println("SubClass::method: Begin");
super.fun();
System.out.println("SubClass::method: End");
}
}
class Test {
public static void main(String[] args) {
SubClass a = new SubClass();
a.method();
}
}/<code>
我可是新鮮的小白,雖然還沒面試,於是我看了看,不就是一個this嗎?
其實很容易知道,陷入了一個死循環。
運行的結果的順序其實很簡單,關鍵就是要理解this到底指著誰,this表示對當前對象的引用,也就是subclass對象
如果在new一個Superclass對象,bug就解決了
但是你真正瞭解過this嗎
this原理:
- 代表的是當前對象。
- this就是所在函數的所屬對象的引用。
簡單說,哪個對象調用了this關鍵字所在的函數,this就代表哪個對象。
this有下面3中用法
引用成員變量
表示對當前對象的引用!
<code>/**
* @author: 毛利
*/
public class Person1 {
private int age;
private String name;
void Sayhello(Integer age ,String name){
//將局部變量的值傳遞給成員變量
this.name = name;
this.age = age;
System.out.println("我的名字是" + this.name + ",年齡是" + this.age);
}
public static void main(String[] args) {
Person1 p = new Person1();
p.Sayhello(20,"maoli");
}
}
/<code>
表示用類的成員變量,而非函數參數
方法名來初始化對象,毛利到底 是19還是20呢?
<code>/**
* @author: 毛利
*/
class Person {
private int age = 19;
public Person(){
System.out.println("初始化年齡:"+age);
}
public int GetAge(int age){
this.age = age;
return this.age;
}
}
public class test1 {
public static void main(String[] args) {
Person maoli = new Person();
System.out.println("maoli's age is "+maoli.GetAge(20));
}
}/<code>
在Java中this這個關鍵字可以實現類屬性的調用,類方法的調用,表示當前對象
<code>初始化年齡:19
maoli's age is 20/<code>
毛利當然是20,奔2的人
這個例子和草神的bug一樣的道理
形參與成員名字重名,用 this 來區分:
可以看到,這裡 age 是 GetAge 成員方法的形參,this.age 是 Person 類的成員變量。
還有就是注意:this不能用在static方法中!
這跟jvm聯繫到一起
在靜態函數是存在與類(class)一級,並不是對象(object)的一部分,所以也就沒有this指針。因此,在靜態方法中使用this是錯誤的。
當靜態方法加載進內存進棧時,如果在靜態方法中有this 和 super 關鍵字時,this和super也被加載到了內存,但是這個時候並沒有對象的引用,this和super沒有初始化,所有編譯會報錯。
this參數類型的構造器
如果為this提供了參數列表,那麼即意味著對符合該參數列表的構造器的調用。 通過this關鍵字調用構造器有以下幾條規範:
- 不能在普通方法中調用,只能在構造器中調用。
- 一個構造器中只能調用一次。
- 只能在構造器的第一行調用。
<code>/**
* @author: 毛利
*/
public class test {
public test(int a, int b, int c) {
// 構造器的調用必須在一個構造器的第一行
this(a, b);
//this(a); //此行報錯,意味著在一個構造器裡面只能調用一次構造器。
System.out.println(b);
}
public test(int a, int b) {
this(a);
System.out.println("a="+a);
}
public test(int a) {
System.out.println("調用成功!");
System.out.println(a);
}
public static void main(String[] args) {
new test(1, 2, 3); //調用成功,意味著雖然一個構造器中只能調用一次其它構造器,但卻可以通過“一個調一個”的方式調用多個構造器。
}
}
/<code>
<code>調用成功!
1
a=1
2/<code>
其實this主要要三種用法:
1、表示對當前對象的引用!
2、表示用類的成員變量,而非函數參數,注意在函數參數和成員變量同名是進行區分
3、用於在構造方法中引用滿足指定參數類型的構造器(其實也就是構造方法)。但是這裡必須非常注意:只能引用一個構造方法且必須位於開始!
閱讀更多 Python之王 的文章