this
キーワードを使用してスーパークラス メソッドを取得するJava の例をいくつか見ました。例: this.superClassMethod()
. 通常は を使用しますsuper
。this
開発者が代わりに使用した理由を例で明確にするのを手伝ってくれる人はいsuper
ますか? ありがとうございました。
4 に答える
上記が呼び出し元のクラスでオーバーライドされるまで、 との間this.method()
に違いはありません。super.method()
method()
たとえば、
class SuperClass {
public void method() {
System.out.println("SuperClass");
}
}
class SubClass extends SuperClass {
public SubClass() {
method();
this.method();
super.method();
}
}
通話中
new SubClass();
版画
SuperClass
SuperClass
SuperClass
一緒にいる間
class SuperClass {
public void method() {
System.out.println("SuperClass");
}
}
class SubClass extends SuperClass {
@Override
public void method() {
System.out.println("SubClass");
}
public SubClass() {
method();
this.method();
super.method();
}
}
通話中
new SubClass();
版画
SubClass
SubClass
SuperClass
並行して、呼び出し元のクラスに前述のものが隠されるまで、 との間this.field
に違いはありません。super.field
field
たとえば、
class SuperClass {
protected String field = "SuperClass";
}
class SubClass extends SuperClass {
public SubClass(String field) {
System.out.println(field);
System.out.println(this.field);
System.out.println(super.field);
}
}
通話中
new SubClass("parameter");
版画
parameter
SuperClass
SuperClass
一緒にいる間
class SuperClass {
protected String field = "SuperClass";
}
class SubClass extends SuperClass {
private String field = "SubClass";
public SubClass(String field) {
System.out.println(field);
System.out.println(this.field);
System.out.println(super.field);
}
}
通話中
new SubClass("parameter");
版画
parameter
SubClass
SuperClass
補足: methods()
get hidden中にオーバーライドされます。fields
Usingthis
は、スーパークラス メソッドを呼び出しません。このインスタンスのメソッドを明確に呼び出すため、実際には不要です。同じインスタンスの別のコンストラクターを呼び出したい場合は関連する可能性がありますが、それ以外の場合は、メソッドを呼び出すだけと同じです。
インスタンス変数が使用されていることを確認するために、変数のスコープ (たとえば、インスタンス変数と同じ名前のローカル変数がある場合) に役立つ場合がありますが、メソッドを呼び出すときは違いはありません。
個人的には、開発者はコード補完を利用したかったと思います.IDEは入力後に可能なメソッド名を表示しますthis.
:-)
superは基本クラスのメソッドにアクセスするために使用され、これは現在のクラスのメソッドにアクセスするために使用されます。
いくつかの参照
1)これの使用法
2) SO のスーパーに対する批判
概念を拡張すると、super() と書くと基本クラスのコンストラクターを参照し、this() と書くとこのコードを記述しているまさにそのクラスのコンストラクターを参照します。
class Animal {
void eat() {
System.out.println("animal : eat");
}
}
class Dog extends Animal {
void eat() {
System.out.println("dog : eat");
}
void anotherEat() {
super.eat();
}
}
public class Test {
public static void main(String[] args) {
Animal a = new Animal();
a.eat();
Dog d = new Dog();
d.eat();
d.anotherEat();
}
}
出力は次のようになります
animal : eat
dog : eat
animal : eat
super.eat() を呼び出しているため、3 行目は「animal:eat」と出力しています。this.eat() を呼び出すと、「dog:eat」と出力されます。
多くの oracle/sun Java コードがこれを使用しています。例を参照する必要がない場合は、java\awt\Event.java #translate を参照してください。
public void translate(int dx, int dy) {
this.x += dx;
this.y +=
}
(src.zip を抽出してこれを検索すると、*.java で、オーバーライドするローカル変数/パラメーターがないにもかかわらず、このスタイルを使用しているこのような多くのインスタンスが表示されます。
パラメータやオートコンプリートとは何の関係もありません(xだけです)現在/このクラスのメソッドまたはフィールドについて話していることを明確にするためのコーディング標準だと思います。
基底クラスのメソッド: クラスでまだオーバーライドされていなくても、後日になる可能性があるため、将来の準備が整っています。メソッドがオーバーライドされるまでは正常に動作し、オーバーライドされた場合は正確です。
したがって、明確にするためのベストプラクティスのコーディング規則だと思います。書かないことは単なる構文糖であり、コンパイラはそれをクラスコードに追加するため、コードが肥大化することはありません。