1

我遇到的代码是这样的,创建了一个对象并调用了它的方法:

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); }
    }
  • request() 方法后对象会被垃圾回收销毁吗?
  • 在这种情况下,在没有引用的情况下在堆中创建对象有什么好处?
4

6 回答 6

5

关键是能够调用该request方法。

是的,一旦语句结束,对象就会被丢弃。

请注意,在这段代码中,由于对象是在没有参数的情况下初始化的,除非有其他构造函数或方法,否则该方法似乎应该被设为静态:实例似乎完全没用。

于 2013-07-17T10:15:50.753 回答
2

request() 方法后对象会被垃圾回收销毁吗?

是的,只要 main 方法结束,它就会被 GCd,对象的范围是 main 方法的大括号

为什么我们创建一个没有引用的对象?

request()是一个非静态方法,我们需要一个类的实例DemoSoap来调用该方法。如果代码只是调用方法而不对创建的实例 pf 做任何其他事情DemoSoap,那么引用就没有意义了。

于 2013-07-17T10:15:35.427 回答
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 .

}

PS:我了解到,在可以合理发布的情况下尽快发布引用是一种很好的做法。

于 2013-07-17T10:16:42.480 回答
0

有时您不再需要该对象,您只想调用一次方法。有时您需要创建一个对象来检测另一个作为线程运行的对象

于 2013-07-17T10:24:27.323 回答
0

main()是的,在离开范围(方法)后,对象将被收集。

同样在您的情况下,整个程序将结束,因此退出程序后不再需要处理对象。

于 2013-07-17T10:17:15.260 回答
0

在您的情况下,关键是调用该request()方法。你不能在没有对象实例的情况下调用它。

在一般情况下,即使是构造函数也可能有有用的副作用(尽管这肯定不是受鼓励的设计选择),因此即使您根本不使用实例,您也可能想要调用它。

例如

 new JdbcDriver();

将数据库驱动程序注册到 JDBC 的全局注册表中,以便它了解该驱动程序的连接字符串(在您通过这种技巧或更“正确”的方式注册驱动程序之前它不会这样做)。

于 2013-07-17T10:20:41.157 回答