Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:在堆中创建一个没有引用的对象的目的是什么_Java_Object_Garbage Collection_Heap - Fatal编程技术网

Java:在堆中创建一个没有引用的对象的目的是什么

Java:在堆中创建一个没有引用的对象的目的是什么,java,object,garbage-collection,heap,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 stre

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

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); }
    }
publicstaticvoidmain(字符串[]args){
新建DemoSoap().request()//
请求()后,garbace collection是否会销毁该对象
方法

是的,一旦主方法结束,它将是GCd,对象的范围是主方法的大括号

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

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

请求()后,garbace collection是否会销毁该对象 方法

是的,一旦主方法结束,它将是GCd,对象的范围是主方法的大括号

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


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

关键是能够调用
请求
方法

是的,只要语句结束,对象就可以被丢弃


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

关键是能够调用
请求
方法

new DemoSoap().request();
是的,只要语句结束,对象就可以被丢弃

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

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.:我了解到,尽可能快地发布引用是一种很好的做法

创建
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.:我了解到,尽可能快地释放引用是一种好的做法。

是的,在保留作用域(
main()
方法)后,将收集对象


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

是的,在离开作用域(
main()
方法)后,对象将被收集


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

在您的情况下,关键是调用
request()
方法。如果没有对象实例,就无法调用它

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

比如说

 new JdbcDriver();

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

在您的情况下,关键是调用
request()
方法。如果没有对象实例,您就无法调用它

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

比如说

 new JdbcDriver();

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

有时您不再需要对象,您只需要调用一次方法。有时您需要创建一个对象,为另一个作为线程运行的对象插入指令。

有时您不再需要该对象,您只需要调用一次方法。有时您需要创建一个对象,为另一个作为线程运行的对象插入指令作为线程运行

没有对对象的引用有什么好处?@Luther如果不使用它为什么要有引用?@Luther:如果不使用它,有一个引用有什么好处?没有一个引用的好处是避免了一个无用的变量,并缩小了对象的范围。在某种程度上,我只使用了一次对象,并且我本可以为该唯一访问创建一个引用。是的,你可以,但是如果你在调用之后不使用该实例,该引用是无用的。不要添加无用的代码。没有对该对象的引用有什么好处?@Luther如果你不使用它,为什么要有一个引用?@Luther:如果你不使用它,有一个有什么好处?Th没有的好处