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