一つのファイルあたり、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できます。
関連記事
- Spring Security フォームログインのサンプルコードSpring フレームワークによる Web アプリケーション開発で、ログイン処理を実装する際は Spring Security が便利です。ここでは特に Spring Boot で Web アプリケーションを開発する場合を対象とし、フォームによる ID/Password ログインを行うためのサンプルコードをまとめます。 公式ドキュメント [Spring Security チュートリアル](http...
- 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]; となる。 初期化
- PlantUML による UML 図の描き方PlantUML はテキスト形式で表現されたシーケンス図やクラス図といった UML (Unified Modeling Language) 図の情報から画像を生成するためのツールです。簡単な使い方をまとめます。 インストール方法の選択 Atom や Eclipse のプラグインをインストールしてエディタから利用する方法、JAR をダウンロードして Java コマンドで実行する方法、Redmine ...
- Akka HTTP サンプルコード (Scala)Akka アクターを用いて実装された汎用 HTTP フレームワークです。Spray の後継です。コアモジュールである akka-http-core は 2016/2/17 に experimental が外れました。akka-http などのいくつかのサブモジュールは 2016/3/1 現在 experimental のままですが、基本的な
- Kestrel の使用例Kestrel は Message Queue (MQ) の実装のひとつです。一般に MQ はアプリケーション間やプロセス間、スレッド間で非同期に通信するために用いられます。メッセージの送信側は MQ に書き込めば受信側の応答を待たずに次の処理に非同期に進むことができます。Kestrel はわずか 2500 行程の Scala で実装されており JVM で動作します。MQ 自体はメモリ上に存在する...