检查我的coolMethod,辣妹:
package zoo;
public class Zoo {
public String coolMethod() {
return "Wow baby!";
}
}
My Moo Class,它扩展了我的Zoo类,充满了做同样事情的方法,这就是调用我的coolMethod。
package zoo;
public class Moo extends Zoo {
public void useAZoo(){
Zoo z = new Zoo();
System.out.println("A Zoo says: "+ z.coolMethod());
}
public void useMyCoolMethod(){
System.out.println("My cool method says: " + super.coolMethod());
}
public void useMyCoolMethodAgain(){
System.out.println("My cool method says: " + this.coolMethod()+ " (again)");
}
public void inheritMyMethod(){
System.out.println("My inhertied method says: " + coolMethod());
}
}
我的主要内容是调用我的Moo类功能。
package javacert1;
import zoo.Moo;
public class Main {
public static void main(String[] args) {
Moo moo = new Moo();
moo.useAZoo();
moo.useMyCoolMethod();
moo.useMyCoolMethodAgain();
moo.inheritMyMethod();
}
}
如您所见,所有这四个调用都会得到相同的结果。我正在学习Java,我练习了一个使用“this”的例子,但我曾在其他地方看到过使用“super”,所以我测试了它,结果也是如此。为什么是这样? this和super关键字之间的主要区别是什么?
答案 0 :(得分:4)
由于您只有一个coolMethod
,因此无论限定符如何,都会在每种情况下调用它。但是,如果您在Moo
中覆盖您的方法,例如像这样
public class Moo extends Zoo {
public String coolMethod() {
return "Yeah dude!";
}
// the rest is the same as above...
}
您会注意到对coolMethod()
和this.coolMethod()
的调用与对super.coolMethod()
的调用之间的区别。
答案 1 :(得分:3)
this
可以指向当前对象
super
可用于访问Super class metods&变量
this()
可用于调用同一类
super()
可用于调用超类构造函数
答案 2 :(得分:2)
您没有覆盖coolMethod
,而是继承它
因此,它称之为相同的方法
覆盖coolMethod
,看看会发生什么
super
将调用base的方法
this
将调用此对象中的方法
答案 3 :(得分:2)
“this”指的是您所在的对象。“super”指的是此对象的父级。我认为你因为你正在进行的其他一些事情而错过了这些差异。
例如,此代码
public class Zoo {
public String coolMethod() {
return "Wow baby!";
}
}
public class Moo extends Zoo {
public void useAZoo(){
Zoo z = new Zoo();
System.out.println("A Zoo says: "+ z.coolMethod());
}
public void useMyCoolMethod(){
System.out.println("My cool method says: " + super.coolMethod());
}
public void useMyCoolMethodAgain(){
System.out.println("My cool method says: " + this.coolMethod()+ " (again)");
}
public void inheritMyMethod(){
System.out.println("My inhertied method says: " + coolMethod());
}
}
方法“coolMethod”在Zoo中定义,但它是一个公共方法,因此它自然地被Moo继承。所以,当你在你的Moo课程中并且你调用this.coolMethod或super.coolMethod时,你最终会得到完全相同的东西。事情变得更有趣的是,如果你覆盖子类中的coolMethod,就像这样:
public class Zoo {
public String coolMethod() {
return "Wow baby!";
}
}
public class Moo extends Zoo {
@Override
public String coolMethod() {
return "Moo baby!";
}
public void doIt() {
System.out.println("Using super: " + super.coolMethod());
System.out.println("Using this: " + this.coolMethod());
}
}
在这种情况下尝试执行“doIt”,我认为你会更容易看到差异。
答案 4 :(得分:2)
很酷的例子,overmann:)
这是另一个例子......有2个源文件 - LevelSub.java,它扩展了LevelSup.java
将2保存在某个文件夹中,使用“javac LevelSub.java”编译(编译器将从“extends”知道它必须编译“LevelSup.java”),并运行“java LevelSub”。源代码中的注释应该告诉您区别。
当变量或方法存在名称冲突时使用this和super(例如,在超级/子类或方法体中使用相同的名称,或者您想要从已被覆盖的超类中调用方法)。 “this”指的是当前的对象实例,“super”指的是它继承的实例。对于没有名称冲突,这个或超级前缀是多余的。
public class LevelSub extends LevelSup {
protected String myName;
public LevelSub (String myName) {
super ("SuperClass");
this.myName = myName; // sets up instance variable
}
public void print () {
System.out.println ("Hi, this is " + myName); // refers to this.myName
System.out.println ("I am inherited from " + super.myName);
System.out.println ("also known as " + defaultName); // gets from superclass
super.print(); // overridden method of superclass
}
public static void main (String[] args) {
new LevelSub("SubClass").print();
}}
和另一个来源......
public class LevelSup {
// cannot be private if accessed by subclass
protected String myName, defaultName = "TopLevel";
public LevelSup (String name) {
myName = name; // this not required, no name clash
}
// cannot be private if accessed by subclass
public void print () {
System.out.println ("Hi, this is " + myName);
}
}
答案 5 :(得分:1)
在这种情况下,他们将不会做任何不同的事情。
但是,如果您要覆盖coolMethod
类中的Moo
,则对super
版本的调用将调用Zoo
类中的版本,但所有其他版本将调用新的重写版本。
答案 6 :(得分:1)
要查看差异,请覆盖子类Moo中的coolMethod:
public String coolMethod() {
return "Moo baby!";
}
答案 7 :(得分:1)
我建议你在Moo类中创建一个coolMethod,它打印出与Zoo类中不同的东西