Javaのクラス

Javaクラスの書き方でお悩みなあなたへ。この記事では、classのインスタンス化や継承、メソッドやコンストラクタについてご紹介します。これを見れば、クラスの書き方がすぐにわかります。

クラスの宣言

Javaのクラスの宣言は次の書式で行う。

[scope] [abstract|final] class ClassName
[extends SuperClass]
[implements Interface[,Interface...]]
[throws ThrowableClass[,ThrowableClass...]]
{
  // フィールドやメソッドの宣言
}
scope
宣言するクラスのスコープ(アクセス修飾子)を指定する。
abstract
抽象クラスとして宣言する。
final
これ以上継承できないクラスとして宣言する。
ClassName
宣言するクラスの名前を指定する。
SuperClass
継承するスーパークラスの名前を指定する。Javaでは継承できるクラスはひとつだけである。
Interface
実装するインタフェースの名前を指定する。カンマで区切って複数指定することができる。
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...]]) {
  // 処理
}
type
メソッドの戻り値の型
name
メソッドの名前
ptype
仮引数の型
parameter
仮引数の名前

staticを指定したメソッドは、インスタンス化しなくても呼び出すことができる。ただし、staticメソッドの中から非staticなメソッドを呼び出したり、非staticな変数を参照することはできない。

finalを指定したメソッドは、サブクラスでオーバーライドできなくなる。

戻り値のデータ型を省略できるのはコンストラクタの場合のみである。コントラクタ以外のメソッドで戻り値が無い場合、戻り値のデータ型としてvoidを指定する。

メソッドの引数の個数が可変の場合、データ型の後に「...」を記述する。この場合、引数は配列の様に扱える。引数が無くても、要素数0の配列として扱える。

メソッドの呼び出し

name([argument[, argument...]])
name
メソッドの名前
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);
      }
  }
}

mainメソッド

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
  }

}