Javaのクラスって何?
クラスの使い方を知りたい
Javaではさまざまなクラスの使い方ができます。
ここではクラスの使い方の基本から、クラスの継承、final修飾子の指定、内部クラスなど応用的な使い方まで詳しく解説していきます。
※この記事ではJavaの「バージョン8」で動作確認しました。
なお、Javaの記事については、こちらにまとめています。
Javaのクラス
そもそもクラスとは
クラスとは、プログラムを実行するための処理をまとめたオブジェクトで、クラスの処理の中にはメンバ変数や処理を実行するためのメソッドがあります。
ちなみに、メンバ変数とはクラス内で使用する変数のことで、メソッドとはメンバ変数などを使って行う処理をひと塊にまとめたものです。
クラスは以下のように記述します。
class クラス名 { 実行処理... }
インスタンスとオブジェクト
Javaのようなオブジェクト指向のプログラミング言語では、処理をまとめたクラスを実行するためには、そのクラスのオブジェクトを生成する必要があります。
そして、生成したクラスのオブジェクトから、そのクラスのメンバ変数を参照したり、メソッドを呼び出して使用します。クラスの中のメソッドを呼び出すためには、以下のように記述します。
class ClassSample { // メソッドの宣言・定義 void methodSample(){ 実行処理... } }
//オブジェクトを生成 ClassSample cl = new ClassSample(); //メソッドの呼出し cl.methodSample();
クラスのオブジェクトを生成する方法は変数を宣言する方法と似ていて、クラス名のあとにオブジェクト名を記述します。オブジェクトにはnew演算子を使って生成するインスタンスを格納します。
なお、クラスのオブジェクトは異なるオブジェクト名でいくつでも生成することが可能です。
クラスの基本
基本的な使い方
ここではクラスの基本的な使い方を確認するために、以下の内容のプログラムを作成します。
- 参照するクラスのオブジェクト変数を生成
- そのクラスのメンバ変数の参照
- メソッドの呼出し
- 取得した値を出力
「TestClass.java」「Main.java」ファイルを作成し、それぞれ以下のプログラムを記述します。
// TestClass.java class TestClass { // メンバ変数 public String name = "Samurai"; // メソッド public String testMethod(){ return "Engineer"; } } // Main.java public class Main { public static void main(String[] args) { //クラスのオブジェクトを生成 TestClass c = new TestClass(); //メンバ変数を参照する String str1 = c.name; //メソッドの呼出し String str2 = c.testMethod(); //結果を出力 System.out.println(str1 + str2); } }
ファイルを保存したら、プログラムのコンパイル、実行してみましょう。
> javac Main.java
コンパイルが成功すると、Main.classとTestClass.classが作られます。実行するには、コマンドラインで以下のようにmainメソッドが存在するクラス名を指定して実行するとプログラムが処理されます。
> java Main SamuraiEngineer
このようにクラスのオブジェクトを生成して、そのクラスのメンバやメソッドを参照するのが、クラスの基本的な使い方となります。
引数ありのコンストラクタ
クラスにはインスタンス生成の際に、引数を使って値を渡すことができます。インスタンス生成時にクラスに値を渡すためには、引数ありのコンストラクタが必要となります。コンストラクタは以下のように記述します。
// TestClass.java class TestClass { // メンバ変数 public String name; // 引数ありのコンストラクタ public TestClass(String name) { this.name = name; } // メソッド public String testMethod(){ return "Engineer"; } } // Main.java public class Main { public static void main(String[] args) { //クラスのオブジェクトを生成 TestClass c = new TestClass("Samurai"); //メンバ変数を参照する String str1 = c.name; //メソッドの呼出し String str2 = c.testMethod(); //結果を出力 System.out.println(str1 + str2); // SamuraiEngineer } }
サンプルでは、引数ありのコンストラクタTestClassを宣言・定義しています。コンストラクタの名前はクラス名と同じにする必要があります。クラスのインスタンスを生成する際に引数を指定して、TestClassクラスのメンバ変数に値を渡しています。
コンストラクタの使い方については、こちらで詳しく解説していますので、ぜひ参考にしてくださいね。
staticなメンバをクラス名から呼び出す
先ほど、クラスのメンバ変数やメソッドを呼び出すためにはオブジェクトを生成する必要があると説明しました。しかし、オブジェクトを生成しないでメンバ変数やメソッドを呼び出す方法があります。
メンバ変数やメソッドにstatic修飾子を付けて宣言するとクラス名から呼び出すことができます。
// TestClass.java class TestClass { // メンバ変数 public static String name = "Samurai"; // メソッド public static String testMethod(){ return "Engineer"; } } // Main.java public class Main { public static void main(String[] args) { //メンバ変数を参照する String str1 = TestClass.name; //メソッドの呼出し String str2 = TestClass.testMethod(); //結果を出力 System.out.println(str1 + str2); // SamuraiEngineer } }
サンプルでは、TestClassクラスのメンバ変数およびメソッドにstatic修飾子を付けています。このメンバ変数やメソッドは、オブジェクトではなくクラス名から呼び出しています。
static修飾子が付いたメンバ変数やメソッドの使い方については、こちらで詳しく説明していますので参考にしてくださいね。
クラスの応用
クラスの継承
クラスの継承とは、クラスが保持しているメンバやメソッドの内容を他のクラスで継承することを指します。
継承元のクラスのことを「スーパークラス」「親クラス」などと呼び、継承したクラスのことを「サブクラス」「子クラス」などと呼びます。親クラスを継承するためにはextendsを指定します。
class 親クラス名 { 実行処理... } class 子クラス名 extends 親クラス名 { 実行処理... }
クラスの継承方法の詳細については、以下の記事で詳しく解説しています!
内部クラス
内部クラス(インナークラス)とは、クラスの中にクラスを作成する記述方法です。通常Javaは1ファイル1クラスですが、簡単な処理でファイルをわざわざ分けたくない場合に使用します。内部クラスは以下のように記述します。
class クラス名1 { class クラス名2 { 実行処理... { }
内部クラスの詳細な使い方については、以下の記事で詳しく解説しています!
final class
クラスにfinal修飾子を指定すると、そのクラスは子クラスで継承することはできません。クラスをfinalで指定するには、以下のように記述します。
final class クラス名 { 実行処理... }
クラスにfinal修飾子を使用する目的としては、そのクラスのメンバやメソッドの内容を不用意に変更されたくない場合に、親クラスの安全性を保つために使用します。クラスでfinal修飾子を使用する詳細については、以下の記事で詳しく解説しています!
ラッパークラス
ラッパークラスとは、int型などの基本データ型に用意されているクラスです。基本データ型をクラスのように扱えて、インスタンス化することも可能です。
int型のラッパークラスはInteger、float型はFloatクラスになります。ラッパークラスは、以下のように定義します。
Integer i = new Integer(10);
ラッパークラスの詳細については、以下の記事で詳しく解説しています!
抽象クラス
抽象クラスとは、実装を持たないシグネチャ(メソッド名、引数の型、引数の数)と戻り値の型のみを実装したメソッドを1つ以上保持するクラスを指します。
抽象クラスは「インスタンス化できない」「抽象メソッドをすべてオーバーライドする必要がある」などのルールがあります。そんな抽象クラスの詳しい使い方については、以下の記事で詳しく解説しています!
まとめ
ここでは、
- クラスの基本的な使い方からクラスを継承する方法
- 内部クラスの使い方
- final修飾子の指定
- ラッパークラス、抽象クラスの使い方
など、Javaにおけるさまざまなクラスの使い方について紹介しました。Javaを扱う上で、クラスは基本的な処理となりますので、ぜひ覚えておきましょう。もし、クラスの詳しい使い方を忘れてしまったら、この記事を思い出してくださいね。