Chapter 03

Javaのクラス・インスタンス

おでん
おでん
2021.08.15に更新

クラスとは

Javaはオブジェクト指向プログラミング言語です。
クラスはオブジェクトを作るための設計書のようなものです。
Javaは、このクラスという部品を複数作り、それらを組み合わせながら開発することができます。
クラスは、フィールド(状態)とメソッド(機能)をまとめたものです。
フィールドには、クラス内の変数を定義し、これをメンバ変数と言います。
メンバ変数は、そのクラス内で全てのメソッドから参照できます。
メソッドには、処理を記述し、メソッド内で定義された変数をローカル変数と言います。
ローカル変数は、そのメソッド内でのみ参照できます。
フィールドやメソッドはいくつも定義することができます。

クラス

クラス内 特性 変数の呼び方 変数のスコープ(有効範囲)
フィールド 状態 メンバ変数 クラス内
メソッド 機能 ローカル変数 メソッド内

メンバ変数の宣言は以下の記述で行います。

(修飾子) データ型 メンバ変数名;

宣言と値の代入による変数の初期化も可能です。

(修飾子) データ型 メンバ変数名 = 値;

メソッド定義は以下の記述で行います。

(修飾子) 戻り値の型 メソッド名(引数リスト) {}

まずは、クラスを作成してみます。
今回は例として、カレーのクラスを作成します。
「Curry.java」というファイルを作成して、そのファイル内に記述していきます。

Curry.java
public class Curry {
  String name = "カレー";
  public String taste() {
    return "スパイシーで美味しい";
  }
}

コンパイルをしておきます。

$ javac Curry.java

また、戻り値が不要な場合はvoidを戻り値の型に指定します。

(修飾子) void メソッド名(引数リスト) {}

そして、戻り値を返したい場合はreturnをメソッド内に記述します。

return 戻り値;

インスタンスとは

前述のようにクラスはあくまで設計書です。
そこからモノを実体として作ることをインスタンス化、作られたモノをインスタンスと言います。

インスタンス化

インスタンス化は以下の記述で行います。

クラス名 変数名 = new クラス名(引数名);

上記の例の続きですが、カレークラスは一つの設計図であり、部品です。
カレークラスを参照し、メインで実行できるクラスも別で作成しましょう。
今回は「Main.java」というファイル名で作成します。
まずは、カレークラスのインスタンス化を行います。

Main.java
public class Sample {
  public static void main(String[] args) {
    //Curryクラスのインスタンス化
    Curry curry = new Curry();
  }
}

カレークラスのインスタンス化ができたので、現在「Main.java」(正確にはMain.class)では、カレークラス(Curry.javaファイルのCurryクラス)内のフィールドやメソッドが参照できます。
他クラスのフィールドの値の参照方法は以下です。

インスタンス化時の変数名.メンバ変数

他クラスのメソッドの実行方法は以下です。

インスタンス時の変数名.メソッド名(引数)

それでは、実際にカレークラスのフィールドとメソッドを参照してみましょう。

Main.java
public class Sample {
  public static void main(String[] args) {
    //Curryクラスのインスタンス化
    Curry curry = new Curry();
    
    //Curryクラスのフィールドの値を参照
    System.out.println(curry.name);

    //Curryクラスのメソッドの実行
    System.out.println(curry.taste());
  }
}
結果
カレー
スパイシーで美味しい

オーバーロードとは

オーバーロードとは、同一クラス内でメソッド名が同一で、引数の型、数、並び順が異なるメソッドを複数定義することです。
つまり、同じメソッド名でも引数によって異なるメソッドとして扱えることです。
以下、例です。

class ExClass{
    void status(String name, String country) {  //引数2つのstatusメソッド①
        System.out.println("名前は" + name);
        System.out.println("国は" + country);
    }
    void status(String name) {  //引数1つのstatusメソッド②
        System.out.println("名前は" + name);
        System.out.println("国は" + "日本");
    }
    public static void main(String[] args) {
        ExClass ins1 = new ExClass();
        ins1.status("田中太郎");
    }
}

この場合、「status」メソッドが2つあります。(String name, String country)の2つの引数を持つstatusメソッド①と、(String name)の1つの引数を持つstatusメソッド②です。
下で呼び出しているのは「status("田中太郎")」と、1つの引数です。そのため、呼び出されるのはstatusメソッド②です。これによって、「名前は田中太郎」「国は日本」と表示することができます。

オーバーロードできない場合

オーバーロードができない場合が2パターンあります。

  1. 引数の変数名だけが異なる場合
  2. 戻り値だけが異なる場合

1. 引数の変数名だけが異なる場合

以下のように、引数の変数名だけが異なる場合はオーバーロードできません。

void status(String country) {  //statusメソッド①(引数の変数名:country)
        ...
    }
void status(String name) {  //statusメソッド②(引数の変数名:name)
        ...
    }

2. 戻り値だけが異なる場合

以下のように、戻り値だけが異なる場合はオーバーロードできません。

void status(String name) {  //statusメソッド①(戻り値の型:void)
        ...
    }
String status(String name) {  //statusメソッド②(戻り値の型:String)
        ...
    }