archive

[Java] アクセス修飾子のpublicとprivateの違い


Javaのpublicとprivateの違いについて解説する。

そもそもアクセス修飾子とは?

変数やメソッドに対してのアクセスをコントロールするもの。

他のクラスからアクセスしていいかどうかの許可の指定ができる。

なぜアクセスをコントロールする必要があるのか?

アクセスのコントロールによって、使える変数の範囲(変数のスコープ)が決まる。

変数のスコープを設定し、なるべく関係のない情報は参照できないようにすることで、プログラムを整理するのがメリット。

ちなみにアクセス修飾子の種類には何がある?

  • public
  • private
  • protected
  • 指定なし(デフォルト)

の四種類がある。

今回はpublicとprivateに特化して整理する。

privateの使い方

privateを使用した場合、自クラス内のみからのみ、アクセスが可能となる。

privateを使う場合は、変数、メソッドに指定することができるが、クラスには指定はできない。

`//クラスで指定はできない
private class Sample

// 変数はOK private String name;

//メソッドもOK private void method()`

下記に例として、変数にprivateを使って別クラスで呼び出す。

呼び出す時は、publicであるmountainMethodのメソッド経由で呼び出している。

ではこれをprivateである変数経由で呼び出そうとするとどうなるか。

`mountainName has private access in Mountain System.out.println`

エラーの通り、変数mountainNameはprivateに設定してるから、アクセスできないよ!というエラーが起きる。

これを解決するには、これから述べる通り、変数で設定したアクセス修飾子をpublicにして外部からもアクセスできるようにするか、先程の例の通り、メソッド経由で呼び出す。

比較

privateの変数を呼び出すには、publicで定義されたメソッドで呼び出す。エラーが出るのはprivateで設定した変数をそのまま別クラスで呼び出そうとする場合。

publicの使い方

publicでは、privateのように制限がかかっていないため、外部からでも変数で呼び出せる。

先程の例では、変数で呼び出すとエラーになったが、今度は、Mountainクラスの変数をprivateからpublicに変えて実行してみる。

privateの変数をpublicでは、外部からのアクセスもできるので、そのまま、変数で呼び出せる。

アクセス修飾子に関しての関連記事

下記に、アクセス修飾子に関しての関連記事をまとめた。

 
  アクセス修飾子について  
 

   

  • [Java] publicクラスについてちょっと学んでみた
  •    
  • [Java / @Override] オーバーライドとは
  •    
  • [Java / getter] ゲッターとは |アクセス修飾子privateとゲッター
  •    
  • [Java / setter] セッターとは
  •  

    全体像を把握する

    下記にJavaやwebアプリケーションについての記事をまとめた。

    [st-card myclass="" id=3431 label="" pc_height="" name="" bgcolor="" color="" fontawesome="" readmore=“on”]

    コンピューターについての全体像も把握しておくと、プログラミングのさらなる理解に役立つ。

    [st-card myclass="" id=4587 label="" pc_height="" name="" bgcolor="" color="" fontawesome="" readmore=“on”]

    今回使ったコード

    private変数をメソッド経由で呼び出す。

    `class Mountain {
    
    //フィールド変数
    private String mountainName = "金峰山";
    
    //private変数を外部で呼び出すためのメソッドを定義
    public void mountainMethod() {
        System.out.println(mountainName + "に行きたい。");
    }

    }

    public class Main {

    public static void main(String[] args) {
        //インスタンス生成
        Mountain mountain1 = new Mountain();
    
        //private変数をメソッド経由で呼び出す。
        mountain1.mountainMethod();
    }

    }`

    private変数を外から呼び出すとエラー

    `class Mountain {
    
    //フィールド変数
    private String mountainName = "金峰山";
    
    //メソッドを定義
    public void mountainMethod() {
        System.out.println(mountainName + "に行きたい。");
    }

    }

    public class Main {

    public static void main(String[] args) {
        //インスタンス生成
        Mountain mountain1 = new Mountain();
    
        //private変数を外部で呼び出ししようとするとエラー
        System.out.println(mountain1.mountainName);
    }

    }`

    publicの 変数は外部から呼び出せる

    `class Mountain {
    
    //フィールド変数をpublicに変更
    public String mountainName = "金峰山";
    
    public void mountainMethod() {
        System.out.println(mountainName + "に行きたい。");
    }

    }

    public class Main {

    public static void main(String[] args) {
        //インスタンス生成
        Mountain mountain1 = new Mountain();
    
        //public変数を他のクラスから呼び出し
        System.out.println(mountain1.mountainName);
    }

    } `