Javaクラスの書き方でお悩みなあなたへ。この記事では、classのインスタンス化や継承、メソッドやコンストラクタについてご紹介します。これを見れば、クラスの書き方がすぐにわかります。
Javaのクラスの宣言は次の書式で行う。
[scope] [abstract|final] class ClassName
[extends SuperClass]
[implements Interface[,Interface...]]
[throws ThrowableClass[,ThrowableClass...]]
{
// フィールドやメソッドの宣言
}
Javaでクラスを継承するには、extends
の後に継承するクラスを指定する。
public class Example extends SuperClass {
Javaのクラスは多重継承できないので、継承できるクラスはひとつだけである。
Javaのクラスでインタフェースを実装するには、implements
の後に実装するインタフェースを指定する。
public class Example implements FooIF {
複数のインタフェースを実装することもできる。
public class Example implements FooIF, BarIF, BazIF {
Javaのクラスには次のような種類がある。
トップレベルクラスとは、ネストしていない(他のクラスやインタフェースに囲まれていない)クラスのことである。アクセス修飾子がpublicのトップレベルクラスを宣言する場合、次の制約がある。
内部クラス(Inner Class)とは、クラス内で宣言するクラスである。特定のクラスのメンバ変数やメソッドに強く依存するクラスは、そのクラスの内部クラスとして宣言する。部クラスを宣言する例を次に示す。
public class OuterClass {
class InnerClass {
// クラスの宣言
}
}
内部クラスはクラス名を付けなくても宣言できる。クラス名が無い内部クラスのことを匿名クラス(Anonymous Class)と呼ぶ。匿名クラスを宣言する例を次に示す。
public class OuterClass {
interface AnonymousExample {
public void foo();
}
public static void main(String[] args) {
AnonymousExample anonymousExample = new AnonymousExample() {
public void foo() {
System.out.println("This is an example of anonymous class.");
}
};
anonymousExample.foo();
}
}
[public|protected|private] [static] [final] type name([ptype parameter[, ptype parameter...]]) {
// 処理
}
staticを指定したメソッドは、インスタンス化しなくても呼び出すことができる。ただし、staticメソッドの中から非staticなメソッドを呼び出したり、非staticな変数を参照することはできない。
finalを指定したメソッドは、サブクラスでオーバーライドできなくなる。
戻り値のデータ型を省略できるのはコンストラクタの場合のみである。コントラクタ以外のメソッドで戻り値が無い場合、戻り値のデータ型としてvoidを指定する。
メソッドの引数の個数が可変の場合、データ型の後に「...」を記述する。この場合、引数は配列の様に扱える。引数が無くても、要素数0の配列として扱える。
name([argument[, argument...]])
package com.fc2web.itref;
public class HelloWorld {
public static void main(String[] args) {
HelloWorld helloWorld = new HelloWorld();
helloWorld._variableArgs("飯田來麗");
helloWorld._variableArgs();
helloWorld._variableArgs("堀内まり菜", "杉崎寧々");
}
private void _variableArgs(String... args) {
System.out.println("引数は" + args.length + "個です。");
for (String str : args) {
System.out.println(str);
}
}
}
public class Example
{
public static void main(String[] args)
{
// 処理
}
}
引数args
には実行時の引数が渡される。たとえば、java Example foo bar
と実行した場合、args.length
は2、args[0]
は"foo"、args[1]
は"bar"となる。
[modifier] type VariableName [= InitialValue];
VariableNameには変数名を指定する。
コンストラクタは、インスタンスが作られたときに自動的に呼び出されるメソッドです。 主にインスタンスを初期化するために使用されます。 メソッドの名前はクラスの名前と同じです。コンストラクタに戻り値はありません。戻り値の型として void を記述するのではなく、戻り値の型自体を記述しません。
public class Example() {
public Example() {
// 初期化処理
}
}
コンストラクタは引数を取ることができ、インスタンス化するときの初期値として利用できる。
public class Example() {
private int foo;
public Example(int foo) {
this.foo = foo;
}
}
staticメソッドとstaticフィールドだけから成るクラスは、インスタンス化を防ぐために、privateコンストラクタを作るのが望ましい。
public class Example() {
private Example() {
throw new AssertionError();
}
}
C++ ではインスタンスが破棄される際に自動的に呼び出されるメソッド(デストラクタ)が存在しますが、Java には存在しません。
自分のクラスのコンストラクタを呼び出すには、コンストラクタのメソッド名ではなく、this()を使用する。
public class MyClass() {
private int id;
public MyClass() {
this(1)
}
public MyClass(int id) {
this.id = id
}
}