java - Java继承与线程混淆
问题描述
我在这里检查使用继承和线程的代码。
下面有一个 BaseCom 和 ServerCom 类。ServerCom 类扩展了 BaseCom 类。BaseCom 类实现了一个名为 Com 的接口。
public class BaseCom implements Com
{
protected final Thread thread;
protected final InetSocketAddress socketAddress;
public BaseCom(InetSocketAddress socketAddress)
{
System.out.println("BaseCom CONSTRUCTOR!!!!");
this.socketAddress = socketAddress;
thread = new Thread(() -> run(socketAddress));
}
@Override
public void start()
{
System.out.println("HELLO FROM BaseCom start method!!!!");
thread.start();
}
protected void run(InetSocketAddress socketAddress)
{
System.out.println("HELLO FROM BaseCom run!!!!");
}
//.... more stuff .... not shown here
}
lll
public class ServerCom extends BaseCom
{
public ServerCom(InetSocketAddress socketAddress, long timeOutMs)
{
super(socketAddress);
System.out.println("ServerCom CONSTRUCTOR!!!!");
}
@Override
protected void run(InetSocketAddress socketAddress)
{
System.out.println("ServerCom run method!!!!");
}
// ... more stuff.. not shown here
}
为什么当我从 main 函数运行以下代码时,实际上执行的是 ServerCom 类的 run 方法而不是 basecom 类的 run 方法?
这条线thread = new Thread(() -> run(socketAddress));
在 BaseCom 类而不是 ServerCom 类中的事实让我认为它应该是被调用的 Basecom 运行方法。
connectorA = new ServerCom(socketAddressA, 1000000);
connectorA.start();
解决方案
调用run(...)
在运行时解决(动态调度)。由于 this 的实际类型BaseCom
是ServerCom
, ServerCom
'srun(...)
被执行。BaseCom
如果's -method 被覆盖,则无法强制run(...)
调用它(因为它被覆盖,原始方法不可访问)。
该问题与多线程无关。
推荐阅读
- mysql - 从 MySQL 中的多个表的 max 列获取关联数据
- python - Python递归:传递所有变量与仅声明全局变量并在函数中重新声明相比有什么优势吗?
- ruby - 如何创建 Google::Protobuf::Map 实例 [Ruby]
- dart - 如何在 Flutter 中的 TextFormField 中实现日期逻辑
- r - R code for pulling out fixed effect standard errors in lme4 package
- css - 使用填充弯曲五个图像
- powershell - 传递参数和运行 Powershell 脚本
- java - Web 服务客户端 - 多个 HTTP 保持活动连接到同一目标
- python - 交互式子进程的标准输出被缩短
- c# - 你好 将嵌套的 JSON 反序列化为 C# 对象