2015-11-23 7 views
5
class my_class { 

    int a = 8; 

    my_class() { 
     System.out.println(a); 
    } 
} 

public class NewClass { 

    public static void main(String[] argue) { 

     new my_class(); 

     new my_class(); 

    } 
} 

メインメソッド(new my_class();)の2つのステートメントを理解できません。新しいキーワードはここで何をしますか?

私はオブジェクト定義を除いてこの文を見たことがありません。私は、新しいキーワードがオブジェクトのメモリを割り当て、参照アドレスを割り当てていることを知っていますが、この場合に起こっていることは全くあいまいです。何のためにメモリを割り当てるか?

ここで新しいキーワードは何ですか?これが何であれ、私はこのステートメントを使って、mainメソッドからコンストラクターを明示的に呼び出すことができます。私は教科書やインターネットのどこにでもそのような声明を見つけることができませんでした。

+2

これは "悪いコードの書き込み"と呼ばれています...これはコンストラクタの副作用をコンソールに何かを表示するために使用します! – ParkerHalo

+2

@ParkerHalo trueまた[this](http://stackoverflow.com/questions/7019754/what-does-the-new-keyword-actually-do-in-java-and-should-i-avoid-creating)もご覧ください。 -new) – Neijwiert

+2

この質問に間違いはありません。 VB6とVBAに相当するものは許可されていません。ロジックだけではこのIMOに対処できません。 – Bathsheba

答えて

6

new my_class()は、タイプmy_classの新しいオブジェクトを作成します。割り当てられていません。それは廃棄されます。

しかし、破棄される前に、オブジェクトはとにかくビルドされます。コンストラクタが実行され、オブジェクトのa属性値が出力されます。 8.

2

これらの2行は、my_classのオブジェクトを作成しており、ヒープにメモリを割り当てています。しかし、参照をどこにも保存していないので、後でそれらのオブジェクトを参照することはできません。

2

new my_class();は、デフォルトのコンストラクタmy_classと呼びますが、新しく作成したオブジェクトへの参照も返します。

もちろん、その参照を破棄することは自由です。

これはここで起こっていることです。参照を保持しない場合、作成されたオブジェクトはすぐにガベージコレクションの対象となる可能性があります。

0

このコードは実際にmy_classという2つのオブジェクトを作成しますが、このオブジェクトは参照でバインドされていないため、GCによってまもなく削除されます。これは、例としてcallと似ています。

int Check() { } 

、それは

object.Check(); 

、それ意志作品と呼ばれることがあります。

関連する問題