継承

 クラスは,他のクラスを組み合わせて作ることができるといいました。実はもっとすごい方法で,すでにあるクラスを再利用してオリジナルクラスを作ることができます。それが「継承」です。継承を使えば,すでにあるクラスから,ほんの少しだけ機能が違う新しいクラスを簡単に作ることができます。

継承でクラスの再利用が簡単になる

 例えば以下のように考えてみましょう。オリジナルの彫刻に,別の模様をつけます。そして新しい模様になった彫刻から型を取り,新しいクラスを作ります。このクラスは,もともとあったクラスととてもよく似ていますが,ここから作られる彫刻は,違う模様の彫刻になります。

 このように,既存のクラスが持つ機能を「変更したり追加したりして」新しいクラスを作った場合,既存のクラスを「スーパークラス」,新しいクラスを「サブクラス」と呼びます。

 では,実際にクラスを継承するコードをみてみましょう。

public class MyExtendsApp
}
class SubClass extends MyExtendsApp{ // サブクラス
}

 このコードでは,最初にMyExtendsクラスの宣言があります。さらにその下には,MyExtendsAppクラスをスーパークラスとするSubClassという名前のサブクラスが定義されています。このように,ある既存のクラスのサブクラスを定義する場合は,extendsキーワードに続いて,スーパークラスにしたいクラス名をクラス定義に追加します。

機能の継承

 クラスを継承する場合,どのように記述すればいいのかは説明しましたが,まだこれだけではどうしてクラスが再利用できるのか理解できないかも知れません。非常に重要なポイントは「サブクラスはスーパークラスの機能やデータを継承する」ということです。つまり,サブクラスには,スーパークラスと同じ機能やデータを用意する必要はありません。サブクラスは,スーパークラスの機能やデータを使うことができるからです。

 そうなると,サブクラスは,単にスーパークラスをコピーしただけのような存在に思えてきます。しかしそうではありません。クラスの機能には,アクセス制限という方法で,他のクラスから使えなくする能力を持っています。そのため,たとえ自分のサブクラスといえども,アクセスできない機能やデータを定義することができるのです。

 さらに,サブクラスでは,スーパークラスから受け継いだ機能に,修正や変更を行うことができます。

 このようにして,すでにあるクラスの機能を使いまわし,使えない部分は変更して再利用することが可能になるのです。

 Java言語では,クラスが持つ機能は,あくまでそのクラスが持ちます。サブクラスに継承されるのは,スパークラスの機能を呼び出すことができる機能だけです。ただし,その機能がスーパークラスのものか,サブクラスのものかを意識する必要はありません。まるでサブクラスの機能のように,スーパークラスの機能が呼び出せるからです。

パッケージ

 Javaプログラムでクラスライブラリを利用するときは,ソースコードにimport文を使ってクラスを組み込まなければいけません。しかし,Javaのクラスライブラリは大量のクラスでできているので,クラスごとにimportするのは大変です。そこで普通は「パッケージ」という単位でimportします。パッケージとは,クラスを用途や役割にそって分類しまとめたものです。

 Java言語には,たくさんのクラスが用意されていますが,それらはほとんどがパッケージとして提供されています。自分のオリジナルクラスが増えてきたら,オリジナルパッケージを作ることもできます。パッケージを作ることで,必要な時に必要なクラスだけを自分のコードに組み込むことができるようになるからです。

 パッケージの名前は階層構造を持っています。例えば,Allパッケージの中にMyPacパッケージがあり,その中にMyClassというクラスがある場合,このクラスをimportするには以下のような記述になります。

import All.MyPac.MyClass

 また,パッケージの中のすべてのクラスを指定する場合は,ワイルドカード(すべてを表現する記号のこと)である「*(半角のアスタリスク)」を使ってパッケージ内のすべてのクラスを,自分のコードに組み込むことができます。上記のクラスをimportする場合,以下のように記述できます。

import All.MyPac.*

 ただし,注意する点としては,ワイルドカードで指定できるのはクラスだけだということです。もし,そのパッケージが内部にパッケージを持っている場合(サブパッケージと呼びます),ワイルドカードでサブパッケージまで含めることはできません。その場合は,サブパッケージ名を含めて記述しimportする必要があります。

 例えば,Allパッケージの中にMyPacパッケージがあり,MyPacパッケージの中にUtilパッケージがあり,その中にToolクラスがあったとします。その場合,

import All.MyPac.*

ではなく,

import All.MyPac.Util.*

のように記述しなければToolクラスはimportされません。

 実際のソースコードでは,必ず一番最初にimport文がきます。クラスの宣言よりも先にくることに注意してください。ただし例外もあります。それは,「java.langパッケージ」です。このパッケージは,importで組み込まなくても勝手に組み込まれるパッケージです。このパッケージは,Javaの基本機能を提供するクラスのパッケージなので,あえてimportしなくても組み込まれるようになっています。

パッケージの名前

 パッケージの名前のつけ方に決まりを制定することで,他のパッケージとの名前の衝突防止を防止することができます。この問題についてSun Microsystemsでは,インターネットにおけるドメイン名を利用してパッケージ名をつけることを推奨しています。

 名前の付け方は,ドメイン名を逆から並べます。例えばwww.css.co.jpなら,jp.co.cssから始まるパッケージ名をつけるのです。ただし,java,javax,sunで始まるパッケージ名はSun Microsystems社が予約しています。

 以上,Javaをはじめて学習しようという人のために最初に知っておくべきことを連載でまとめましたが,今回が最終回です。ご愛読ありがとうございました。