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です。

はい、ステートメントが終了するとすぐに、オブジェクトをガベージできます。

このコードでは、オブジェクトがパラメーターなしで初期化されるため、他のコンストラクターまたはメソッドがない限り、メソッドを static にする必要があるように見えることに注意してください。インスタンスはまったく役に立たないようです。

于 2013-07-17T10:15:50.753 に答える
2

request() メソッドの後、オブジェクトはガベージ コレクションによって破棄されますか?

はい、メイン メソッドが終了するとすぐに GCd になります。オブジェクトのスコープはメイン メソッドのブレースです。

参照なしでオブジェクトを作成するのはなぜですか?

request()は非静的メソッドであり、DemoSoapそのメソッドを呼び出すにはクラスのインスタンスが必要です。また、コードがメソッドを呼び出すだけで、作成されたインスタンス pf に対して他に何もしない場合DemoSoap、参照を持つ意味はありません。

于 2013-07-17T10:15:35.427 に答える
0

あなたの場合、ポイントはrequest()メソッドを呼び出すことです。オブジェクトインスタンスなしで呼び出すことはできません。

一般に、コンストラクターでさえ有用な副作用を持つ可能性があるため (ただし、これは推奨される設計上の選択ではありません)、インスタンスをまったく使用しない場合でも呼び出したい場合があります。

例えば

 new JdbcDriver();

データベース ドライバーを JDBC のグローバル レジストリに登録し、そのドライバーの接続文字列を理解できるようにします (このトリックまたはより適切な方法でドライバーを登録する前には理解できませんでした)。

于 2013-07-17T10:20:41.157 に答える
0

場合によっては、オブジェクトが不要になり、メソッドを 1 回だけ呼び出したい場合があります。スレッドとして実行される別のオブジェクトを計測するオブジェクトを作成する必要がある場合があります

于 2013-07-17T10:24:27.323 に答える