8

我看到了一些使用this关键字获取超类方法的 Java 示例。示例:this.superClassMethod()。在通常情况下,我们会使用super. 有人可以举例说明为什么开发人员使用this而不是super?谢谢你。

4

4 回答 4

21

在调用者的类中被覆盖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

于 2013-04-17T14:42:16.490 回答
5

Usingthis不会调用超类方法。它实际上是多余的,因为它专门调用了这个实例的方法。如果您想调用同一实例的另一个构造函数,这可能是相关的,但否则它与仅调用该方法相同。

它可能对变量作用域有用(例如,当有一个与实例变量同名的局部变量时)以确保使用实例变量,但在调用方法时没有区别。

就我个人而言,我认为开发人员希望利用代码完成功能,并且 IDE 在输入后会显示可能的方法名称this.:-)

于 2013-04-17T14:34:08.260 回答
3

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”。

于 2013-04-17T14:40:04.893 回答
0

许多 oracle/sun java 代码都使用它。当它不需要示例时,请参见 java\awt\Event.java #translate

public void translate(int dx, int dy) {
    this.x += dx;
    this.y +=     
}

(如果您提取 src.zip 并搜索它。在 *.java 中会看到很多这样的实例,其中没有覆盖的局部变量/参数,但它们仍然使用这种样式。

与参数或自动完成无关(它只是 x)我认为它是一个编码标准,以明确我们正在谈论当前/此类中的方法或字段。

基类的方法:即使在我们的类中还没有被覆盖,它可以在以后的日期,所以它的未来准备好了。直到方法被覆盖它工作正常,如果它被覆盖它是准确的。

因此,为了清晰起见,我认为这是一个最佳实践编码约定。它不会使代码膨胀,因为不编写只是语法糖,编译器会将其添加到类代码中。

于 2013-04-17T15:20:15.160 回答