Java:在没有引用的情况下在堆中创建对象的目的是什么

时间:2013-07-17 10:14:29

标签: java object garbage-collection heap

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

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); }
    }
  • 该对象是否会在之后被garbace收集所破坏 request()方法?
  • 在没有引用的情况下在堆中创建对象有什么好处,如本例所示?

6 个答案:

答案 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)

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