Java Language
可視性(クラスのメンバーへのアクセスを制御する)
サーチ…
構文
- パブリックタイプ名[=値];
- プライベートタイプ名[=値];
- 保護された型名[=値];
- タイプ名[=値];
- パブリッククラス名{
- クラス名{
備考
Javaチュートリアルから:
アクセス・レベル修飾子は、他のクラスが特定のフィールドを使用できるか、特定のメソッドを呼び出すことができるかどうかを決定します。アクセス制御には2つのレベルがあります。
- トップレベル -
public
、またはパッケージ - プライベート (明示的修飾子なし)。 - メンバレベル -
public
、private
、protected
、 package-private (明示的修飾子なし)。
クラスは、修飾子public
で宣言することができます。この場合、そのクラスはすべてのクラスすべてで可視です。クラスに修飾子がない場合(デフォルトはpackage-privateとも呼ばれます )、それはそれ自身のパッケージ内でしか見ることができません。
メンバレベルでは、トップレベルクラスの場合と同様にpublic
修飾子を使用することも、同じ修飾子を使用しない( package-private )こともできます。メンバーには、さらに2つのアクセス修飾子、 private
とprotected
ます。 private
修飾子は、そのメンバーが独自のクラスでのみアクセス可能であることを指定します。 protected
修飾子は、そのメンバが( package-privateのように )それ自身のパッケージ内だけでアクセスでき、さらにそのクラスのサブクラスによって別のパッケージにアクセスできることを指定します。
次の表は、各修飾子で許可されているメンバーへのアクセスを示しています。
アクセスレベル:
モディファイア | クラス | パッケージ | サブクラス | 世界 |
---|---|---|---|---|
public | Y | Y | Y | Y |
protected | Y | Y | Y | N |
修飾子なし | Y | Y | N | N |
private | Y | N | N | N |
インタフェースメンバ
public interface MyInterface {
public void foo();
int bar();
public String TEXT = "Hello";
int ANSWER = 42;
public class X {
}
class Y {
}
}
public
キーワードが省略されていても、インターフェースメンバーは常に公開されます。したがって、 foo()
、 bar()
、 TEXT
、 ANSWER
、 X
、およびY
両方が公開されています。 MyInterface
は公開されているため、どこからでもアクセスできますが、 MyInterface
パッケージの可視性があった場合、そのメンバーは同じパッケージ内からのみアクセスできます。
一般公開
クラス、パッケージ、およびサブクラスに表示されます。
Testクラスの例を見てみましょう。
public class Test{
public int number = 2;
public Test(){
}
}
では、クラスのインスタンスを作成しようとします。この例では、 public
いるためnumber
アクセスできます。
public class Other{
public static void main(String[] args){
Test t = new Test();
System.out.println(t.number);
}
}
私的な可視性
private
可視性は、そのクラスによってのみ変数にアクセスできるようにします。彼らはしばしばpublic
ゲッターやセッターと一緒に使用されます。
class SomeClass {
private int variable;
public int getVariable() {
return variable;
}
public void setVariable(int variable) {
this.variable = variable;
}
}
public class SomeOtherClass {
public static void main(String[] args) {
SomeClass sc = new SomeClass();
// These statement won't compile because SomeClass#variable is private:
sc.variable = 7;
System.out.println(sc.variable);
// Instead, you should use the public getter and setter:
sc.setVariable(7);
System.out.println(sc.getVariable());
}
}
パッケージの可視性
修飾子を使用しない場合のデフォルトは、package visibilityです。 Javaドキュメンテーションから、 「[package visibility]は、クラスと同じパッケージ内のクラス(その親に関係なく)がメンバにアクセスできるかどうかを示します。 javax.swing
この例では、
package javax.swing;
public abstract class JComponent extends Container … {
…
static boolean DEBUG_GRAPHICS_LOADED;
…
}
DebugGraphics
は同じパッケージに含まれているため、 DEBUG_GRAPHICS_LOADED
にアクセスできます。
package javax.swing;
public class DebugGraphics extends Graphics {
…
static {
JComponent.DEBUG_GRAPHICS_LOADED = true;
}
…
}
この記事では、このトピックの背景について説明します。
保護された可視性
保護された可視性の原因は、このメンバーがそのサブクラスとともにパッケージで可視であることを意味します。
例として:
package com.stackexchange.docs;
public class MyClass{
protected int variable; //This is the variable that we are trying to access
public MyClass(){
variable = 2;
};
}
次に、このクラスを拡張し、 protected
メンバーの1つにアクセスしようとします。
package some.other.pack;
import com.stackexchange.docs.MyClass;
public class SubClass extends MyClass{
public SubClass(){
super();
System.out.println(super.variable);
}
}
protected
メンバーに同じパッケージからアクセスしている場合は、そのメンバーを拡張せずにアクセスすることもできます。
この修飾子はクラスのメンバーでのみ動作し、クラス自体では動作しないことに注意してください。
クラスメンバアクセス修飾子の概要
アクセス修飾子 | 可視性 | 継承 |
---|---|---|
プライベート | クラスのみ | 継承することはできません |
修飾子 /パッケージなし | パッケージ内 | パッケージのサブクラスの場合に使用可能 |
保護された | パッケージ内 | サブクラスで利用可能 |
パブリック | どこにでも | サブクラスで利用可能 |
メソッドや変数に適用してパッケージ外のサブクラスからアクセスできるようにするprivate protected
(一度に両方のキーワード)修飾子がありましたが、そのパッケージ内のクラスに対して非公開にしました。ただし、これはJava 1.0のリリースでは削除されました 。