モーダルを閉じる工作HardwareHub ロゴ画像

工作HardwareHubは、ロボット工作や電子工作に関する情報やモノが行き交うコミュニティサイトです。さらに詳しく

利用規約プライバシーポリシー に同意したうえでログインしてください。

工作HardwareHub ロゴ画像 (Laptop端末利用時)
工作HardwareHub ロゴ画像 (Mobile端末利用時)

Javaコード読解:ファイル分割およびアクセス修飾子

モーダルを閉じる

ステッカーを選択してください

モーダルを閉じる

お支払い内容をご確認ください

購入商品
」ステッカーの表示権
メッセージ
料金
(税込)
決済方法
GooglePayマーク
決済プラットフォーム
確認事項

利用規約をご確認のうえお支払いください

※カード情報はGoogleアカウント内に保存されます。本サイトやStripeには保存されません

※記事の執筆者は購入者のユーザー名を知ることができます

※購入後のキャンセルはできません

公開日公開日
2013/08/12
最終更新最終更新
2015/12/16
記事区分記事区分
一般公開

目次

    アカウント プロフィール画像 (サイドバー)

    週末エンジニア

    0
    ステッカーを贈るとは?

    一つのファイルあたり、publicで修飾できるclassまたはinterfaceは最大一つまでです。また、publicで修飾した場合、ファイル名は「クラスまたはインターフェース名.java」とする必要があります。あるファイル群を特定のディレクトリ、例えばmypackageディレクトリに移動させ、各ファイルの先頭付近で「package mypackage;」と宣言すると、それらファイル群はパッケージとしてJavaに認識されます。あるパッケージに属するクラスは、パッケージに属さないクラスからimportすることによって利用できるようになります。利用できる範囲は、アクセス修飾子に依存します。

    ディレクトリ構成

    本ページのサンプルファイルのディレクトリ構成は以下のようになっているとします。

    $ tree .
    .
    |-- mypackage
    |   |-- C1.java   <== クラス
    |   |-- C2.java   <== クラス
    |   `-- I1.java   <== インターフェース
    `-- sample.java   <== いわゆるメイン
    

    サンプルコード

    sample.java

    // C++のusing namespaceのようなもの
    // C1.java,C2.java,I1.javaでpublicされている
    // classまたはinterfaceを短い名前で利用できるようにする
    import mypackage.*;
    
    class Sample {
        public static void main(String args[]) {
            C1 c1 = new C1();
            // C1 c1 = new mypackage.C1();  //importしていない場合、このように長い名前でのアクセスが必須
    
            // インターフェース名で型を指定可能
            // ただしアクセスできるのはI1.javaで定義するように要請したもののみであり
            // C2.javaで独自に追加されたものはアクセスできない
            I1 c2 = new C2(128);
            System.out.println(c2.constVal);
    
            // C2 c2 = new C2(128);        // こうすると
            // System.out.println(c2.val); // これが可能
    
            c1.display();
            c2.display();
        }
    }
    

    C1.java

    package mypackage;
    
    public class C1 {
        public void display() { System.out.println("class C1"); }
    }
    

    I1.java

    package mypackage;
    
    // public: 任意のクラスからアクセス可能
    // 省略時: パッケージmypackageからのみアクセス可能
    public interface I1 {
    
        // インターフェースの変数定義におけるアクセス修飾子は指定しない。この場合、
        // 「public static final」つまり、任意のクラスからアクセスできるクラス定数となる
        int constVal = 1024;
    
        // インターフェースのメソッド定義におけるアクセス修飾子は
        // 「public abstract」とする。指定しない場合「public abstract」となるため
        // 省略してもよい。
        public abstract void display();
    }
    

    C2.java

    package mypackage;
    
    // public: パッケージmypackageに属さないクラスからもクラスC2を利用できるようにする
    // final: クラスC2を継承できないようにする
    // abstract: クラスC2をインスタンス化できないようにする (extendsで継承されることを意図する)
    // 省略時: パッケージmypackageに属さないクラスからはクラスC2を利用できない
    public class C2 implements I1 {// implements I1, I2 とカンマ区切りで複数指定可能
    
        // private: クラスC2外からアクセスできなくなる
        // protected: 他のパッケージ (ただしサブクラスは除く) からアクセスできなくなる
        // public: 任意のクラスからアクセス可能
        // static: クラス変数化する
        // final: 定数 (C/C++のconst) 化する。static finalという記述でクラス定数を設定可能
        // 省略時: 他のパッケージ (サブクラスを含む) からアクセスできなくなる
        public int val;
    
        // private: 他のクラスからnewできなくなる (使用用途例: Singleton)
        // protected: 他のパッケージ (ただしサブクラスは除く) からnewできなくなる
        // public: 任意のクラスからnewできる
        // 省略時: 他のパッケージ (サブクラスを含む) からnewできなくなる
        public C2(int val) {
            this.val = val;
        }
    
        // private: 他のクラスから呼び出せないメソッド
        // protected: 他のパッケージ (サブクラスは除く) からは呼び出せないメソッド
        // public: 任意のクラスから呼び出せるメソッド
        // static: クラスメソッド化
        // final: オーバーライドできないメソッド化
        // abstract: サブクラスで実装されることを意図する (クラス自身もabstractで修飾されている必要がある)
        // 省略時: 他のパッケージ (サブクラスを含む) から呼び出せなくなる
        public void display() { System.out.println("class C2"); }
    }
    

    実行例

    $ javac mypackage/*.java sample.java && java Sample
    1024
    class C1
    class C2
    

    パッケージ (ディレクトリ) の場所

    カレントディレクトリまたは環境変数 $CLASSPATH で指定されたディレクトリであればimportできます。

    0
    詳細設定を開く/閉じる
    アカウント プロフィール画像 (本文下)

    週末エンジニア

    記事の執筆者にステッカーを贈る

    有益な情報に対するお礼として、またはコメント欄における質問への返答に対するお礼として、 記事の読者は、執筆者に有料のステッカーを贈ることができます。

    さらに詳しく →
    ステッカーを贈る コンセプト画像

    Feedbacks

    Feedbacks コンセプト画像

      ログインするとコメントを投稿できます。

      関連記事

      • Spring Security フォームログインのサンプルコード
        Spring フレームワークによる Web アプリケーション開発で、ログイン処理を実装する際は Spring Security が便利です。ここでは特に Spring Boot で Web アプリケーションを開発する場合を対象とし、フォームによる ID/Password ログインを行うためのサンプルコードをまとめます。 公式ドキュメント [Spring Security チュートリアル](http...
        えびちゃんえびちゃん12/4/2019に更新
        いいねアイコン画像0
      • Java配列の宣言方法 (C/C++との違い)
        Javaの配列 Javaの配列宣言方法はC/C++と似ているようで若干異なる。 初期化しない場合 C/C++の int array[10]; はJavaでは int array[] = new int[10]; となる。同様にC/C++の int array[3][3]; はJavaでは int array[][] = new int[3][3]; となる。 初期化
        てんとうむしてんとうむし5/13/2018に更新
        いいねアイコン画像0
      • PlantUML による UML 図の描き方
        サムネイル画像-c788fffde5
        PlantUML はテキスト形式で表現されたシーケンス図やクラス図といった UML (Unified Modeling Language) 図の情報から画像を生成するためのツールです。簡単な使い方をまとめます。 インストール方法の選択 Atom や Eclipse のプラグインをインストールしてエディタから利用する方法、JAR をダウンロードして Java コマンドで実行する方法、Redmine ...
        kentakenta1/21/2020に更新
        いいねアイコン画像0
      • Akka HTTP サンプルコード (Scala)
        サムネイル画像-a98142497c
        Akka アクターを用いて実装された汎用 HTTP フレームワークです。Spray の後継です。コアモジュールである akka-http-core は 2016/2/17 に experimental が外れました。akka-http などのいくつかのサブモジュールは 2016/3/1 現在 experimental のままですが、基本的な
        雄太雄太10/7/2021に更新
        いいねアイコン画像0
      • Kestrel の使用例
        Kestrel は Message Queue (MQ) の実装のひとつです。一般に MQ はアプリケーション間やプロセス間、スレッド間で非同期に通信するために用いられます。メッセージの送信側は MQ に書き込めば受信側の応答を待たずに次の処理に非同期に進むことができます。Kestrel はわずか 2500 行程の Scala で実装されており JVM で動作します。MQ 自体はメモリ上に存在する...
        したくんしたくん10/12/2017に更新
        いいねアイコン画像0