0

重複の可能性:
これとJavaのスーパー

私は開発に不慣れです。私がまだ理解できないことは、これとスーパーキーワードの違いです。何かお答えがありましたら、よろしくお願いします。ありがとう。

4

7 に答える 7

6

this

インスタンスメソッドまたはコンストラクター内では、これは現在のオブジェクト(メソッドまたはコンストラクターが呼び出されているオブジェクト)への参照です。これを使用して、インスタンスメソッドまたはコンストラクター内から現在のオブジェクトの任意のメンバーを参照できます。

super

メソッドがそのスーパークラスのメソッドの1つをオーバーライドする場合、キーワードsuperを使用してオーバーライドされたメソッドを呼び出すことができます。スーパーを使用して非表示のフィールドを参照することもできます(ただし、フィールドを非表示にすることはお勧めしません)。

于 2012-04-14T16:41:56.027 に答える
1

super現在のクラスが拡張する基本クラスを指します。this現在のクラスインスタンスを参照します。

したがって、ParentextendsChildを使用してを作成するとnew Child()、superはParentクラスを参照し(コンストラクターでのような操作を行うとsuper()親のコンストラクターが呼び出されます)、これはでChild作成した実際のインスタンスを参照しますnew

于 2012-04-14T16:42:18.627 に答える
1

Superクラスが拡張するスーパークラスを指します。 thisクラスの現在のインスタンスを参照します。

于 2012-04-14T16:42:31.210 に答える
1

これらの概念は、新しい開発者にとって混乱を招く可能性があります。クラスの拡張(継承)について学習すると、より明確になります。変数またはメソッドを参照するときに、あいまいになることがあります。たとえば、メソッドでクラス変数名を繰り返した場合、コンパイラは参照している変数を認識しないため、これを使用して自分を指定できます。現在のクラスの変数(ローカル変数ではない)を参照します。以下はあいまいです(そして間違っています):

class Bike
{
    int speed = 10;
    public setSpeed(int speed)
    {
        speed = speed;
    }
}

コンパイラーはあなたが何を意図していたのかわからず、おそらく(新しい開発者にとっては)不可解なエラーメッセージであなたを侮辱するでしょう。次のように使用thisすると、コンパイラに「メソッドレベルの変数ではなく、クラスレベルの変数を参照している」と通知されます。

class Bike
{
    int speed = 10;
    //Constructors and shiz
    public void setSpeed(int speed)
    {
        this.speed = speed;
    }
}

(実際には、この方法で変数名を複製するべきではありません!)要約thisすると、CURRENTクラスを参照していることをコンパイラーに通知します。super親メソッドをオーバーライドするオプションが登場するため、クラスを拡張する(親またはクラスの機能を継承する)と、さらにあいまいさが生じる可能性があります。

class Bike
{
    public Bike()
    {}

    public void printSpeed()
    {
        System.out.println("This generic bike can go 10 m/s!!");
    }
}

より具体的なタイプの自転車を導入して自転車クラスを拡張する場合は、printSpeedメソッドをオーバーライドして、次のように光沢のある新しい自転車の速度を指定できます。

class MountainBike extends Bike
{
public MountainBike() {}

public void printSpeed()
{
    System.out.println("WHOAAAH!! MOUNTAIN BIKE GOES 100 m/s!!");
}

public void printGenericSpeed()
{
    super.printSpeed();
}
}

super.printSpeed()コンパイラに親クラスからこのメソッドを実行するように指示するため、を呼び出すsuper.printSpeed()と実際printSpeed()にはBikeクラスのメソッドが呼び出されます。次のコード:

public static void main(String args[])
{
    MountainBike mb = new MountainBike();
    mb.printSpeed();
    mb.printGenericSpeed();
}

印刷します

WHOAAAH!! MOUNTAIN BIKE GOES 100 m/s!!
This bike can go 10 m/s!!

メソッドをオーバーライドしなかった場合printSpeed()、以下を呼び出すとprintSpeed()、Bikeクラスのメソッドが呼び出されることに注意してください。

public static void main(String args[])
{
    MountainBike mb = new MountainBike();
    mb.printSpeed();
}

印刷します

This bike can go 10 m/s!!

したがって、結論としてthis、現在のクラスを参照し、現在のクラスsuperの親を参照するために使用します。

于 2012-04-14T17:35:01.960 に答える
0

このキーワードは、その時点での現在のインスタンスを参照します。superキーワードは、現在のクラスの親/スーパークラスを参照します。

元:

class Test
{
     Test()
     {

     }
     Test(int i)
     {
           System.out.println("i=" + i);                
     }
}

 class Sample extends Test
 {

  int i;

  void Sample(int i)  //constructor 
  {
      this.i=i; // referring class version of the i using 'this'

      super(i); // passing parameter to Super/Parent class constructor. 
  } 

}
于 2012-04-14T17:02:13.407 に答える
0

Javaでは、キーワードthisは次のようにクラスの現在のオブジェクトを参照します。

class Point {
    public int x = 0;
    public int y = 0;

    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public String toString() {
       return x + "," + y;
    }
}


class Point3D extends Point {
    public int z = 0;

    public Point(int x, int y, int z) {
        super(x,y);
        this.z = z;
    }

    public String toString() {
       return super.toString() + "," + z;
    }
}

クラスのコンストラクターでは、クラスで定義されたものPoint this.xを参照します。ここで、はコンストラクターに渡されるパラメーターです。これは、名前のあいまいさを解決するために使用されます。同じことが。にも当てはまります。xxthisxy

クラスPoint3Dでは、メソッドtoString()はスーパークラスの戻り値を使用しPointて独自の戻り値を生成します。

于 2012-04-14T16:54:59.647 に答える
0

this:は、そのクラスのメソッド内の現在のオブジェクトへの参照です。thisキーワードを使用して、現在のオブジェクトの任意のメンバーを参照します。

super:は、クラスがextendキーワードを介して拡張する場合の派生クラスの親であり、キーワードsuperを使用してオーバーライドされたメソッドを呼び出すことができます。スーパーを使用して、保護されたフィールドを参照することもできます。

于 2012-04-14T16:56:42.797 に答える