消费者使用对象状态调用方法

时间:2018-08-02 08:48:25

标签: java lambda

我上课

procedure WakeOnLan(const AMacAddress: string);

type
  TMacAddress = array [1..6] of Byte;

  TWakeRecord = packed record
    Waker : TMACAddress;
    MAC   : array [0..15] of TMacAddress;
  end;

var
  I          : Integer;
  WR         : TWakeRecord;
  MacAddress : TMacAddress;
  UDPClient  : TIdUDPClient;
  sData      : string;

begin
  FillChar(MacAddress, SizeOf(TMacAddress), 0);

  sData := Trim(AMacAddress);

  if Length(sData) = 17 then begin

    for I := 1 to 6 do begin
      MacAddress[I] := StrToIntDef('$' + Copy(sData, 1, 2), 0);
      sData := Copy(sData, 4, 17);
    end;

  end;

  for I := 1 to 6  do WR.Waker[I] := $FF;
  for I := 0 to 15 do WR.MAC[I]   := MacAddress;

  UDPClient := TIdUDPClient.Create(nil);
  try

//    UDP.Host := '255.255.255.255';
//    UDP.Port := 32767;

    UDPClient.BroadCastEnabled := True;
    UDPClient.Broadcast(RawToBytes(WR, SizeOf(TWakeRecord)), 7);

//    UDP.SendBuffer(RawToBytes(WR, SizeOf(TWakeRecord)));

  UDPClient.BroadcastEnabled := False;
  finally
    UDPClient.Free;
  end;
end;

我不理解的是,在GGGG类中,我有public final class GGGGG { private final String str; public GGGGG(final String str) { this.str = str; } public void showElement(final String test){ System.out.println(this.str+test); } public static void main(String[] args) { GGGGG hello = new GGGGG("hello"); final Test2 test2 = new Test2(hello::showElement); test2.test(); hello = null; test2.test(); } static class Test2{ private final Consumer<String> consumer; Test2(final Consumer<String> consumer) { this.consumer = consumer; } public void test(){ this.consumer.accept(" world"); } } } (州)

我使用参考方法String str的方法创建使用者 现在,该使用者已经引用了showElement实例。 消费者是否保留对原始对象的引用或创建新实例(如果在垃圾回收时引用相同)?

1 个答案:

答案 0 :(得分:2)

Java与pass-by-value.一起使用,因此test2hello只是参考副本。您仍然将信息保留在哪里以供参考。

  

消费者是否保留对原始对象的引用?

是的

作为附加知识,JLS, Section 15.13.3描述了方法引用的运行时评估。

  

方法引用表达式求值的时间比lambda表达式(第15.27.4节)更复杂。当方法引用表达式的::分隔符之前具有表达式(而不是类型)时,将立即对该子表达式求值。存储评估的结果,直到调用相应功能接口类型的方法为止;此时,结果将用作调用的目标参考。这意味着::分隔符之前的表达式仅在程序遇到方法引用表达式时才被评估,并且不会在随后对功能接口类型的调用上重新评估。