Object クラス
CoddyのJavaジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 24/87。
Javaでは、作成するすべてのクラスはObjectという名前の特別なクラスを自動的に継承します。どこにもextendsと記述しなくても、作成したクラスは依然としてObjectの子クラスです。これにより、Objectはクラス階層全体のルートとなります。
public class Person {
// これは暗黙的に Object を継承します
}
// 以下と同等です:
public class Person extends Object {
}すべてのクラスは Object を継承しているため、Java のすべてのオブジェクトは、いくつかの組み込みメソッドにアクセスできます。最も一般的に使用されるものは以下の通りです:
| メソッド | 目的 |
|---|---|
toString() | オブジェクトの文字列表現を返します |
equals(Object obj) | 2 つのオブジェクトが等しいかどうかを比較します |
hashCode() | オブジェクトのハッシュコード値を返します |
getClass() | オブジェクトの実行時クラスを返します |
デフォルトでは、これらのメソッドは汎用的な実装を持っています。例えば、toString() はクラス名の後にオブジェクトのメモリアドレスを返しますが、これはあまり便利ではありません:
Person p = new Person();
System.out.println(p.toString()); // 出力: Person@1a2b3c4dこれが、意味のある動作を提供するために、独自のクラスでこれらのメソッドを頻繁にオーバーライドする理由です。Object がすべての親であることを理解すれば、なぜ任意のオブジェクトを Object 変数に格納できるのか、そしてなぜ作成するすべてのオブジェクトで特定のメソッドが利用可能なのかを理解する助けになります。
チャレンジ
簡単Object クラスが、Object から継承されたメソッドを実証するシンプルなガジェット在庫システムを構築することで、どのようにすべての Java クラスのユニバーサルな親として機能するかを探索しましょう。
コードを整理するために 3 つのファイルを作成します:
Gadget.java: 電子ガジェットを表すクラスを作成します。クラスには以下を含める必要があります:name(String) とyear(int) のプライベートフィールド- 両方のフィールドを初期化するコンストラクタ
- ゲッターメソッド
getName()とgetYear()
Smartphone.java: Gadget を継承し、スマートフォン固有の機能を追加するサブクラスを作成します:brand(String) のプライベートフィールド- name、year、brand を受け取るコンストラクタ。親クラスの部分には
super(name, year)を使用してください - ブランドを返すメソッド
getBrand() toString()メソッドをオーバーライドして、Smartphone: [brand] [name] ([year])を返すようにします
Main.java: デフォルトのObjectメソッドとオーバーライドされたメソッドの違いを実証します。ガジェット名、年、ブランドの 3 つの入力を受け取ります。同じ名前と年(およびスマートフォンの場合はブランド)を使用してGadgetとSmartphoneの両方を作成し、その後:getClass().getSimpleName()を使用してガジェットのクラス名を出力します- ガジェットのデフォルトの
toString()に "@" 記号が含まれているかどうかを出力します(trueまたはfalseを出力) - オーバーライドされた
toString()を使用してスマートフォンを出力します
ガジェット/スマートフォンの名前 (String)、年 (int)、ブランド (String) の 3 つの入力を受け取ります。
このチャレンジは、なぜ Object メソッドのオーバーライドが重要なのかを示しています。デフォルトの toString() は Gadget@1a2b3c のようなものを返しますが、カスタムバージョンは意味のある情報を提供します!
チートシート
Javaでは、すべてのクラスが自動的にObjectクラスを継承し、クラス階層全体のルートとなります。
public class Person {
// これは暗黙的にObjectを継承します
}
// 以下と同等です:
public class Person extends Object {
}Javaのすべてのオブジェクトは、Objectから継承されたいくつかの組み込みメソッドにアクセスできます。
| メソッド | 目的 |
|---|---|
toString() | オブジェクトの文字列表現を返します |
equals(Object obj) | 2つのオブジェクトが等しいかどうかを比較します |
hashCode() | オブジェクトのハッシュコード値を返します |
getClass() | オブジェクトの実行時クラスを返します |
デフォルトでは、toString()はクラス名の後にオブジェクトのメモリ番地を続けて返します。
Person p = new Person();
System.out.println(p.toString()); // 出力: Person@1a2b3c4d独自のクラスでこれらのメソッドをオーバーライドして、意味のある動作を提供できます。すべてのクラスはObjectを継承しているため、任意のオブジェクトをObject型の変数に格納できます。
自分で試してみよう
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 入力を読み込む
String name = scanner.nextLine();
int year = scanner.nextInt();
scanner.nextLine(); // 改行文字を消費する
String brand = scanner.nextLine();
// TODO: name と year を使用して Gadget オブジェクトを作成する
// TODO: name、year、brand を使用して Smartphone オブジェクトを作成する
// TODO: getClass().getSimpleName() を使用して gadget のクラス名を出力する
// TODO: gadget の toString() に "@" が含まれているかどうかを出力する (true または false)
// TODO: smartphone を出力する (オーバーライドされた toString() を使用)
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
4継承
継承の基本 (extends)super キーワードメソッドのオーバーライド (@Override)コンストラクタチェーンObject クラス単一継承と多段階継承なぜ多重継承ができないのかまとめ:従業員の階層構造