ジャワでは、
同じクラスの他のインスタンスでさえデータにアクセスできないように、オブジェクトはデータをカプセル化しますか? 「プライベート」というキーワードが使用されている場合のみ?Javaの「アクセサメソッド」とは何ですか? getName()のようなメソッド?
ありがとう
ジャワでは、
同じクラスの他のインスタンスでさえデータにアクセスできないように、オブジェクトはデータをカプセル化しますか? 「プライベート」というキーワードが使用されている場合のみ?Javaの「アクセサメソッド」とは何ですか? getName()のようなメソッド?
ありがとう
あるオブジェクトが別のオブジェクトにアクセスできるという観点からではなく、どのコードがオブジェクト内のどのデータにアクセスできるかという観点で考える傾向があります。
クラス内のJava(およびC#、btw)コードでは、同じクラスの任意のオブジェクトのプライベートメンバーにアクセスできます。次に、パッケージ/アセンブリ アクセスとパブリック アクセスを取得します。
注意が必要なのは保護されたアクセスです。これは、サブクラス内のコードへの一種のアクセスですが、ターゲット オブジェクトによって異なります。オブジェクトの保護されたメンバーにアクセスできるのは、オブジェクトの場所と同じ型のインスタンスである場合に限られます。コード、または一部のサブクラス -親クラスによって公開されている場合でも。たとえば、次のようなものがあるとします。
class Parent
{
protected int x;
}
class Child1 extends Parent
class Child2 extends Parent
class Grandchild extends Child1
次に、Child1
コード内で、 Parent.x
(コンパイル時に)Child1
またはのインスタンスであることがわかっているオブジェクトにのみアクセスできますGrandchild
。たとえば、new Parent().x
またはを使用できませんでしnew Child2().x
た。
いいえ、private フィールドは他のインスタンス (同じクラスのメソッド内) からでもアクセスできます。
ただし、同じインスタンス内であっても、サブクラスからアクセスすることはできません。
「外部」コードがクラス内のフィールドにアクセスできるようにするには、getter メソッドを提供します。どのゲッターを提供するか、どのように可視化するか、どのように実装するかはユーザー次第であるため、誰がどのようにデータにアクセスできるかについて多くの制御を行うことができます。
name
ある場合、実際にはフィールドが存在する必要はないことに注意してくださいgetName
。それは、そのデータがどこから来るゲッターの実装に完全に依存します。
ゲッター (またはセッター) がプライベート フィールドをラップするだけの場合でも、(フィールドへの直接アクセスを許可するのではなく) これらのセッターとゲッターを使用するのは適切なスタイルです。
getName() は名前 (フィールドまたはその他の「何か」) を返す必要があります。
フィールド/メソッドが「プライベート」であっても、それを許可しないカスタム セキュリティ マネージャーをインストールしない限り、リフレクション経由でアクセス/呼び出しできます。
Javaの「アクセサメソッド」とは何ですか? getName()のようなメソッド?
はい -名前付きの「プロパティ」のアクセサ メソッドですgetFoo()
。これはJavaBeans仕様の一部です。これらがパブリック フィールドよりも優先される理由は、getter のみを使用し (プロパティを読み取り専用にする)、追加の簿記を行い (派生フィールドの計算など)、設定値の検証を行う (値が受け付けできません)。setFoo()
foo
全体はもともと、「アプリケーションを構築する」ために JavaBeans をグラフィカルに構成および結合できるようにする GUI ツールで使用することを目的としていました。これは大部分が夢物語であることが判明しましたが、JavaBeans とプロパティの概念は通常のコーディングに役立ち、広く普及するようになりました。
多くの人がこの概念を誤解しており、「カプセル化」とは、プライベート プロパティをパブリックにするのではなく、セッターとゲッターを記述することを意味すると信じています。カプセル化とは、厳密に制御された方法を除いて、クラスの内部動作をまったく公開しないことを意味します。優れた OO 設計では、1 つのクラスに get メソッドが多すぎて、set メソッドがほとんどないようにする必要があります。
同じクラスの他のインスタンスでさえデータにアクセスできないように、オブジェクトはデータをカプセル化しますか?
もちろん、静的メンバーを使用していない場合。
このリンクから抽出:
場合によっては、すべてのオブジェクトに共通の変数が必要になることがあります。これは static 修飾子で実現されます。宣言に static 修飾子があるフィールドは、静的フィールドまたはクラス変数と呼ばれます