Java での次の変数のアクセシビリティの違いは何ですか?
public class Joe {
public int a;
protected int b;
private int b;
int c;
}
私は最後の人が何をしているのかに最も興味があります。
Java での次の変数のアクセシビリティの違いは何ですか?
public class Joe {
public int a;
protected int b;
private int b;
int c;
}
私は最後の人が何をしているのかに最も興味があります。
public
: 誰でも読み書き可能protected
: サブクラスのインスタンスに対して、およびそれを囲むパッケージ内から読み取り/書き込み可能private
: クラスの任意のインスタンスおよび内部または外部 (囲んでいる) インスタンスに対して読み取り/書き込み可能int c
: package-private、同じパッケージ内のすべてのクラスに対して読み取り/書き込み可能詳細については、JLSを参照してください。
編集:アクセスが同じパッケージ内から許可されていることを示す保護されたコメントを追加しました。皆さんは完全に正しいです。へのコメントも追加private
。今思い出した…;-)
以前の回答の修正に回答して申し訳ありませんが、直接変更するのに十分な評判がありません...
public
- 誰でも読み書き可能protected
- インスタンスのサブクラスと同じパッケージ内のすべてのクラスの読み取り/書き込み可能int c
: package-private、同じパッケージ内のすべてのクラスに対して読み取り/書き込み可能private
- そのクラス自体と内部クラス (存在する場合) の任意のメンバーに対して読み取り/書き込み可能このように、アクセス修飾子を最も広いアクセス ( public
) から最も狭いアクセス ( ) の順序にすることをお勧めします。これは、狭いアクセスから広いアクセスに移行private
しても、可能性が失われないことを知っているためです。
これは、同じパッケージ内のクラスが (そのサブクラスだけでなく) クラスの保護されたメンバーにもアクセスできると誤解されることが多い「保護された」場合に特に重要です。
パッケージレベルのアクセスを完全に回避しようとしています(あなたが言及した最後のアクセス)。
私はクラスを自己完結型に保つのが好きです。別のクラスが私のクラス内の何かにアクセスする必要がある場合は、そうする必要がありますpublic
(属性ではなくメソッドによる必要があります)。それ以外の場合は、抽象化 VS 情報隠蔽 VS カプセル化で説明されているように、カプセル化が壊れていると感じます。
これらはすべてコンパイル時の保護であり、実行時にリフレクションを介して簡単にオーバーライドできます。