java中这个和超级关键字有什么区别?

时间:2011-01-21 21:53:33

标签: java

检查我的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关键字之间的主要区别是什么?

8 个答案:

答案 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()可用于调用超类构造函数

Difference with examples

答案 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类中不同的东西