gpt4 book ai didi

Java继承与线程混淆

转载 作者:行者123 更新时间:2023-11-29 08:21:22 25 4
gpt4 key购买 nike

我正在检查这里使用继承和线程的代码。

下面有BaseCom和ServerCom类。 ServerCom 类扩展了 BaseCom 类。 BaseCom 类实现了一个名为 Com 的接口(interface)。

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
}

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
}

为什么当我从主函数运行下面的代码时,实际上执行的是 ServerCom 类的 run 方法,而不是 basecom 类的方法?

事实上 thread = new Thread(() -> run(socketAddress)); 在 BaseCom 类而不是 ServerCom 类中,这让我认为它应该是 Basecom被调用的 run 方法。

connectorA = new ServerCom(socketAddressA, 1000000);
connectorA.start();

最佳答案

run(...) 的调用在运行时解析 (dynamic dispatch)。由于此 BaseCom 的实际类型是 ServerCom,因此执行 ServerComrun(...)。如果 BaseComrun(...) 方法被覆盖(因为它被覆盖,原始方法不可访问),则无法强制调用它。

问题与多线程无关。

关于Java继承与线程混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57823983/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com