[Java] アクセス修飾子(protected)の変数に外部クラスからアクセスできた!

Pocket

ここでは、1ファイル内に複数のクラスを定義する手段について悩んでいたら、別の重大凶悪事件が発生してしまいましたので、その時のメモを備忘録として残しておきます。

スポンサーリンク

1ファイルに複数のクラスを定義する方法

(良いか悪いかは別にして)1ファイルに複数のクラスを定義するには、アクセス修飾子を記述していないクラスであれば宣言できます。

個人的には小さいクラスであれば、人間ファイルに頭クラスとか胴体クラスとか定義したくなる時もあります。

NGな例

// アクセス修飾子ありはNG
public class class1 {

}

public class class2 {

}

OKな例

// アクセス修飾子なしはOK
class class1 {

}

class class2 {

}

アクセス修飾子に関する重大事件

わたしが、Java のアクセス修飾子や文法の知識がないだけなような気もしますが、次の環境ではクラス内のprotectedで修飾された変数に外部クラスからアクセスできました。

ビックリ( ゚Д゚)じゃない?どなたか、わたしの足りない部分を指摘していただける方、コメントお願いします。

動作環境

  • 1ファイルに2クラスを宣言していた(ファイル名もクラス名と違う)
  • Android Studio 2.3.3
  • AppCompatActivityを継承した画面のクラスから呼び出している
  • パッケージ名も、呼び出し元と呼び出されるクラスは同じ

クラスを1ファイルに定義しています。ファイル名は、いずれのクラス名とも違います。

class Class1 {

    public    String publicString    = "public";
    protected String protectedString = "protected";
              String noneString      = "none";
    private   String privateString   = "private";
}

 class Class2 {

}

次に、画面のクリックイベント時に以下のコードを実行します。

    Class1 c1 = new Class1();
    String pub  = c1.publicString;    // OK
    String prot = c1.protectedString; // OK
    String none = c1.noneString;      // OK
    //String priv = c1.privateString; // さすがに private はコンパイルエラー

protected でも取得できました。アクセス修飾子をつけない部分がどのような扱いなのかはよくわかりませんが、protected はアクセスできないと思っていたのでちょっとビックリです。

ちなみに、アクセス修飾子は次のような感じだそうです。

アクセス修飾子 概要
public すべてのクラスからアクセスできる
protected クラス内とサブクラスからアクセスできる
なし クラス内と同じパッケージのクラスからアクセスできる
private クラス内からのみアクセスできる

繰り返しになりますが、わたしが何か勘違いしているのか、根本的にJavaの知識が足りないのか。テルミー、プリーズ!

 

スポンサーリンク


Pocket

Leave a Comment

Your email address will not be published. Required fields are marked *