朋友面試Java給淘汰了,原來竟然不懂Java中的this關鍵字

最近,朋友丟出來了一段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嗎?

其實很容易知道,陷入了一個死循環。

朋友面試Java給淘汰了,原來竟然不懂Java中的this關鍵字

運行的結果的順序其實很簡單,關鍵就是要理解this到底指著誰,this表示對當前對象的引用,也就是subclass對象

朋友面試Java給淘汰了,原來竟然不懂Java中的this關鍵字

如果在new一個Superclass對象,bug就解決了

朋友面試Java給淘汰了,原來竟然不懂Java中的this關鍵字

但是你真正瞭解過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是錯誤的。

朋友面試Java給淘汰了,原來竟然不懂Java中的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、用於在構造方法中引用滿足指定參數類型的構造器(其實也就是構造方法)。但是這裡必須非常注意:只能引用一個構造方法且必須位於開始!

朋友面試Java給淘汰了,原來竟然不懂Java中的this關鍵字


分享到:


相關文章: