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

gjm*_*an2 6 java

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

sp0*_*00m 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();
    }

}
Run Code Online (Sandbox Code Playgroud)

调用

new SubClass();
Run Code Online (Sandbox Code Playgroud)

打印

SuperClass
SuperClass
SuperClass
Run Code Online (Sandbox Code Playgroud)

与...同时

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();
    }

}
Run Code Online (Sandbox Code Playgroud)

调用

new SubClass();
Run Code Online (Sandbox Code Playgroud)

打印

SubClass
SubClass
SuperClass
Run Code Online (Sandbox Code Playgroud)

与此同时,有没有什么区别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);
    }

}
Run Code Online (Sandbox Code Playgroud)

调用

new SubClass("parameter");
Run Code Online (Sandbox Code Playgroud)

打印

parameter
SuperClass
SuperClass
Run Code Online (Sandbox Code Playgroud)

与...同时

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);
    }

}
Run Code Online (Sandbox Code Playgroud)

调用

new SubClass("parameter");
Run Code Online (Sandbox Code Playgroud)

打印

parameter
SubClass
SuperClass
Run Code Online (Sandbox Code Playgroud)

附注:methods()得到重写fields获得隐藏.

  • 所有这一切都是正确的,但可以缩短为:如果要调用超类方法,请使用`super`,否则默认情况下不执行任何操作(不使用`this`),将始终使用"最新实现". (4认同)
  • +1 简洁的关键语句“this.method() 和 super.method() 之间没有区别,直到所述方法在调用者的类中被重写。” (2认同)

Tho*_*mar 5

使用this不会调用超类方法.它实际上是多余的,因为它专门调用此实例的方法.如果要调用同一实例的另一个构造函数,则可能是相关的,但除此之外它与调用该方法相同.

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

我个人认为开发人员想要利用代码完成,IDE在输入后显示可能的方法名称this.:-)