关于Java当中继承的疑问
这是我运行的Test.java文件的源码,Sub类继承的是Main类,MyThreadA和MyThreadB都是线程类
package service;
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Sub subRef = new Sub();
MyThreadA a = new MyThreadA(subRef);
a.setName("A");
a.start();
MyThreadB b = new MyThreadB(subRef);
b.setName("B");
b.start();
}
}
如下是控制台的运行结果,我的疑问是为什么Main类里面的serviceMethod()方法也被调用了?线程MyThreadA和线程MyThreadB的run()方法不是只是调用了Sub类里面的serviceMethod()方法吗?
int sub 下一步 sleep begin threadName=A time=1521894980829
int sub 下一步 sleep begin threadName=B time=1521894980829
int sub 下一步 sleep end threadName=A time=1521894985834
int sub 下一步 sleep end threadName=B time=1521894985834
int main 下一步 sleep begin threadName=A time=1521894985835
int main 下一步 sleep end threadName=A time=1521894990838
int main 下一步 sleep begin threadName=B time=1521894990838
int main 下一步 sleep end threadName=B time=1521894995840
如下是MyThreadA类
package service;
public class MyThreadA extends Thread {
private Sub sub;
public MyThreadA(Sub sub) {
super();
this.sub = sub;
}
@Override
public void run() {
// TODO Auto-generated method stub
sub.serviceMethod();
}
}
如下是MyThreadB类
package service;
public class MyThreadB extends Thread {
private Sub sub;
public MyThreadB(Sub sub) {
super();
this.sub = sub;
}
@Override
public void run() {
// TODO Auto-generated method stub
sub.serviceMethod();
}
}
如下是Main类
package service;
public class Main {
synchronized public void serviceMethod() {
try {
System.out.println("int main 下一步 sleep begin threadName="
+ Thread.currentThread().getName() + " time="
+ System.currentTimeMillis());
Thread.sleep(5000);
System.out.println("int main 下一步 sleep end threadName="
+ Thread.currentThread().getName() + " time="
+ System.currentTimeMillis());
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
如下是Sub类,继承Main类
package service;
public class Sub extends Main {
@Override
public void serviceMethod() {
try {
System.out.println("int sub 下一步 sleep begin threadName="
+ Thread.currentThread().getName() + " time="
+ System.currentTimeMillis());
Thread.sleep(5000);
System.out.println("int sub 下一步 sleep end threadName="
+ Thread.currentThread().getName() + " time="
+ System.currentTimeMillis());
super.serviceMethod();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
去掉super.serviceMethod();
基本概念都没有搞清楚,就去学线程合适吗?