2

次の例のintbarのように、クラス内にフィールドを作成できます。

Class foo{
    int bar;
    foo(int bar){
         bar = bar;
    }

    int getBar() {
         return bar;
    }   

    void setBar(int bar) {
         bar = bar;
    }
}
  1. 別のクラスで新しいfooオブジェクトを作成するたびに、その特定のオブジェクト(fooのインスタンス)には、setBar()で変更したときにそのインスタンスにのみ影響し、他のインスタンスには影響しないbarプロパティがありますか?

  2. 上記の例では、barのようなプロパティのゲッターとセッターを作成する人をよく見かけます。怠惰で自分自身/楽しみのためにコードを書いているだけの場合FooInstance1.bar = 22;、セッターを書く代わりに、プロパティにアクセスしてこのクラスの任意のインスタンスのbarプロパティを変更できますか?問題と同じ効果があります1(インスタンスのみが変更されます)?

  3. Javaコンパイラはどのメソッドがコンストラクタであるかをどのように知るのですか?それがクラスと同じ名前を持っているという事実によって?または、関数ヘッダーで戻り値を指定しないという事実によって?おそらく、コンパイラーがコンストラクターであると考えることさえ問題ではありません(通常の関数間の構文上の違いはありません)、それは人々が関数の意味を区別するために使用する単なる意味論的なものである可能性があります。

編集:私はベストアンサーを選択するのに苦労しています。みんなから何か新しいことを学びました。ありがとう!

4

5 に答える 5

3

1)はい。そのとおりです。

2)はい、できますが、ベストプラクティスはゲッターとセッターを使用することです。このようにして、クラスの作成者は、getまたはsetで実行されることが保証されているプロパティの特別なロジックを記述できます。たとえば、一部のプロパティはその場で計算されたり、プロパティが変更されたときにリスナーに通知が送信されたりする場合があります。

3)コンストラクターは、戻り値がなく、クラスと同じ名前のメソッドです。コンストラクターはいくつでもかまいませんが、それぞれに引数タイプの一意の組み合わせが必要です。

于 2012-12-04T01:53:02.363 に答える
3
  1. はい、それはメンバー変数の動作です。インスタンスごとに1つのコピーが存在します。static一方、変数はクラスレベルの変数であり、1つのコピーがすべてのインスタンスで共有されます。

  2. メンバーを直接公開せず、メンバーにアクセスするためのゲッターを提供することをお勧めします。パブリックセッターは、オブジェクトの状態がどのように変更されるかをより適切に制御することも一般的に推奨されていません。ただし、パブリックとして宣言すると、直接変更することもできます。

  3. はい、コンストラクターは、戻り型とクラスの名前と同じ名前のない特別なメソッドです。

于 2012-12-04T01:53:50.503 に答える
2
  1. はい。それはまさにそれがどのように機能するかです。

  2. はい、できますが、フィールドをパブリックとして宣言する必要があります。

    public int bar;

    これは一般的に悪い考えであり、避けるべきであることに注意してください。

  3. はい、コンストラクターはクラスと同じ名前で、戻り型はありません。

ノート:

クラスの名前は常に大文字にする必要があります。

于 2012-12-04T01:51:47.230 に答える
2
  1. はい。
  2. はい、しかしそれは奨励されていません。OOを使用すると、インスタンス変数に関する情報を非表示にし、必要に応じてインスタンス変数へのアクセスを提供しようとしています。また、変数をに設定するpublicと、意図しない書き込みや特権のない読み取りの影響を受けやすくなります。
  3. Javaは、すべてのメソッドをそのシグネチャによって認識します。シグニチャは、その名前と引数タイプで構成されます。たとえば、mainメソッドのシグネチャはmain(String[])。です。コンストラクターは、クラスと同じ大文字と小文字を区別する名前を持つことで識別されます。

余談ですが、this.bar = bar代わりに使用するか、受信パラメータの名前を完全に変更することをお勧めします。コンストラクター内では、bar変数のスコープは渡されたものに対してローカルであるため、インスタンスレベルbarは割り当てられていません。

于 2012-12-04T01:56:42.117 に答える
1

Q1とQ3は良い答えを得ています。Q2に追加するものがあります:

楽しみのためにコードを書いている場合でも、アクセサーなしでは不可能な機能がいくつかあると、がっかりするかもしれません。

  1. フィールドの値を変更してはいけませんが、それでもフィールドへの読み取りアクセス権はあります。

  2. フィールド値を設定するときは、その検証メカニズムを提供することをお勧めします。セッター内で検証を行うことができます。

  3. リフレクション、シリアル化、モックオブジェクトなどで遊びたい場合は、ゲッターとセッターが必要です。

アクセサなしでは実現できない可能性のある機能をいくつか挙げてください。もっとたくさんあります!

于 2012-12-04T02:39:23.613 に答える