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のリリースでは削除されました 。