首页 > 解决方案 > 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();

标签: javamultithreadinginheritanceinterfacebase-class

解决方案


调用run(...)在运行时解决(动态调度)。由于 this 的实际类型BaseComServerCom, ServerCom'srun(...)被执行。BaseCom如果's -method 被覆盖,则无法强制run(...)调用它(因为它被覆盖,原始方法不可访问)。

该问题与多线程无关。


推荐阅读