0

Java に関して 2 つのかなり初歩的な質問があります。

まず、java.awt.* をインポートしても java.awt.geom.* がインポートされないのはなぜですか? java.awt.geom 内のすべてが java.awt 内にあるのではありませんか? パッケージの名前から判断すると、そう思います。

第二に、私の教授は、この長方形作成プロジェクトについて、インスタンス変数に直接アクセスするのは良くないので、代わりにアクセサ メソッドを使用する必要があると教えてくれました。何故ですか?コンベンションだけですか?例えば:

Rectangle rectangle = new Rectangle(1, 2, 3, 4);

int tallness = rectangle.height; //"bad"

int tallness = rectangle.getHeight(); //"good"

私の理解では、どちらも有効であり、まったく同じことを行います。唯一の違いは、前者の方が速く感じられることです。

さらに、アクセサがこのサイトのスペルチェッカーでスペルミスとして表示されるのはなぜですか? (または、Chrome のスペルチェッカーかもしれません)

4

4 に答える 4

1

まず、java.awt.* をインポートしても java.awt.geom.* がインポートされないのはなぜですか? java.awt.geom 内のすべてが java.awt 内にあるのではありませんか?

いいえ。

パッケージ geom のすべてのクラスを取得するには、作成する必要がありますjava.awt.geom.*

私の教授は、この長方形作成プロジェクトについて、インスタンス変数に直接アクセスするのは良くないので、代わりにアクセサ メソッドを使用する必要があると教えてくれました。

はい、あなたの教授は正しいです。

その理由は、データのカプセル化です。

  • オブジェクトの一部のコンポーネントへのアクセスを制限するための言語メカニズム。
  • データを操作するメソッド (または他の関数) とデータのバンドルを容易にする言語構造。

カプセル化の詳細を読む

于 2013-09-26T04:34:56.497 に答える
0

java.awt.* をインポートしても java.awt.geom.* がインポートされないのはなぜですか? java.awt.geom 内のすべてが java.awt 内にあるのではありませんか? パッケージの名前から判断すると、そう思います。

パッケージの名前は誤解を招くものです。java.awtや などの名前が付けられていますjava.awt.geomが、実際にはまったく別のパッケージです。Java には、実際には「パッケージ階層」はありません。

 import java.awt.*;

パッケージ内のすべてのクラスをインポートします。はクラスが異なる別のパッケージであるjava.awtため、そのパッケージもインポートする必要があります。java.awt.geom階層名は主に組織用です!

インスタンス変数に直接アクセスするのはまずいので、代わりにアクセサ メソッドを使用する必要があります。何故ですか?コンベンションだけですか?

カプセル化について Sotirios Delimanolis が言ったことは良かったのですが、オブジェクト指向プログラミングでは、ユーザー (またはパッケージを使用するプログラマー) がクラスのカプセル化で何をできるかをプログラマーが決定する責任があるというのが一番の説明だと思います。メンバー変数。

そのため、メンバー変数を作成するのが慣例ですprivate。オブジェクトに格納されたデータはオブジェクトの責任であり、定義したメソッド介してそのオブジェクトとのインターフェイスが適切に機能することを確認するのは、プログラマとしてのあなたの仕事です。したがって、誰かがオブジェクトのデータを直接変更できるようにしたい場合は、そのためのメソッドsetを作成できます。

次のようなことを考えてみましょう:

 Pizza myPizza = new Pizza(18) //18-inch pizza. Yum!

これを行うと、ピザはnumSlices(現在はカットされていないため 1) やpizzaLeft((18/2)^2 * pi インチ) などの他の変数メンバーを計算します。どちらがより理にかなっていますか?

 myPizza.pizzaLeft -= 50; //50 inches of pizza eaten
 myPizza.pizzaLeft; //returns about 204.47

また

 myPizza.slice(8); // cut into 8 pieces which are about 32 square inches each
 myPizza.eat(1); // eat one slice
 myPizza.getPizzaLeft(); //returns about 222.47

ピザを扱っているので、スライスしてスライスして食べる方が理にかなっています. pizzaLeftピザ オブジェクト自体は、 やなどの変更を計算する責任がありslicesLeft、クラスとやり取りするオブジェクトはそれを認識しません。

これは、メンバー変数が慣習的に に設定されているためprivateです。これは、アクセサー メソッドを使用する必要があることを意味します。

これが役立つことを願っています。

于 2013-09-26T06:17:34.187 に答える
0

と書くjava.awt.*と、awt パッケージ内に存在するクラスのみをインポートします awt パッケージ内にいくつかのパッケージが存在する場合はインポートしません。 java.awt.geomこの場合、geom は別のパッケージなので、必要なすべてのクラスをインポートするにはjava.awt.geom.*

パッケージの詳細については、ここをクリックしてください

于 2013-09-26T04:31:38.063 に答える
0
int tallness = rectangle.height; //"bad"

int tallness = rectangle.getHeight(); //"good"

これは、後者の場合、あなたのコードを使用する他のプログラマーは、getterおよびsetterメソッドを使用して高さ変数を宣言してカプセル化するのとrectangle.height同じように、コードを使用してランダムな値を割り当てることによっての値を変更できないためです。rectangle.height= 5;private

于 2013-09-26T04:35:15.267 に答える