super()用于从子类的构造函数中执行超类的构造函数。在这个程序中,无论是否在构造函数中使用super(),输出都保持不变。那么请你解释在这种情况下拥有和不拥有super()之间的区别吗?
class SomeThread extends Thread {
String ThreadName;
SomeThread(String ThreadName) {
super(ThreadName); //Why Oh Why ?
this.ThreadName = ThreadName;
}
public void run(){
for(int ctr=1; ctr<=10; ctr++) {
System.out.println("From "+ThreadName+"...."+ctr);
try {
sleep(1000);
}catch(Exception e) {
System.out.println("Exception in "+ThreadName);
}
}
}
}
class ThreadAliveDemo {
public static void main(String[] args) throws Exception {
SomeThread FThread = new SomeThread("Some Child Thread");
System.out.println("Some Child Thread is alive "+FThread.isAlive());
FThread.start();
System.out.println("Some Child Thread is running.."+FThread.isAlive());
for(int ctr = 1; ctr<=5; ctr++) {
System.out.println("From.."+Thread.currentThread().getName()+"..."+ctr);
Thread.sleep(1000);
}
FThread.join();
System.out.println("Some Child Thread is alive.."+FThread.isAlive());
for(int ctr=6; ctr<=10; ctr++) {
System.out.println("From.."+Thread.currentThread().getName()+"..."+ctr);
Thread.sleep(1000);
}
}
}
答案 0 :(得分:5)
调用超类构造函数#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)
if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"9.0")) {
[[UINavigationBar appearance] setSemanticContentAttribute:UISemanticContentAttributeForceLeftToRight];
}
,您可以显式设置 system 线程名称,以后可以使用Thread(String name)
获取该名称。如果您没有显式调用超类构造函数,将使用默认构造函数,它将分配默认的线程名称,如Thread.currentThread().getName()
。这些线程名称可以出现在调试器UI,Thread-1
输出等中,因此为线程分配有意义的名称是个好主意。例如,在Eclipse调试器中运行当前代码时,您将看到:
所以你可以看到jstack
。但如果您删除该超级电话,您将看到以下内容:
现在它只是Thread [Some Child Thread]
。
答案 1 :(得分:2)
如果你做调用super,那么你最终会根据JavaDoc调用以下构造函数:
public Thread(String name)
分配一个新的Thread对象。此构造函数与 Thread(null,null,name)。
具有相同的效果
因此self.gameButton.setBackgroundColor(color)
调用self.gameButton.setBackgroundColor(color)
。
如果您删除对super(ThreadName)
的调用,则JVM将自动为您调用空构造函数super(null, null, ThreadName)
。根据JavaDoc,您将最终进行几乎相同的调用:
主题 public Thread() 分配一个新的Thread对象。此构造函数与
具有相同的效果线程(null,null,gname),其中gname是新生成的名称。自动生成的名称的格式为“Thread - ”+ n,其中n是整数。
因此super(ThreadName)
调用super()
,其中super()
是自动生成的线程名称。
调用和不调用super()之间行为的唯一区别是线程名称的赋值。
答案 2 :(得分:1)
super(ThreadName);
语句调用Thread类的Thread(String name)
构造函数。正如论据所示,它设置了thread
的名称。
虽然在此示例中设置thread
的名称可能并不直接有用,但一般来说,thread
名称在调试时很有用,因为您可以在应用程序中添加线程名称&# 39; s log。