簡體   English   中英

java中這個和超級關鍵字有什么區別?

[英]What's the difference between this and super keywords in java?

檢查我的coolMethod,辣妹:

package zoo;

public class Zoo {

    public String coolMethod() {
        return "Wow baby!";
    }

}

My Moo Class,擴展了我的Zoo類,充滿了做同樣事情的方法,這就是調用我的coolMethod。

package zoo;

public class Moo extends Zoo {

    public void useAZoo(){

        Zoo z = new Zoo();

        System.out.println("A Zoo says: "+ z.coolMethod());
    }

    public void useMyCoolMethod(){

        System.out.println("My cool method says: " + super.coolMethod());

    }

     public void useMyCoolMethodAgain(){

        System.out.println("My cool method says: " + this.coolMethod()+ " (again)");

    }

    public void inheritMyMethod(){
        System.out.println("My inhertied method says: " + coolMethod());
    }

}

而我的主要內容是調用我的Moo類功能。

package javacert1;

import zoo.Moo;

public class Main {


    public static void main(String[] args) {

        Moo moo = new Moo();

        moo.useAZoo();

        moo.useMyCoolMethod();

        moo.useMyCoolMethodAgain();

        moo.inheritMyMethod();
    }

}

如您所見,所有這四個調用都得到相同的結果。 我正在學習Java,我練習了一個使用“this”的例子,但我曾在其他地方看到過使用“super”,所以我測試了它,結果也是如此。 為什么是這樣? this和super關鍵字之間的主要區別是什么?

由於您只有一個coolMethod ,因此無論使用何種限定符,都會在每種情況下調用它。 但是,如果你在Moo覆蓋你的方法,就像這樣

public class Moo extends Zoo {
    public String coolMethod() {
        return "Yeah dude!";
    }
    // the rest is the same as above...
}

你會注意到對coolMethod()this.coolMethod()的調用與對this.coolMethod()的調用之間的super.coolMethod()

this可以指向當前對象

super可用於訪問Super class metods和變量

this()可用於調用同一個類的構造函數

super()可用於調用超類構造函數

與例子不同

你沒有覆蓋coolMethod並繼承它。
結果它調用相同的方法。
覆蓋coolMethod ,看看會發生什么。
super會調用base的方法。
this將調用此對象中的方法

“this”指的是你所在的對象。“super”指的是這個對象的父級。 我認為你因為你正在進行的其他一些事情而錯過了這種差異。

例如,這段代碼


public class Zoo {

    public String coolMethod() {
        return "Wow baby!";
    }

}



public class Moo extends Zoo {

    public void useAZoo(){

        Zoo z = new Zoo();

        System.out.println("A Zoo says: "+ z.coolMethod());
    }

    public void useMyCoolMethod(){

        System.out.println("My cool method says: " + super.coolMethod());

    }

     public void useMyCoolMethodAgain(){

        System.out.println("My cool method says: " + this.coolMethod()+ " (again)");

    }

    public void inheritMyMethod(){
        System.out.println("My inhertied method says: " + coolMethod());
    }

}

方法“coolMethod”在Zoo中定義,但它是一個公共方法,因此它自然地被Moo繼承。 所以,當你在你的Moo課程中並且你調用this.coolMethod或super.coolMethod時,你最終會得到完全相同的東西。 事情變得更有趣的是,如果你覆蓋子類中的coolMethod,就像這樣:


public class Zoo {
    public String coolMethod() {
        return "Wow baby!";
    }
}

public class Moo extends Zoo {

    @Override
    public String coolMethod() {
        return "Moo baby!";
    }

    public void doIt() {
        System.out.println("Using super: " + super.coolMethod());
        System.out.println("Using this: " + this.coolMethod());
    }
}

在這種情況下嘗試執行“doIt”,我認為你會更容易看到差異。

很酷的例子,overmann :)

這是另一個例子......有2個源文件 - LevelSub.java,它擴展了LevelSup.java

將2保存在某個文件夾中,使用“javac LevelSub.java”編譯(編譯器將從“extends”知道它還必須編譯“LevelSup.java”),並運行“java LevelSub”。 源代碼中的注釋應該告訴您區別。

當變量或方法存在名稱沖突時使用this和super(例如,在超類/子類或方法體中使用相同的名稱,或者您想從已被覆蓋的超類中調用方法)。 “this”指的是當前的對象實例,“super”指的是它繼承的實例。 對於沒有名稱沖突,這個或超級前綴是多余的。

public class LevelSub extends LevelSup {
    protected String myName;

    public LevelSub (String myName) {
        super ("SuperClass");
        this.myName = myName;       // sets up instance variable
    }

    public void print () {
        System.out.println ("Hi, this is " + myName); // refers to this.myName
        System.out.println ("I am inherited from " + super.myName);
        System.out.println ("also known as " + defaultName); // gets from superclass
        super.print();           // overridden method of superclass
    }

    public static void main (String[] args) {
        new LevelSub("SubClass").print();
}}

和另一個來源......

public class LevelSup {
    // cannot be private if accessed by subclass
    protected String myName, defaultName = "TopLevel";

    public LevelSup (String name) {
        myName = name;      // this not required, no name clash
    }

    // cannot be private if accessed by subclass
    public void print () {
        System.out.println ("Hi, this is " + myName);
    }
}

在這種情況下,他們不會做任何不同的事情。

但是,如果您要在Moo類中覆蓋coolMethod ,則對super版本的調用將調用Zoo類中的版本,但所有其他版本將調用新的重寫版本。

要查看差異,請覆蓋子類Moo中的coolMethod:

public String coolMethod() {
    return "Moo baby!";
}

我建議你在Moo類中創建一個coolMethod,它打印出與Zoo類中不同的東西

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM