[英]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()
。
你沒有覆蓋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.