【解説】理解不足でエラー祭り!?Javaのアクセス制御を理解する努力をする!

  • URLをコピーしました!


こんにちは、Javaと聞いて最初「ジャワカレー」を連想した、おたんこなすウルフです。

Javaの学習中に出てくるアクセス制御

「ふ~ん、アクセス制御ってこんな感じなんだ~」

という程度の理解だったけど

学習をすすめるにつれ、コイツがコンパイルエラーに関わるけっこう重要なモノだということに気づきました。

今までのエラーの原因の7割くらいがアクセス制御が原因だったので、、、

謎の狼

しかも、アクセス制御って4種類もあって、役割も千差万別。ややこしいんだよな!

重要なんだけど、Java初学者に(多分)軽視されがちなアクセス制御

コイツについて理解しようと努力をしてみる。

今日はそんな記事内容です!

目次

Javaのアクセス制御を理解する努力の序章

Javaのアクセス制御とは?

アクセス制御とは?

アクセス制御とは、見える範囲を制限するための仕組みです。

場所によってアクセスができるできないを、分けるために使うモノですね。

変数、メソッド、クラスなどへのアクセスを制限します。

謎の狼

なんだかよくわからない人は「ファイルの行き来を制限するモノ!」というように理解しておけばいいぞ!。

実際にアクセス制御するためには、のちに紹介するアクセス修飾子たるものを使います。

アクセス制御を適当にやって、エラーに悩みました

アクセス制御と聞いてアレルギー反応が出る人は

「もういいや、あとで理解しよう」

というようになると思うんですけど、私はこういった考えで適当にやって

コンパイルエラーに悩みました、、、

勉強しているテキストの12章あたりからかな?コンパイルエラーが頻発しました。

なかなか、解決できずに奮闘した結果、アクセス修飾子を変更することで、解決。

当時は意味を全く理解できないまま解決してしまいました。

その後も同じようなエラーにつまづくという悪循環。

この時思いましたね「アクセス制御をしっかり理解しよう」…と

制御するには、アクセス修飾子を使う!

制御するにはアクセス修飾子というものを使用し、記述する時は

  • アクセス修飾子 クラス名 {}
  • アクセス修飾子 型名 フィールド名;
  • アクセス修飾子 型名 メソッド名(引数, …) {}

以上のように指定してあげます。

アクセス修飾子に入る種類としては計4種類

  • private
  • デフォルト(記載なし)
  • protected
  • public

それぞれ役割も制御できる範囲も違います。

次からは、私が頭を抱えてまとめたアクセス修飾子について、極力簡単に紹介していきます!

Java|アクセス修飾子の種類と役割

private

最も範囲の狭いアクセス修飾子

同じclass内でのみ参照できる修飾子となっております。

謎の狼

家の中から決して出ることのない引きこもりタイプ、それがprivateなんだ!

※classには指定できません。

デフォルト(記述なし)

2番目に範囲の狭いアクセス修飾子

同じクラス名、同じ名前空間でのみ参照できます。

謎の狼

名前空間という地域から出ることのない、地元大好きなマイルドヤンキーがデフォルトなんだ!

名前空間とは?

名前空間は同じ名前のクラスを分けるようにしています。

同じ名前のクラスを分けるのにパッケージというものを使用し、クラスファイルをまとめています。

パッケージを使用すると。

上の写真のようにパッケージごとにクラスファイルを管理することができます。

最近ウマ娘にハマっているので、ウマ娘で例えさせて頂きますと

  • メジロマックイーン
  • メジロドーベル
  • メジロライアン

同じメジロの名のもとに生まれていますが、名前が違いますよね。

これらをパッケージごとに分けてあげると

こんな感じになります。

謎の狼

ややこしかったら、とりあえず「パッケージ=フォルダ」というように理解しておけばいいぞ!

protected

デフォルトアクセス修飾子に加えて、継承したサブクラスのメソッドからも参照できます。

サブクラスに関しては名前空間が異なっていても参照できます。

謎の狼

地方から東京に引っ越してきて、方言は残りつつも東京に染まってしまった人がprotectedなんだ!

※classには指定できません。

public

最も広いアクセス修飾子

どのような場所からでも参照可能な万能タイプです。

たいていのテキストで記載されていることでしょう。

謎の狼

世界中どこにでもいける、フットワークの軽いワールドワイド、それがpublicです。


※ただし、名前空間が違う場合は参照元のclassにもpublicを指定する必要あり。

Java|アクセス制御を覚えるため体験してみる

プログラミングを理解するコツは

コードを書いて実行してみること!

てなわけで、実際にアクセス制御を体験してみましょう!

謎の狼

先ほどの解説も頭に入れながら、実行してくれよな!

実行時のルール
  • コピペして実行してみる。
  • うまくコンパイルできなければ、解決方法検索してみる。

Javaの動作環境が構築できていない人はこちら!

アクセス修飾子①:private

サンプルコード
class Private {
    private int field = 0;

    private void method() {
        System.out.println("メソッドを呼び出すよ!");
    }

    void test() {
        System.out.println(this.field);
        this.method();
    }

    /* コンパイル確認用 */
    public static void main(String[] args) {
        Private a = new Private();
        a.test();

    }
}

アクセス修飾子②:デフォルト(記載なし)

サンプルコード
class DefaultA {
    int field = 0;

    void method() {
        System.out.println("メソッドを呼び出すよ!");
    }

}

class DefaultB {
    void test() {
        DefaultA a = new DefaultA();
        System.out.println(a.field);
        a.method();
    }

    /* コンパイル確認用 */
    public static void main(String[] args) {
        DefaultB b = new DefaultB();
        b.test();
    }
}

アクセス修飾子③:protected

実行前にパッケージの中に、ファイルとパッケージを作成すること!

パッケージの階層
  1. パッケージ
    • ファイル①
  2. ファイル②
サンプルコード(ファイル①)
public class ProtectedA {
    protected int field = 0;

    protected void method() {
        System.out.println("メソッドを呼び出すよ!");
    }
}
サンプルコード(ファイル②)
class ProtectedB extends ProtectedA {
    void test() {
        System.out.println(this.field);
        this.method();
    }

    /* コンパイル確認用 */
    public static void main(String[] args) {
        ProtectedB a = new ProtectedB();
        a.test();
    }

}

アクセス修飾子④:public

実行前にパッケージを2つ作成すること!

パッケージの階層
  1. パッケージ
    • ファイル①
  2. パッケージ
    • ファイル②
サンプルコード(ファイル①)
public class PublicA {
    public int field_public = 0;
    public void method_public() {
        System.out.println("publicのメソッドだよ!!");
    }
}
サンプルコード(ファイル②)
class PublicB {
    void test() {
        PublicA a = new PublicA();
        System.out.println(a.field_public);
        a.method_public();
    }

    /* コンパイル確認用 */
    public static void main(String[] args) {
        PublicB b = new PublicB();
        b.test();
    }
}

まとめ

アクセス制御と聞いて最初は蕁麻疹(じんましん)が出そうなくらい覚えるのがおっくうだったんですけど

こうして、記事にまとめてみると案外理解しやすいものですね。

やはり、理解への近道は自分なりにわかりやすくまとめることなのか、、、

今回の記事が少しでも参考になったのであれば幸いです。

それでは、良きJavaライフを!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次