2011-01-21 9 views
2

は、女の子を私のcoolMethodを確認してください:私のcoolMethodを呼び出して、同じことを行う方法、の完全な私の動物園クラスを拡張javaのこのスーパーキーワードとの違いは何ですか?

package zoo; 

public class Zoo { 

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

} 

マイ武クラス、。

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(); 
    } 

} 

ご覧のとおり、4回の呼び出しで同じ結果が得られます。私はJavaを学んでいて、 "this"を使った例で練習しましたが、他の場所では "super"の使用を見ていましたので、テストしました。どうしてこれなの? thisとsuperキーワードの主な違いは何ですか?

+0

を呼び出すために使用することができますか?過度に非難されるが、良い本/参照は、私は、「Javaのsuperキーワード」を検索し(http://download.oracle.com/javase/ [キーワードのスーパーを使用する]について言われた:)長い道を行くわけではありませんチュートリアル/ java/IandI/super.html)Javaチュートリアル。なぜ同じ結果が得られるのか: 'coolMethod'を' Moo'に追加し、別の文字列を返すようにしてください。 、私が使用している –

+0

は「SCJPはJava 6の研究ガイドのために」 – overmann

答えて

2

クールたとえば、overmann :)

ここでは一例です... 2つのソースファイルいる - LevelSup.java

保存いくつかのフォルダに2を拡張しLevelSub.javaは、「のjavac LevelSubを使用してコンパイル.javaファイル 『および実行」(あまりにも、JavaのLevelSub『LevelSup.javaを 『それはコンパイルする必要があることを』拡張コンパイラはから知っているだろう』)』。ソースコード内のコメントは、あなたに違いを教えてくれるはずです。

変数とメソッドに名前の衝突がある場合に、これとスーパーが使用されます(スーパークラスやサブクラス、メソッド本体で同じ名前が使用されている、スーパークラスからメソッドを呼び出すなど)オーバーライドされます)。 "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); 
    } 
} 
+0

Senguptaありがとう、これはGoogleで探すのがとても簡単でしたが、私の手は、それを見て、それに基づいて私を助けさせるかもしれません。今、これは皆さんのおかげで、より明確な感謝を得ることができません。 – overmann

2

coolMethodを上書きしておらず、継承しています。
これにより、同じメソッドが呼び出されます。
coolMethodを上書きし、何が起こるかをご覧ください。
superは、baseのメソッドを呼び出します。
thisこのオブジェクト

+0

は、あなたが見る、たぶん私はより明確にしてきたはずです、あなたにみんなありがとう、私は、Javaを学んでいると私は同じ方法の作業を取得するには3つの方法をテストしたいですちょうどキックのために。しかし、私はスーパーやこれで私のcoolMethodを呼び出すのが同じように働く理由を知りたかった。 – overmann

+0

'super'は基本クラスのメソッドを呼び出します。あなたのケース '拡張Zoo'.'Moo''でcoolMethod'では 'Zoo'はZoo''の 'coolMethod'を継承し、あなたがMoo''でそれを再定義していないので、それは本質的に 'coolMethod'に解決しますあなたが 'this'の代わりに' super'を使用したかのように 'Zoo'を呼び出します。 'Moo'で' coolMethod'をオーバーライドした場合、 'super'は' Moo'オブジェクトで再定義されたメソッドを呼び出すのに対し、 'super'は基本クラスでメソッドを呼び出します。わかりましたか? – Cratylus

+0

はい、ありがとう! – overmann

4

でメソッドを呼び出します。あなたは一つだけcoolMethodを持っているので、それは関係なく、修飾子の、それぞれの場合に呼ばれています。ただし、メソッドをMooで無効にすると、この

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

ようにあなたはsuper.coolMethod()への呼び出しに対してcoolMethod()this.coolMethod()への呼び出しの違いに気づくでしょう。

1

この場合、何も変わりません。あなたはMooクラスでcoolMethodを上書きした場合

しかし、superバージョンへの呼び出しがZooクラスのバージョンを呼び出しますが、他のすべてのバージョンは、新しいオーバーライドされたものを呼び出します。

1

、違いを参照してくださいあなたのサブクラス武にcoolMethodを上書きする:

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

私はあなたを示唆して、あなたの武クラスでcoolMethodを作成するには、動物園のクラス

中1から、別の何かを印刷しています
2

"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」は動物園で定義され、このコードが、それは、それが自然に武によって継承されるようにパブリックメソッドです。だから、あなたがMooクラスの中にいて、this.coolMethodまたはsuper.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」を実行してみて、私はあなたが差がはるかに簡単にわかりますと思う:物事がはるかに面白くどこにこのように、あなたのサブクラスでcoolMethodをオーバーライドする場合です。

+0

どのような答え、ありがとう非常に、compadre。 – overmann

+0

+1「doIt」を「dolt」と読みましたが、なぜ「dolt」という名前を付けたのだろうと思っていました – Davy8

3

this

superが&変数

this()をすることができ、スーパークラスmetodsにアクセスするために使用することができ、現在のオブジェクトを指し示すことができます同じクラスのコンストラクタを呼び出すために使用されます

super()は、スーパークラスのコンストラクタ使用されているチュートリアル(S)

Difference with examples

関連する問題