修飾子


🐞 アクセス制御

クラスやメンバーへの可視性をコントロールする「アクセス制御」の考え方は次のとおりです。

(公開範囲が広い)
public => どのクラスからでも利用可能

protected => このクラスを継承したサブクラス、もしくは同一パッケージ内のクラスから利用できる

デフォルト(指定なし) => 同一パッケージ内のクラスからのみ利用可能

private => 同一クラス内からのみ利用可能
(公開範囲が狭い)

protectedは継承したサブクラスからもアクセスできるが、デフォルトはアクセスできないので注意。

アクセス制御の使い分け

  • フィールドは原則としてprivate。ただしクラスの用途によってはpublicも許容
  • 特定のクラスで使う下請け処理メソッドはprivateに。継承先で使うならprotectedに
  • パッケージ内でほかから呼ぶメソッドはパッケージ可視、パッケージ外ならpublicに
  • カプセル化(関心を1ヵ所にまとめて外から隠すことで変わらない部分を増やす)は重要

同一クラスの他オブジェクトに注意

同一クラスの他オブジェクトのprivateフィールドはアクセスできるので注意。

public class Sample {
private final String title; // privateフィールド
Sample(String title) { this.title = title; }
void exec(Sample sample) {
System.out.println(sample.title);
}

public static void main(String... args) {
Sample object1 = new Sample(title1);
Sample object2 = new Sample(title2);
object2.exec(object1); //=> title1を出力
}
}

🍮 クラス宣言の修飾子

修飾子 意味
public グローバル可視。書かないとパッケージ可視となります
final 拡張による継承を禁止します
abstract 抽象クラス(直接インスタンス化できないクラス)となります
strictftp クラス内に記述した浮動小数点の演算を厳密に評価

🐮 フィールド宣言の修飾子

修飾子 意味
public アクセス制御
protected アクセス制御
private アクセス制御
final フィールド変数への再代入を禁止
static クラスフィールド
volatile スレッド間での変数の値を同期

🐰 メソッド宣言の修飾子

修飾子 意味
public アクセス制御
protected アクセス制御
private アクセス制御
abstract 抽象メソッド
final オーバーライド不可
static クラスメソッド
synchronized 同期のためのロック獲得
strictftp 浮動小数点の演算を厳密に評価

🎳 変数にfinalをつけると再代入不可

finalを変数に付与した場合、再代入ができなくなります。(読み込み専用ではない)

final StringBuilder sb1 = new StringBuilder("012");
sb1 = new StringBuilder("345"); //再代入はコンパイルエラー

final StringBuilder sb2 = new StringBuilder("012");
sb2.append("345"); // 変更なのでOK

👽 参考リンク

🖥 VULTRおすすめ

VULTR」はVPSサーバのサービスです。日本にリージョンがあり、最安は512MBで2.5ドル/月($0.004/時間)で借りることができます。4GBメモリでも月20ドルです。 最近はVULTRのヘビーユーザーになので、「ここ」から会員登録してもらえるとサービス開発が捗ります!

📚 おすすめの書籍