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

#クラスに使用するアクセス修飾子
アクセス修飾子|説明
:--|:--
public|どこからでもアクセス可能
無指定|同パッケージ内からのアクセスのみ可能

#メンバ（フィールド・メソッド）に使用するアクセス修飾子
アクセス修飾子|説明
:--|:--
public|どこからでもアクセス可能
protected|同パッケージ内とサブクラスからアクセス可能
無指定|同パッケージ内からのアクセスのみ可能
private|同クラス内からのアクセスのみ可能

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

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

クラス|ファイル名
:--|:--
mainクラス|Modifier.java（mainフォルダ）
publicクラス|Pub.java（testフォルダ）
無指定クラス|None.java（testフォルダ）




```java: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);
	}
}
```

```java:Pub.java
package test;

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

```

```java:None.java
package test;

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


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

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

```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なら問題なし

```java: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";
}
```


```java:None.java
// public修飾子をクラスに追加しました
// public以外をコメントアウトしました
package test;

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

```

```java: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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668402/961f9e4b-7ccf-7bbf-792f-a84114169ea3.png)



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