Java 为什么要使用;这";关键字来获取超类方法

Java 为什么要使用;这";关键字来获取超类方法,java,Java,我看到一些Java示例使用this关键字来获取超类方法。示例:this.superClassMethod()。在通常情况下,我们将使用super。有人能举例说明为什么开发人员使用this而不是super?多谢各位 使用此不会调用超类方法。它实际上是多余的,因为它专门调用这个实例的方法。如果您想调用同一实例的另一个构造函数,那么它可能是相关的,但在其他方面,它与只调用该方法相同 它对于变量作用域(例如,当存在与实例变量同名的局部变量时)可能很有用,以确保使用实例变量,但在调用方法时没有区别 我个人

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

使用
不会调用超类方法。它实际上是多余的,因为它专门调用这个实例的方法。如果您想调用同一实例的另一个构造函数,那么它可能是相关的,但在其他方面,它与只调用该方法相同

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

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

super用于访问基类的方法,而这用于访问当前类的方法。

参考文献很少
1)
(二)

扩展这个概念,如果你写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

第三行是打印“动物:吃”,因为我们调用super.eat()。如果我们调用此.eat(),它将打印为“dog:eat”。在调用方的类中重写所述的
method()
之前,
this.method()和
super.method()
之间没有区别

例如,与

类超类{
公开作废法(){
System.out.println(“超类”);
}
}
类子类扩展了超类{
公共子类(){
方法();
这个方法();
super.method();
}
}
召唤

new SubClass();
new SubClass("parameter");
newsubclass();
印刷品

超类
超类
超类

类超类{
公开作废法(){
System.out.println(“超类”);
}
}
类子类扩展了超类{
@凌驾
公开作废法(){
System.out.println(“子类”);
}
公共子类(){
方法();
这个方法();
super.method();
}
}
召唤

new SubClass();
new SubClass("parameter");
印刷品

子类
子类
超类

同时,在所述
字段
隐藏在调用方的类中之前,
此.field
超级.field
之间没有区别

例如,与

类超类{
受保护的字符串字段=“超类”;
}
类子类扩展了超类{
公共子类(字符串字段){
系统输出打印项次(字段);
System.out.println(此字段);
System.out.println(超级字段);
}
}
召唤

new SubClass();
new SubClass("parameter");
新的子类(“参数”);
印刷品

参数
超类
超类

类超类{
受保护的字符串字段=“超类”;
}
类子类扩展了超类{
私有字符串字段=“子类”;
公共子类(字符串字段){
系统输出打印项次(字段);
System.out.println(此字段);
System.out.println(超级字段);
}
}
召唤

new SubClass();
new SubClass("parameter");
印刷品

参数
子类
超类


旁注:
methods()
被覆盖,而
字段被隐藏。

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

public void translate(int dx, int dy) {
    this.x += dx;
    this.y +=     
}
(如果您提取src.zip并搜索它,*.in.java将看到许多这样的实例,其中没有重写局部变量/param,但它们仍然使用这种样式

与params或auto completion无关(只是x)我认为这是一个编码标准,可以清楚地表明我们在谈论current/this类中的方法或字段

基类的方法:即使在我们的类中还没有被过度使用,它也可以在以后的某个日期使用,因此它的未来已经准备好了。在方法被重写之前,它可以正常工作,如果它被过度使用,它的准确性也会很高


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

该方法是否在子类中被重写?引用“Commission on super”实际上专门用于调用
super()
来自构造函数,而不是调用
super的一般概念。
。为什么不将您提到的最后一个示例添加到
测试类和输出?;)+1作为简明的关键语句“在调用方的类中重写所述方法之前,this.method()和super.method()之间没有区别。”所有这些都是正确的,但是可以缩短为:如果要调用超类方法,请使用
super
,否则默认情况下不执行任何操作(不使用
this
),始终使用“最新的实现”。好的,一开始我很困惑:-D