アクセス修飾子
|アクセス修飾子 |アクセス可能 |クラス図での記号
|---|---|---|---|
|public |どこからでも |+
|protected |同一パッケージのクラスとサブクラス |#
| |同一パッケージのクラス |~
|private|現在のクラス |-
許可されていない箇所からのアクセスはコンパイルエラーとなる
アクセス修飾子を考慮する必要があるもの
・クラス(別パッケージからアクセス可能か判断するため)
・メソッド
・コレクション(配列、ArrayList)
・フィールド
アクセス修飾子の注意点
インターフェースとアクセス修飾子
インターフェースは継承される前提のものなので、インターフェース自体は暗黙的にpublicとみなされる
→ インターフェースに定義できるメソッド
・抽象メソッドの場合、暗黙的にpublic、abstractであると解釈される(public、abstractは省略可)
・実装を持つ場合、staticメソッドまたはdefaltメソッドである必要がある(アクセス修飾子に制限無し。privateも可)
→ インターフェースに定義できるフィールド
・static変数(publicのみ)
・定数(publicのみ)
・インスタンス変数を定義することはできない
【インターフェースを実装したクラスの具象メソッド】
インターフェースに定義された抽象メソッドのアクセス修飾子と、インターフェースを実装たクラスにある、抽象メソッドを実装した具象メソッドは同じアクセス修飾子である必要がある。
例) ※コンパイルエラー発生
interface A(){
void doSomething(); //インダーフェースの抽象メソッド。暗黙的にpublicと解釈される
}
B implements A(){
protected void doSomething(){ //コンパイルエラー。アクセス修飾子はインターフェースの抽象メソッドと同じ「public」である必要
//処理
}
}
抽象クラスとアクセス修飾子
抽象クラスは継承される前提のものなので、抽象クラス(abstractで修飾)は暗黙的にpublicとみなされる
→ 抽象クラスに定義できるメソッド
・抽象メソッドの場合、abstractでの修飾が必要。抽象メソッドはオーバーライドされる前提のメソッドなので、アクセス修飾子はprivate以外を設定できる
・具象メソッドの場合、アクセス修飾子は自由に設定できる
→ 抽象クラスに定義できるフィールド
・設定に制限無し
※メソッドをオーバーライドするときのアクセス修飾子は、元のメソッドと同じか制限を緩くする必要がある
例)
interface A {
void doSomething();
}
abstract class B implements A {
public abstract void doSomething(); //インターフェースを抽象メソッドで実装可能。アクセス修飾子はインターフェースのメソッドと同じ
}
class C extends B {
public void doSomething(){ //抽象メソッドをオーバーライド。
System.out.println("何かする");
};
}
public class Main {
public static void main(String[] args) {
C example = new C();
example.doSomething();
}
}