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() はクラス名の後に @ とオブジェクトのハッシュコードを16進数で返しますが、これはあまり有用ではありません。
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 + " " + getName() + " (" + getYear() + ")"を返すようにします
Main.java: デフォルトのObjectメソッドとオーバーライドされたメソッドの違いを実演します。ガジェット名、年、ブランドの 3 つの入力を受け取ります。同じ名前と年(およびスマートフォンの場合はブランド)を使用してGadgetとSmartphoneの両方を作成し、その後:getClass().getSimpleName()を使用してガジェットのクラス名を出力します- ガジェットのデフォルトの
toString()に "@" 記号が含まれているかどうかを出力します(trueまたはfalseを出力) - オーバーライドされた
toString()を使用してスマートフォンを出力します
ガジェット/スマートフォンの名前 (String)、年 (int)、ブランド (String) の 3 つの入力を受け取ります。
このチャレンジは、なぜ Object メソッドのオーバーライドが重要なのかを示しています。デフォルトの toString() は Gadget@1a2b3c のようなものを返しますが、カスタムバージョンは意味のある情報を提供します!
自分で試してみよう
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 クラス単一継承と多段階継承なぜ多重継承ができないのかまとめ:従業員の階層構造