我看到一些使用this
关键字获取超类方法的Java示例。示例:this.superClassMethod()
。通常情况下,我们会使用super
。有人可以帮助澄清为什么开发人员使用this
而不是super
?谢谢。
答案 0 :(得分:18)
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()
获取覆盖,fields
隐藏。
答案 1 :(得分:5)
使用this
不会调用超类方法。它实际上是多余的,因为它专门调用此实例的方法。如果你想调用同一个实例的另一个构造函数,可能是相关的,但除此之外它只是调用方法。
对于变量作用域(例如,当存在与实例变量同名的局部变量时)可能有用,以确保使用实例变量,但在调用方法时没有区别。
我个人认为开发人员希望利用代码完成功能,IDE在输入this.
后显示可能的方法名称: - )
答案 2 :(得分:3)
super 用于访问基类的方法,而 this 用于访问当前类的方法。
很少有参考文献
1)usage of this
2)critique on super on 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
第三行是打印“animal:eat”因为我们正在调用super.eat()。如果我们调用this.eat(),它将打印为“dog:eat”。
答案 3 :(得分:0)
很多oracle / sun java代码都使用它。当它不需要例子看java \ awt \ Event.java #translate
时public void translate(int dx, int dy) {
this.x += dx;
this.y +=
}
(如果你提取src.zip并搜索它。在* .java中会看到很多这样的实例,其中没有重写的局部变量/ param,但他们仍然使用这种风格。
与params或auto completion(它只是x)无关我认为它是一个编码标准,可以清楚地表明我们正在讨论当前/这个类中的方法或字段。
基类方法:即使我们班级还没有过度骑行,它可以在以后的日子里,所以它的未来就好了。直到该方法被覆盖它才能正常工作,如果它被覆盖它的准确。
因此,为了清晰起见,我认为它是最佳编码惯例。它不会膨胀代码,因为不写只是语法糖,编译器会将它添加到类代码中。