我上课
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
实例。
消费者是否保留对原始对象的引用或创建新实例(如果在垃圾回收时引用相同)?
答案 0 :(得分:2)
Java与pass-by-value.一起使用,因此test2
和hello
只是参考副本。您仍然将信息保留在哪里以供参考。
消费者是否保留对原始对象的引用?
是的
作为附加知识,JLS, Section 15.13.3描述了方法引用的运行时评估。
方法引用表达式求值的时间比lambda表达式(第15.27.4节)更复杂。当方法引用表达式的::分隔符之前具有表达式(而不是类型)时,将立即对该子表达式求值。存储评估的结果,直到调用相应功能接口类型的方法为止;此时,结果将用作调用的目标参考。这意味着::分隔符之前的表达式仅在程序遇到方法引用表达式时才被评估,并且不会在随后对功能接口类型的调用上重新评估。