为什么使用“this”关键字来获取超类方法

时间:2013-04-17 14:32:01

标签: java

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

4 个答案:

答案 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.fieldsuper.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)无关我认为它是一个编码标准,可以清楚地表明我们正在讨论当前/这个类中的方法或字段。

基类方法:即使我们班级还没有过度骑行,它可以在以后的日子里,所以它的未来就好了。直到该方法被覆盖它才能正常工作,如果它被覆盖它的准确。

因此,为了清晰起见,我认为它是最佳编码惯例。它不会膨胀代码,因为不写只是语法糖,编译器会将它添加到类代码中。