Javaのクラスとインターフェースのフォーマット

IT

クラスやインターフェースを作成するときのメモです。

クラス

package <パッケージ名>;
import <他のパッケージ名>;
[クラスの修飾子] class <クラス名> (extends <スーパークラス名>) (implements <インターフェース名>, ...){
  //メンバ変数
  [メンバ変数の修飾子] <型> <変数名> (= 値);

  //コンストラクタ
  [コンストラクタの修飾子] <クラス名>([パラメタ]) {
    インスタンス化処理
  }

  //メソッド
  [メソッドの修飾子] <戻り値型> <メソッド名>([メソッド引数]) {
    ローカル変数
    処理
  }

  //インナークラス(内部クラス)
  [クラスの修飾子] class <クラス名> (extends <スーパークラス名>) (implements <インターフェース名>, ...){
    ※メンバ・メソッドは通常のクラスとほぼ同じ
  }

  //クラス内のインターフェース
  [クラス内のインターフェースの修飾子] interface <インタフェース名> (extends <スーパーインターフェース名>, ...){
    ※メンバ・メソッドは通常のインターフェースとほぼ同じ
  }
}

○パッケージ
・クラスやインターフェースをグループ化するための仕組み。関連するクラスをまとめておくことで、コードの可読性と保守性が向上する。
・パッケージ名は一意であることが推奨される。ドメイン名を逆にした形から始めると重複を避けることができる。
・プラットフォームに依存しない一貫性を保つため、パッケージ名はすべて小文字で記述する。
・パッケージ名はドット . で区切り、階層構造を表現する。
・上位のパッケージから下位のパッケージへ順に並べる。
・Javaの予約語をパッケージ名として使用しないようにする。
・<パッケージ名>:このクラスが所属するパッケージ名を宣言する。

○インポート
・他のパッケージ名:利用したい他のクラスのパッケージ名を指定する。
・java.lang;パッケージはデフォルトでインポートされる。

○クラス
・オブジェクトが持つプロパティ(属性)やメソッド(処理)を定義する。
 ●[クラスの修飾子]:public (final | abstract)は可。
 ・public:全てのクラスから参照でき、継承もインスタンス化も制限がない。
 ・省略:同じパッケージ内からしか参照できない。
 ・final:継承(extends)できないがインスタンス化できるクラス。
 ・abstract(抽象的):継承はできるがインスタンス化はできない。抽象メソッドを持つ。
 ・strictfp(FP 厳密):floatやdoubleの小数点数が、CPUの処理系に依存せずに厳密に同じ演算結果となる。(Java17以降、すべての浮動小数点式は厳密に評価され、strictfpは必要なし)
 ●<クラス名>
 ・ファイル名と同じにする必要がある。大小文字の区別あり。
 ●(extends <スーパークラス名>):クラスの継承(extends)
 ・ひとつのクラスしか継承できない。
 ・スーパークラスはクラスの「親クラス」の関係となる。
 ・コンストラクタは継承されない。
 ・継承時にメンバ変数名、メソッド名が重なったらインスタンス化されたクラスから最も階層が近いスーパークラスの定義が採用される。
 ・継承時に親クラスのメンバ変数、メソッドを変更することができる。
 ●(implements <インターフェース名>, …):インターフェースの実装(implements)
 ・複数のインターフェースを実装できる。
 ・インターフェースの抽象メソッドを実装する必要がある。

○メンバ変数
・オブジェクトの属性を保持する変数。
・クラス内のメソッド外で定義される変数。
・異なるクラスからもアクセス可能。
 ●[メンバ変数の修飾子]
 ・public:アクセスに制限がない。
 ・protected:同じパッケージ及び継承するサブクラスからしかアクセスできない。
 ・省略:同じパッケージに属するクラス内からしかアクセスできない。
 ・private:同じクラスからしかアクセスできない。
 ・static:インスタンス化したオブジェクトで共有できる変数にする(クラスレベルの変数)。クラスがロードされるときに一度だけ初期化され、メモリに一度だけ存在する。
 ・final:初期化した値以外に変更できない。定数として用いる。
 ・transient:オブジェクトの直列化(Serialization)の時にファイルやデータベースなどの持続的な記憶領域に保持しない。
 ・volatile:複数のスレッドから参照される場合に、スレッド毎に変数値が異ならないようにする。(なぜなら、マルチスレッドの場合はそれぞれのスレッドは性能向上のために変数のコピーを参照・変更し、その値を元の場所(メモリ)に書き戻さないことがあり、同じ変数でもスレッドによって値が異なるという現象が発生するため。)
 ●<型>
 ・char:16ビット符号なし整数(Unicodeキャラクタデータ)(0~65535)
 ・boolean:真偽値(true, false)
 ・byte:8ビット符号付き整数(-128~127(-2^7~2^7-1))
 ・short:16ビット符号付き整数(-32768~32767(-2^15~2^15-1))
 ・int:32ビット符号付き整数(-2147483648~2147483647(-2^31~2^31-1))
 ・long:64ビット符号付き整数(-9223372036854775808~9223372036854775807(-2^63~2^63-1))
 ・float:32ビット符号付き単精度浮動小数点数型
 ・double:64ビット符号付き倍精度浮動小数点数型
 ●<変数名>
 ・英数字(数字からは始められない)とアンダースコア、$(内部処理に使われるので使用しない方が無難)が利用できる。

