【问题标题】:Why using "this" keyword to get superclass methods为什么使用“this”关键字来获取超类方法
【发布时间】:2013-04-17 14:32:01
【问题描述】:

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

【问题讨论】:

  • 子类中是否重写了方法?

标签: java


【解决方案1】:

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 表示简洁的关键语句“在调用者的类中覆盖上述方法之前,this.method() 和 super.method() 之间没有区别。”
  • 所有这些都是正确的,但可以缩写为:如果你想调用超类方法,使用super,否则什么都不做,默认情况下(不使用this)总是“最新实施”将被使用。
【解决方案2】:

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

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

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

【讨论】:

  • 好吧,一开始我很困惑:-D
【解决方案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”。

【讨论】:

  • “对 super 的批评”参考实际上专门针对从构造函数调用 super(),而不是调用 super.<methodName> 的一般概念。
  • 为什么不将您提到的最后一个示例添加到您的Test 类和输出中? ;)
【解决方案4】:

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-31
    • 1970-01-01
    • 2012-07-24
    • 1970-01-01
    • 2010-12-26
    • 1970-01-01
    • 2020-07-06
    相关资源
    最近更新 更多