クラスに使用するアクセス修飾子
アクセス修飾子 | 説明 |
---|---|
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で書いているとその都度赤い波線でエラーを知らせてくれました。その便利さに気づけただけでも書いてみた価値はありましたね。
とりあえず
初心者の方の参考に慣れば幸いです!