Java: foo() 在super class中时,this.foo() 和super.foo() 是一样的吗?
Java: Are this.foo() and super.foo() the same when foo() is in the super class?
假设我有以下 classes:
class Foo {
protected void method() {}
}
class Bar extends Foo {
}
此时,从 class 栏,我可以通过两种方式访问 method()
:
super.method();
this.method();
据我所见,他们似乎在执行相同的操作。在这种情况下,这两者之间有区别吗?如果有,是否有首选版本?
使用 super
是有意义的,因为 method()
是超级 class 的一部分。我想使用 this
也是有意义的,因为 Bar 将继承 class Foo 的属性,因此 method()
也是如此,对吗?
是的,this.foo()
调用与super.foo()
相同的方法。
请注意,如果 foo()
在子 class 中被覆盖,将会有所不同。但在这种情况下,它运行相同的方法实现。
当我们需要特别请求执行superclass的方法实现时,我们使用super.foo()
,当当前class.[=19=中有一个可用的方法实现时。 ]
Using super makes sense because method() is part of the super class
是的,但请记住,子 class 可能会在某些时候发生变化并被覆盖 foo()
,在这种情况下 super.foo()
可能会开始调用意外的实现。
这是需要注意的事情。因此,调用this.foo()
或不合格foo()
可能是合理的。
请注意子级可能会再次被覆盖:
public class Main {
static class Foo {
protected void method() {
System.out.println("Bye");
}
}
static class Bar extends Foo {
{
this.method();
super.method();
}
}
static class Baz extends Bar {
protected void method() {
System.out.println("Hi");
}
}
public static void main(String[] args) {
new Baz();
}
}
生产:
Hi
Bye
因此,虽然 this.method()
和 super.method()
在某些情况下可能表现相同,但它们不会产生相同的字节码。
假设我有以下 classes:
class Foo {
protected void method() {}
}
class Bar extends Foo {
}
此时,从 class 栏,我可以通过两种方式访问 method()
:
super.method();
this.method();
据我所见,他们似乎在执行相同的操作。在这种情况下,这两者之间有区别吗?如果有,是否有首选版本?
使用 super
是有意义的,因为 method()
是超级 class 的一部分。我想使用 this
也是有意义的,因为 Bar 将继承 class Foo 的属性,因此 method()
也是如此,对吗?
是的,this.foo()
调用与super.foo()
相同的方法。
请注意,如果 foo()
在子 class 中被覆盖,将会有所不同。但在这种情况下,它运行相同的方法实现。
当我们需要特别请求执行superclass的方法实现时,我们使用super.foo()
,当当前class.[=19=中有一个可用的方法实现时。 ]
Using super makes sense because method() is part of the super class
是的,但请记住,子 class 可能会在某些时候发生变化并被覆盖 foo()
,在这种情况下 super.foo()
可能会开始调用意外的实现。
这是需要注意的事情。因此,调用this.foo()
或不合格foo()
可能是合理的。
请注意子级可能会再次被覆盖:
public class Main {
static class Foo {
protected void method() {
System.out.println("Bye");
}
}
static class Bar extends Foo {
{
this.method();
super.method();
}
}
static class Baz extends Bar {
protected void method() {
System.out.println("Hi");
}
}
public static void main(String[] args) {
new Baz();
}
}
生产:
Hi
Bye
因此,虽然 this.method()
和 super.method()
在某些情况下可能表现相同,但它们不会产生相同的字节码。