重複の可能性:
これとJavaのスーパー
私は開発に不慣れです。私がまだ理解できないことは、これとスーパーキーワードの違いです。何かお答えがありましたら、よろしくお願いします。ありがとう。
重複の可能性:
これとJavaのスーパー
私は開発に不慣れです。私がまだ理解できないことは、これとスーパーキーワードの違いです。何かお答えがありましたら、よろしくお願いします。ありがとう。
インスタンスメソッドまたはコンストラクター内では、これは現在のオブジェクト(メソッドまたはコンストラクターが呼び出されているオブジェクト)への参照です。これを使用して、インスタンスメソッドまたはコンストラクター内から現在のオブジェクトの任意のメンバーを参照できます。
メソッドがそのスーパークラスのメソッドの1つをオーバーライドする場合、キーワードsuperを使用してオーバーライドされたメソッドを呼び出すことができます。スーパーを使用して非表示のフィールドを参照することもできます(ただし、フィールドを非表示にすることはお勧めしません)。
super
現在のクラスが拡張する基本クラスを指します。this
現在のクラスインスタンスを参照します。
したがって、Parent
extendsChild
を使用してを作成するとnew Child()
、superはParent
クラスを参照し(コンストラクターでのような操作を行うとsuper()
親のコンストラクターが呼び出されます)、これはでChild
作成した実際のインスタンスを参照しますnew
。
Super
クラスが拡張するスーパークラスを指します。 this
クラスの現在のインスタンスを参照します。
これらの概念は、新しい開発者にとって混乱を招く可能性があります。クラスの拡張(継承)について学習すると、より明確になります。変数またはメソッドを参照するときに、あいまいになることがあります。たとえば、メソッドでクラス変数名を繰り返した場合、コンパイラは参照している変数を認識しないため、これを使用して自分を指定できます。現在のクラスの変数(ローカル変数ではない)を参照します。以下はあいまいです(そして間違っています):
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
の親を参照するために使用します。
このキーワードは、その時点での現在のインスタンスを参照します。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.
}
}
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
を参照します。ここで、はコンストラクターに渡されるパラメーターです。これは、名前のあいまいさを解決するために使用されます。同じことが。にも当てはまります。x
x
this
x
y
クラスPoint3D
では、メソッドtoString()
はスーパークラスの戻り値を使用しPoint
て独自の戻り値を生成します。
this:は、そのクラスのメソッド内の現在のオブジェクトへの参照です。thisキーワードを使用して、現在のオブジェクトの任意のメンバーを参照します。
super:は、クラスがextendキーワードを介して拡張する場合の派生クラスの親であり、キーワードsuperを使用してオーバーライドされたメソッドを呼び出すことができます。スーパーを使用して、保護されたフィールドを参照することもできます。