Java
 Computer >> コンピューター >  >> プログラミング >> Java

Javaのトップレベルクラスはprivateやprotectedで宣言できる?アクセス修飾子のルールを解説

結論から言うと、トップレベルクラス(最上位クラス)をprivateやprotectedとして宣言することはできません。指定できるのはpublic、あるいは修飾子なし(デフォルトアクセス)のどちらかだけです。修飾子を付けなかった場合、そのクラスはデフォルト(パッケージプライベート)のアクセスレベルを持つことになります。

基本構文

// トップレベルクラスの例
public class TopLevelClassTest {
    // クラス本体
}

押さえておきたいポイント

  • トップレベルクラスにprivateを付けると、コンパイラは「modifier private not allowed here(ここではprivate修飾子は使用できません)」というエラーを出します。つまりトップレベルクラスをprivateにはできず、protectedについても同様です。
  • protectedとは、同じパッケージ内のすべてのクラスに加えて、別パッケージに存在する場合でもサブクラスからアクセスできることを意味する修飾子です。
  • トップレベルクラスに指定できる修飾子はpublic、abstract、finalのみで、まったく修飾子を付けないことも可能です。これをデフォルト/パッケージアクセスと呼びます。
  • 内部クラス(ネストされたクラス)であればprivateやprotectedでの宣言が許可されますが、外部クラス(トップレベルクラス)では認められていません。
  • 1つのJavaソースファイルには複数のトップレベルクラスを定義できますが、publicなトップレベルクラスは最大1つまでです。また、ファイル名はそのpublicクラス名と一致させる必要があります。

protectedで宣言した場合の例

protected class ProtectedClassTest {
    int i = 10;
    void show() {
        System.out.println("Declare top-level class as protected");
    }
}
public class Test {
    public static void main(String args[]) {
        ProtectedClassTest pc = new ProtectedClassTest();
        System.out.println(pc.i);
        pc.show();
        System.out.println("Main class declaration as public");
    }
}

上記の例ではクラスをprotectedとして宣言していますが、コンパイル時に「modifier protected not allowed here」というエラーが発生するため、このコードは実行されません。

実行結果

modifier protected not allowed here

privateで宣言した場合の例

private class PrivateClassTest {
    int x = 20;
    void show() {
        System.out.println("Declare top-level class as private");
    }
}
public class Test {
    public static void main(String args[]) {
        PrivateClassTest pc = new PrivateClassTest();
        System.out.println(pc.x);
        pc.show();
        System.out.println("Main class declaration as public");
    }
}

同様に、クラスをprivateとして宣言した場合も「modifier private not allowed here」というエラーが発生し、コードは実行されません。

実行結果

modifier private not allowed here

まとめ

トップレベルクラスのアクセス修飾子は「public」または「なし(デフォルト)」の2択です。privateやprotectedといったアクセス制御が意味を持つのは、クラスのメンバーやネストされたクラスに対してであり、ソースファイルに直接置かれるトップレベルクラスには当てはまらないためです。カプセル化を実現したい場合は、フィールドやメソッド、内部クラスに対して適切な修飾子を使い分けるようにしましょう。

  1. Javaの列挙型(enum)は任意のクラスを拡張できる?継承の仕組みを解説

    Javaの列挙型(enum)とは列挙型(enum)は、Javaにおいて定数の集合を格納するためのデータ型です。1週間の曜日や1年の月名など、固定された値のグループを扱う際に活用されます。列挙型を定義するには、enumキーワードの後に列挙型の名前を続けて記述します。enum Days { SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY }配列と同様に、列挙型内の要素(定数)には0から始まる番号が自動的に割り当てられます。上記の例では、各曜日が以下の図のように番号で識別されます。列挙型はクラスとよく似た構造を持ち

  2. JavaでJTextFieldにパディングを追加する方法【setMarginの使い方】

    JTextFieldはJTextComponentクラスのサブクラスであり、ユーザーが1行形式でテキストを入力できる、Swingの中でも特に重要なコンポーネントの一つです。JTextFieldでは、ユーザーが入力を行う際にActionListenerインターフェースを通じてアクションイベントが発生します。主なメソッドとしては、setText()、getText()、setBorder()、setEnabled()などが挙げられます。 JTextFieldにパディング(内側の余白)を追加したい場合は、JTextComponentクラスが提供するsetMargin(Insets m)メソッドを使用