我看到了一些使用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
直到say隐藏在调用者的类中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()
被覆盖。fields
Usingthis
不会调用超类方法。它实际上是多余的,因为它专门调用了这个实例的方法。如果您想调用同一实例的另一个构造函数,这可能是相关的,但否则它与仅调用该方法相同。
它可能对变量作用域有用(例如,当有一个与实例变量同名的局部变量时)以确保使用实例变量,但在调用方法时没有区别。
就我个人而言,我认为开发人员希望利用代码完成功能,并且 IDE 在输入后会显示可能的方法名称this.
:-)
super用于访问基类的方法,而this用于访问当前类的方法。
很少有参考
1)这个的用法
2)对 SO 上的 super 的批评
扩展这个概念,如果你写 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
第三行打印“animal:eat”,因为我们调用了 super.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)我认为它是一个编码标准,以明确我们正在谈论当前/此类中的方法或字段。
基类的方法:即使在我们的类中还没有被覆盖,它可以在以后的日期,所以它的未来准备好了。直到方法被覆盖它工作正常,如果它被覆盖它是准确的。
因此,为了清晰起见,我认为这是一个最佳实践编码约定。它不会使代码膨胀,因为不编写只是语法糖,编译器会将其添加到类代码中。