在做一些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方法(我是对的)?
答案 0 :(得分:2)
如果您的MyThread
课程未覆盖setName
,super.setName(name);
和this.setName(name);
之间没有区别,两者都可以被setName(name);
取代。< / p>
我刚检查过 - setName
是最终的,所以你无法覆盖它。因此,对setName
的两次调用没有区别。
通过构造函数初始化名称略有不同。如果不使用name参数(super(name)
)调用构造函数,则将隐式调用无参数构造函数(super()
),并将线程名称初始化为Thread-xx
。只有在调用setName
之后,名称才会更改为传递给它的名称。
答案 1 :(得分:1)
顾名思义,TablePerType
指的是超类,而super
指的是当前的对象。
这取决于当前类是否覆盖它继承的内容。
在您的情况下,如果我们拥有自己的this
,setName()
需要&#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");
}
}
这就是区别。