构造函数:this(变量)vs this.method(变量)vs super.metchod(variable)difference

时间:2015-05-13 13:36:29

标签: java

在做一些Oracle模拟考试时,我发现了一些事情,以前从未引起我的注意:

class MyThread extends Thread {
    public MyThread(String name) {
        // We can use any:
        super(name);
        super.setName(name);
        this.setName(name);
    }
}

所有方式都是有效的,前两个是常见的,但问题是 - 它们和第三个之间有什么区别吗?

超级(名称); - 调用超类构造函数

super.setName(名称); - 调用超类setName方法

this.setName(名称); - 使用继承的setName方法,它调用超类setName方法(我是对的)?

3 个答案:

答案 0 :(得分:2)

如果您的MyThread课程未覆盖setNamesuper.setName(name);this.setName(name);之间没有区别,两者都可以被setName(name);取代。< / p>

我刚检查过 - setName是最终的,所以你无法覆盖它。因此,对setName的两次调用没有区别。

通过构造函数初始化名称略有不同。如果不使用name参数(super(name))调用构造函数,则将隐式调用无参数构造函数(super()),并将线程名称初始化为Thread-xx。只有在调用setName之后,名称才会更改为传递给它的名称。

答案 1 :(得分:1)

顾名思义,TablePerType指的是超类,而super指的是当前的对象。

这取决于当前类是否覆盖它继承的内容。

在您的情况下,如果我们拥有自己的thissetName()需要&#34;我们的&#34;,如果没有,则采用继承的。{ this.setName()总是接受继承的。

答案 2 :(得分:1)

是的,请说明你有A级

public class A {
    protected method(){
        System.out.println("A");
    }
}

和B级

public class B extends A {
    public B(){
        super.method(); //This should print "A"
        this.method(); //This should print "B"
    }
    protected method(){
        System.out.println("B");
    }
}

这就是区别。