Javaのスーパークラスとサブクラス

スーパークラスとサブクラス

すでに存在するクラスは「拡張」することができます。
ここで、元になるクラスのことを「スーパークラス」と言います。
そして、スーパークラスの情報を使って拡張したクラスを「サブクラス」と言います。
スーパークラスとサブクラスの関係は、ちょうど親子関係のようなものです。
親の方がスーパークラスで、子の方がサブクラスになります。
スーパークラスは、「スーパー」と付いているので、「優れているクラス」と勘違いしてしまいそうですが、実はここで言う「スーパー」とは「より上の」という意味であり、サブクラスの「サブ」は「より下の」という意味になります。同じ意味の日本語を当てはめれば、スーパークラスは上位クラス、サブクラスは下位クラスというように考えると分かりやすいかもしれません。ただし、上位や下位が優劣を表すものではないということは前述の通りです。
そして、サブクラスの下位に位置するクラスは「サブクラス」となり、元となるサブクラスは「サブクラス」から見て「スーパークラス」となるわけです。どのクラスを基準に考えるかで、相対的にスーパークラスとサブクラスという呼び名は変化していくことになるのです。

スーパークラスは1つ

先ほどスーパークラスとサブクラスは相対的な関係で、どのクラスを基準とするかで、呼び名が変わっていくということを説明しました。
ただし、サブクラスを基準として見たときに、スーパークラスは必ず1つになります。というか、1つしかスーパークラスを持つことができない決まりになっています。
その代わり、1つのスーパークラスからは、複数のサブクラスを作ることができます。
つまり、サブクラスよりも多くのスーパクラスがある、という状態は作れないということです。
上位のクラスは下位のクラスよりも必ず少ないということです。
こうしてJavaのクラスは階層構造を構築します。この階層構造全体をクラス階層と呼びます。
Webのような網の目の構造ではなく、木のようなツリー構造になっているイメージです。

Javaでクラスを拡張する方法(extends)

例えば、長方形を定義するRectangleクラスを宣言済みだとします。この長方形に名前をつけた新しいサブクラス(NamedRectangle)を宣言します。

class NamedRectangle extends Rectangle{
・・・
}

classの後ろにサブクラス名を記述し、extendsの後ろにスーパークラス名を記述します。
つまり、サブクラスの宣言は下記のようになります。

class サブクラス名 extends スーパークラス名{
・・・
}

Objectクラス

サブクラスから見たスーパークラスは必ず1つになるという説明をしました。
それでは、スーパークラスをツリー構造の上位方向にたどっていくとどこにたどり着くでしょう?
正解は、Objectクラスです。
このObjectクラスは、全てのクラスの共通の祖先です。
Objectクラスは、すべてのクラスの中で唯一、スーパークラスを持たないクラスです。
ちなみに、クラスをスーパークラスを指定せずに宣言すると、自動的にObjectクラスのサブクラスとして宣言されます。

class Rectangle{
・・・
}
class Rectangle extends Object{
・・・
}

上記2つのRectangleクラスの宣言は、どちらも同じ意味になります。

タイトルとURLをコピーしました