我遇到的代码就是这样,创建了一个对象并调用了它的方法:
public static void main(String[] args) {
new DemoSoap().request(); //<----how come there is no reference?
}
private void request() {
try {
// Build a SOAP message to send to an output stream.
SOAPMessage msg = create_soap_message();
// Inject the appropriate information into the message.
// In this case, only the (optional) message header is used
// and the body is empty.
SOAPEnvelope env = msg.getSOAPPart().getEnvelope();
SOAPHeader hdr = env.getHeader();
// Add an element to the SOAP header.
Name lookup_name = create_qname(msg);
hdr.addHeaderElement(lookup_name).addTextNode("time_request");
// Simulate sending the SOAP message to a remote system by
// writing it to a ByteArrayOutputStream.
out = new ByteArrayOutputStream();
msg.writeTo(out);
trace("The sent SOAP message:", msg);
SOAPMessage response = process_request();
extract_contents_and_print(response);
}
catch(SOAPException e) { System.err.println(e); }
catch(IOException e) { System.err.println(e); }
}
答案 0 :(得分:5)
重点是能够调用request
方法。
是的,一旦语句结束,该对象就可以被攻击。
请注意,在此代码中,由于对象是在没有参数的情况下初始化的,除非有其他构造函数或方法,否则该方法似乎应该是静态的:实例似乎完全没用。
答案 1 :(得分:2)
在请求()之后,对象是否会被garbace集合破坏 方法
是的,一旦main方法结束,它将是GCd,对象的范围是主方法的大括号
为什么我们创建一个没有引用的对象?
request()
是一个非静态方法,我们需要一个类DemoSoap
的实例来调用该方法。如果一个代码只是调用该方法而不对创建的实例pf DemoSoap
做任何其他事情,那么就没有必要参考。
答案 2 :(得分:1)
new DemoSoap().request();
创建DemoSoap
的对象并调用其方法request()
,该对象符合GC的条件。实例化该对象的唯一目的是一次性调用request()
,因此不需要为将来保留对该对象的引用。在你的特殊情况下,我认为它没有多大区别。
但是对将来不需要的对象进行不必要的控制可能会很糟糕。假设,
void somemethod() {
Demo demo = new Demo();
demo.request(); // purpose of demo ends here .
.......
........
lots of processing in between
.......
// demo still refers to an object in heap uselessly .
}
P.S。:我了解到,尽可能快地发布参考资料是一种很好的做法。
答案 3 :(得分:0)
是的,对象将是在范围(main()
方法)离开后收集的垃圾。
同样在你的情况下,完整的程序将结束,因此在退出程序后不再需要处理对象。
答案 4 :(得分:0)
在您的情况下,重点是调用request()
方法。如果没有对象实例,你就无法调用它。
在一般情况下,即使构造函数也可以产生有用的副作用(虽然这当然不是鼓励的设计选择),所以即使你根本不使用实例,也可能想要调用它。
例如
new JdbcDriver();
将数据库驱动程序注册到JDBC的全局注册表中,以便它理解该驱动程序的连接字符串(在您通过此技巧注册驱动程序之前不会这样或者更“正确”的意思)。
答案 5 :(得分:0)
有时您不再需要该对象,您只想调用一次方法。有时您需要创建一个对象来检测另一个作为线程运行的对象