LoginSignup
0
0

More than 3 years have passed since last update.

【Java】アクセス修飾子publicと無指定のフィールドアクセスを試したみた【Eclipse】

Last updated at Posted at 2020-09-17

クラスに使用するアクセス修飾子

アクセス修飾子 説明
public どこからでもアクセス可能
無指定 同パッケージ内からのアクセスのみ可能

メンバ(フィールド・メソッド)に使用するアクセス修飾子

アクセス修飾子 説明
public どこからでもアクセス可能
protected 同パッケージ内とサブクラスからアクセス可能
無指定 同パッケージ内からのアクセスのみ可能
private 同クラス内からのアクセスのみ可能

クラスに無指定でメンバにprivateならどうなる?

作成したファイルは下記の通り。

クラス ファイル名
mainクラス Modifier.java(mainフォルダ)
publicクラス Pub.java(testフォルダ)
無指定クラス None.java(testフォルダ)
Modifier.java(メインメソッドを記載)
package main;

import test.None; // Eclipseで実行時に削除されました
import test.Pub;
public class Modifier {

    public static void main(String[] args) {
        Pub pubclass = new Pub();
        None noneclass = new None();
        System.out.println(pubclass.pubpub);
        System.out.println("publicクラスのprotectedフィールドにアクセス");
        System.out.println(pubclass.pubpro);
        System.out.println("publicクラスの無指定フィールドにアクセス");
        System.out.println(pubclass.pubnone);
        System.out.println("publicクラスのprivateフイールドにアクセス");
        System.out.println(pubclass.pubpri);
        System.out.println("無指定クラスのpublicフィールドにアクセス");
        System.out.println(noneclass.nonepub);
        System.out.println("無指定クラスのprotectedフィールドにアクセス");
        System.out.println(noneclass.nonepro);
        System.out.println("無指定クラスの無指定フィールドにアクセス");
        System.out.println(noneclass.nonenone);
        System.out.println("無指定クラスのprivateフィールドにアクセス");
        System.out.println(noneclass.nonepri);
    }
}
Pub.java
package test;

public class Pub {
    public String pubpub = "pubpub";
    protected String pubpro = "public proteced";
    String pubnone = "public none";
    private String pubpri = "pubpri";
}

None.java
package test;

class None {
    public String nonepub = "nonepub";
    protected String nonepro = "nonepro";
    String none = "nonenone";
    private String nonepri = "nonepri";
}

無名クラスはインポートできない!

上でもコメントで書いた通り、Modifier.javaの中に


import test.None;

と書いてたのに、Eclipseで実行すると削除されました。コンソールのエラ〜メッセージは

Exception in thread "main" java.lang.Error: Unresolved compilation problems: 
    None を型に解決できません
    None を型に解決できません
    フィールド Pub.pubpro は不可視です
    フィールド Pub.pubnone は不可視です
    フィールド Pub.pubpri は不可視です

    at main.Modifier.main(Modifier.java:8)

public-publicなら問題なし

Pub.java
// public以外をコメントアウトしました
package test;

public class Pub {
    public String pubpub = "pubpub";
//  protected String pubpro = "public proteced";
//  String pubnone = "public none";
//  private String pubpri = "pubpri";
}
None.java
// public修飾子をクラスに追加しました
// public以外をコメントアウトしました
package test;

public class None {
    public String nonepub = "nonepub";
//  protected String nonepro = "nonepro";
//  String none = "nonenone";
//  private String nonepri = "nonepri";
}

Modifier.java
// 出力を全部コメントアウトにしました
// パッケージのpublic修飾子のフィールドだけ呼び出すように追加しました

package main;

import test.None; // publicクラスにしたので消されずインポートできるようになりました
import test.Pub;
public class Modifier {

    public static void main(String[] args) {
        Pub pubclass = new Pub();
        None noneclass = new None();
        System.out.println(pubclass.pubpub);
        System.out.println(noneclass.nonepub);

//      System.out.println(pubclass.pubpub);
//      System.out.println("publicクラスのprotectedフィールドにアクセス");
//      System.out.println(pubclass.pubpro);
//      System.out.println("publicクラスの無指定フィールドにアクセス");
//      System.out.println(pubclass.pubnone);
//      System.out.println("publicクラスのprivateフイールドにアクセス");
//      System.out.println(pubclass.pubpri);
//      System.out.println("無指定クラスのpublicフィールドにアクセス");
//      System.out.println(noneclass.nonepub);
//      System.out.println("無指定クラスのprotectedフィールドにアクセス");
//      System.out.println(noneclass.nonepro);
//      System.out.println("無指定クラスの無指定フィールドにアクセス");
//      System.out.println(noneclass.nonenone);
//      System.out.println("無指定クラスのprivateフィールドにアクセス");
//      System.out.println(noneclass.nonepri);
    }
}
実行結果
pubpub
nonepub

エラーが出ることなく実行できるようになりました。

結論

  • アクセス修飾子無指定クラスはimportできない
  • publicクラスのpublicのみアクセスできる

ということになるかと思います。

無指定クラスは鉄壁の守り
publicクラスでもpublic以外のメンバは鉄壁の守り

ということでいいんでしょうかね?

無指定クラスはパッケージの外では使えないので、パッケージ内でのみ使えるということですから、抽象クラスとかで継承などで使うものでしょうかね。その辺りがまだ曖昧ですが、、、

そもそもEclipseで書いているとその都度赤い波線でエラーを知らせてくれました。その便利さに気づけただけでも書いてみた価値はありましたね。

Banners_and_Alerts_と_Modifier_src_main_Modifier_java_-__Users_onoharamakoto_Desktop_-_Eclipse_IDE.png

とりあえず
初心者の方の参考に慣れば幸いです!

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0