12

私は独学でJavaを学んでいます。クラスを定義する範囲は理解していますが、空のコンストラクターを使用するという概念はまだわかりません。
通常、コンストラクターにパラメーターを渡して、インスタンス オブジェクトを構築する必要があります。しかし、コンストラクターの空のパラメーターをよく見かけます。例えば:

 class Person {
   String name;
       int age; 

 public Person();

 public Person(String name, int age){
     this.name = name;
     this.age = age;
     } 
 }

クラス「魚」を使用して説明する例を調査して読みました。クラスを定義するときは、まずオブジェクトのプロパティを定義し、次にメソッドを使用してオブジェクトを構築するコンストラクタを作成します。空のコンストラクターは GENERIC オブジェクトをビルドし、パラメーターを持つコンストラクターはより具体的な情報を持つオブジェクトをビルドします。上記の例で、空のコンストラクターを使用してインスタンス オブジェクトを作成するとします。

Person p1 = new Person();  

-- オブジェクトは作成されますが、プロパティはありませんか? では、空のコンストラクターは正確には何に使用されるのでしょうか? 多くのサンプルコードで見ました。それは非常に有用/一般的ですか?

見て答えてくれてありがとう!

4

6 に答える 6

12

パラメーター付きのコンストラクターを作成する場合は、デフォルトのコンストラクターを宣言する必要があります (使用する場合)。

class Person {
    String name;
    int age; 

    public Person(String name, int age){
        this.name = name;
        this.age = age;
    } 
 } 

あなたは今これを行うことはできません:

Person p = new Person();

「デフォルト」のコンストラクター (パラメーターなし) を使用するには、次のように宣言する必要があります。

class Person {
    String name;
    int age; 

    public Person(){
        name = "Man With No Name";  //sometimes you will want to set the variables 
        age = 21;     //to some default values
    }

    public Person(String name, int age){
        this.name = name;
        this.age = age;
    } 
 } 
于 2013-09-24T23:53:09.043 に答える
11

デフォルトのコンストラクターを定義する一般的な理由は 3 つあります。

  • デフォルト値でオブジェクトを構築すること。
  • その初期化プロセスでパラメーターを必要としないオブジェクトを初期化する。
  • コンストラクターのスコープを再定義します。コンストラクターを非公開にすると、クラス自体以外はオブジェクトを構築できなくなります。
于 2013-09-24T23:51:39.173 に答える
3

他の答えが来ると確信していますが、要するに-

空のコンストラクターは、そのオブジェクトのインスタンスを提供するだけです。その上でセッターを使用して、必要なプロパティを設定できます。作成されたインスタンスが常に有効で、メンバー変数が常に初期化されるようにしたい場合は、必要なすべてのメンバー変数を初期化するコンストラクターを定義します。

また、Spring のようなフレームワークを使用する場合、setter インジェクションを使用してプロパティが設定されるデフォルト コンストラクターがよく使用されます。

于 2013-09-24T23:52:01.897 に答える
2

通常、空のコンストラクターは「デフォルト」です

Person() { 
    // This will cause you to not have any name or age values
}

それでは、デフォルトの Person が必要だとしましょう:

Person() { 
    this("Steven",20);
}

このようにして、空でないコンストラクターを呼び出しますが、常に同じ人がいます

于 2013-09-24T23:49:25.417 に答える
2

最近の Java で書かれた多くのソフトウェアは、特別な JVM 機能 (リフレクションと呼ばれる) を使用して実行時にコードを直接操作するフレームワークを利用して、コードを介してアクセスするのではなく、クラスに直接アクセスしてそれを操作するだけです。あなたは実際に書いた。

このようなライブラリの一般的な例の 1 つは Hibernate です。「魔法のように」リレーショナル データベースから情報を取得し、データベースの値をオブジェクトのフィールドに割り当てます。クラスは、実行時に追加されたコードによって強化され、魔法のようにデータベースの内容にマップされます。

「デフォルト」のコンストラクターを持たないクラスを操作するのは本当に骨が折れるというのは、リフレクション API の結果です。プログラムで解釈できる方法でクラスのコンストラクターを正しく使用する方法について、多くの追加情報を提供する必要があります。

代わりに、ツールは、実行時にクラスを簡単に拡張できるように、クラスが空のデフォルトのコンストラクターを持つことを要求するだけです。

したがって、特定の値を指定せずにオブジェクトを作成することが、プログラムの API によっては意味をなさない場合でも、常に空のコンストラクターを残す傾向があります。

于 2013-09-24T23:54:55.070 に答える
0

「空の」(デフォルト) コンストラクターを定義するかどうかによって、特定のフィールドを設定する必要があるかどうかを、自分自身や他の開発者に明確にすることができます。(コンストラクターがそれらを要求する場合、それらは必須です。)

一部のライブラリ (Google GSON、ORM など) では空のコンストラクターが必要ですが、これは技術的な理由によるものです。

心に留めておくべきもう 1 つのことは、通常、コンストラクターを介して割り当てられたフィールドを として宣言できることです。これは、final最適化と、オブジェクトの有効期間中にフィールドが変更されないことを明確にするための両方です。

しかし、それはすべて、状況と何をしようとしているかによって異なります。

于 2013-09-24T23:51:56.353 に答える