【发布时间】:2013-04-17 14:32:01
【问题描述】:
我看到一些使用this 关键字获取超类方法的Java 示例。示例:this.superClassMethod()。通常情况下,我们会使用super。有人可以举例说明为什么开发人员使用this 而不是super?谢谢你。
【问题讨论】:
-
子类中是否重写了方法?
标签: java
我看到一些使用this 关键字获取超类方法的Java 示例。示例:this.superClassMethod()。通常情况下,我们会使用super。有人可以举例说明为什么开发人员使用this 而不是super?谢谢你。
【问题讨论】:
标签: java
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 得到 隐藏。
【讨论】:
super,否则什么都不做,默认情况下(不使用this)总是“最新实施”将被使用。
使用this 不会调用超类方法。它实际上是多余的,因为它专门调用了这个实例的方法。如果你想调用同一个实例的另一个构造函数,这可能是相关的,但否则它与调用方法相同。
这对于变量作用域(例如,当存在与实例变量同名的局部变量时)可能很有用,以确保使用实例变量,但在调用方法时没有区别。
我个人认为开发人员想要利用代码完成功能,并且 IDE 在输入 this. 后会显示可能的方法名称 :-)
【讨论】:
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”。
【讨论】:
super(),而不是调用 super.<methodName> 的一般概念。
Test 类和输出中? ;)
很多 oracle/sun java 代码都使用这个。当它不需要示例时,请参见 java\awt\Event.java #translate
public void translate(int dx, int dy) {
this.x += dx;
this.y +=
}
(如果您提取 src.zip 并搜索它。在 *.java 中会看到很多这样的实例,其中没有覆盖的局部变量/参数,但它们仍然使用这种样式。
与参数或自动完成无关(它只是 x)我认为它是一个编码标准,以明确我们正在谈论当前/此类中的方法或字段。
基类的方法:即使我们的类中还没有覆盖它,它也可以在以后的日期,所以它的未来准备好了。直到方法被覆盖它工作正常,如果它被覆盖它是准确的。
因此,为了清晰起见,我认为这是一个最佳实践编码约定。它不会使代码膨胀,因为不编写只是语法糖,编译器会将其添加到类代码中。
【讨论】: