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
的实例来调用该方法。如果一个代码只是调用该方法,而对创建的实例pfDemoSoap
不做任何其他事情,那么引用就没有意义了
请求()后,garbace collection是否会销毁该对象
方法
是的,一旦主方法结束,它将是GCd,对象的范围是主方法的大括号
为什么我们创建一个没有引用的对象
request()
是一个非静态方法,我们需要类DemoSoap
的一个实例来调用该方法。如果一个代码只是要调用该方法,而对创建的实例pfDemoSoap
不做任何其他事情,那么就没有必要进行引用。关键是能够调用请求
方法
是的,只要语句结束,对象就可以被丢弃
请注意,在这段代码中,由于对象是在没有参数的情况下初始化的,除非有其他构造函数或方法,否则该方法似乎应该是静态的:实例似乎完全没有用处。关键是能够调用请求
方法
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没有的好处