○コンストラクタ
・オブジェクトを生成時に必ず呼び出され、オブジェクトを初期化するメソッド。
・定義しない場合はコンパイル時に空のコンストラクタが自動的に生成される。
・クラス名と同じ名前でなくてはならない。
・引数が異なる複数のコンストラクタが作成できる(オーバーロード)。
・戻り値が無く、 void キーワードを持たない特殊なメソッド。
 ●[コンストラクタの修飾子]
 ・public:アクセスに制限がない。
 ・protected:同じパッケージ及び継承するサブクラスからしかアクセスできない。
 ・省略:同じパッケージに属するクラス内からしかアクセスできない。
 ・private:同じクラスからしかアクセスできない。

○メソッド
 ●[メソッドの修飾子]
 ・public:アクセスに制限がない。
 ・protected:同じパッケージ及び継承するサブクラスからしかアクセスできない。
 ・省略:同じパッケージ内からしか呼び出せない。
 ・private:同じクラスからしかアクセスできない。
 ・static:静的メソッド。インスタンス化しなくても利用できるメソッド(Math.abs(-1)など)。
 ・final:オーバーライドを禁止したメソッド。
 ・abstract:メソッド名、引数、戻り値は定義されているが、ブロック内の処理(実装)が行われていない抽象メソッド。抽象メソッドを一つでも持つクラスは抽象クラス。
 ・native:Javaのバイトコードではなく、ホストCPUで使われるマシン語で実装されたメソッド。
 ・synchronized:マルチスレッド時に同期を取るメソッド。スレッドに呼び出された時点でロックされる為、複数のプロセスによって実行されることがなくなる。
 ・strictfp:floatやdoubleの小数点数がCPUの処理系に依存せずに厳密に同じ演算結果となる。(Java17以降、すべての浮動小数点式は厳密に評価され、strictfpは必要なし)
 ●ローカル変数
 ・宣言されたスコープ内で利用可能な変数。

○インナークラス(内部クラス)
・メンバー内部クラスは、外部クラスのメンバとして定義されるクラス。外部クラスのメンバ変数やメソッドにアクセスできる。
・静的内部クラスは、外部クラスの静的メンバ変数や静的メソッドにアクセスできる。
・ローカルクラスは、メソッドの中に定義されるクラスで、メソッド内でのみ使用される。[クラスの修飾子]は無し。
・匿名クラスは、名前を持たないクラスで、通常はインタフェースや抽象クラスを即座に実装するために使用される。

インターフェース

[インターフェースの修飾子] interface <インタフェース名> (extends <スーパーインターフェース名>, ...){
  //インターフェースのメンバ変数
  <データ型> <変数名> = 値;

  //インターフェースのメソッド
  [修飾子] <戻り値型> <メソッド名([引数の型宣言])>;
}

○インターフェース
・クラスが必ず実装するべきメソッドの名前や型といった作法のみを定義するもの。
・インタフェースのメソッドは抽象メソッドでなければならない。
・実装クラスでは複数のインタフェースを実装 (implements) できる。
・別のインタフェースを多重継承 (extends) できる。
・実装クラスではインタフェースの全てのメソッド宣言を実装しなければならない。
・実装クラス型オブジェクトはインタフェース型変数に代入互換である(逆は明示的なキャストが必要)
 ●[インターフェースの修飾子]
 ・public:アクセスに制限がない。
 ・abstract:以前はabstract interface と記述していたが、インターフェース自体が抽象的なので、最近では書かないことが推奨されている。
 ・strictfc:floatやdoubleの小数点数がCPUの処理系に依存せずに厳密に同じ演算結果となる。(Java17以降、すべての浮動小数点式は厳密に評価され、strictfpは必要なし)
 ●インターフェースのメンバ変数
 ・自動的に public static final 修飾子が付いたものとして扱われる。他の修飾子は記述できない。
 ・インタフェースのメンバ変数は定数。
 ・必ず値が代入されなければならない。 
 ・実装時に別の値を代入することはできない。
 ●インターフェースのメソッド
 ・抽象メソッドのみ。
 ・自動的に public abstract 修飾子が付いたものとして扱われる。他の修飾子は記述できない。
 ・実装するクラス側で実装して完全なものにしておく必要がある。

一覧表

クラス

修飾子クラスインナークラスメンバ変数コンストラクタメソッドブロック
省略×
public×
protected××
private××
static×××
final××
abstract×××
native×××××
synchronized××××
transient×××××
volatile×××××
strictfp×××

インターフェース

修飾子インターフェースクラス内インターフェースメンバ変数メソッド
省略××××
public自動自動
protected×××
private×××
static×自動×
final××自動×
abstract××自動
native××××
synchronized××××
transient××××
volatile××××
strictfp××

コメント

タイトルとURLをコピーしました