Javaの継承(extends)について
Javaとは
Javaは、1995年にリリースされたプログラミング言語およびコンピューティング・プラットフォームです。Javaは多くの現場で使われており、汎用的でOSに依存せず、「一度プログラムを書けば、どこでも実行できる」という特徴があることが理由で、とても人気のあるプログラミング言語です。
プログラム言語には動くマシンが限定されてしまうケースが多いのですが、JavaはWindowsやMacOS、Linux、UNIXなど様々なマシンで動かすことができます。作成したソフトが動く環境を考えるというのはプログラマーにとって大変な問題ですので、どこでも動作して、OSに依存しないという点は重要なポイントになります。
継承
Javaでは継承によってさまざまな機能を引き継ぐことができます。
特にクラスの継承は重要な部分です。クラスを継承することで、開発者は既存のクラスの変数やメソッドなどの要素を取り込むことができます。つまり同じ記述を繰り返すという手間を省いて新しいクラスを作成することができるということです。
そうすると、何度も同じようなプログラムを書く必要がなくなり、作業の効率を上げ、そもそもソースコード全体を見やすくさせることができるのです。
この便利な「継承」について学習していきましょう!
extendsの使い方
クラスの継承をする際、継承元のクラスをスーパークラスもしくは親クラスと呼び、継承先のクラスをサブクラスもしくは子クラスと呼びます。継承したら、サブクラスはスーパークラスのメソッドや変数を使えるようになります。
継承の書式は…
class サブクラス名 extends スーパークラス名 { }
簡単なコードを書いてみます。
public class Animal{
public String name; (⇦変数:名前)
public void talk(String t) { (⇦メソッド:話す)
System.out.println( t + "と言います。");
}
}
---------------
[サブクラス]
public class Dog extends Animal { (⇦Dogクラスがanimalクラスをextends(継承)している)
public void bark(){ (⇦Dogクラス特有のメソッド)
System.out.println("ワンワン!");
}
---------------
[サブクラス]
public class Human extends Animal { (⇦Humanクラスがanimalクラスをextends(継承)している)
public void cry(String c){ (⇦Humanクラス特有のメソッド)
System.out.println("涙が出ます。");
}
}
どちらにも共通するものはスーパークラスに書いておくことで、それぞれのクラスに再度書く必要がなくなるということです。
反対にヒトはワンワン鳴かないし、イヌは涙を流さないのでそれぞれ特有のものはそれぞれのクラスに書くということになります。
ここの捉え方を間違えると、バグなどに繋がるので気をつけましょう!
呼び出し方
とても簡単な初歩的な呼び出しを紹介しておきます。
サブクラスで書いた内容を別のクラスから呼び出してみます。
public static void main(String args[]){
Dog taro = new Dog(); (⇦Dogのオブジェクトを作る)
}
}
改めて見ていきましょう。
public static void main(String args[]){
Dog taro = new Dog();
taro.bark();
}
}
実行結果 … ワンワン!
修飾子に関して
メンバ変数やメンバメソッドに対するアクセス制限に関して、「public」を付けた場合、または修飾子を省略した場合は、クラス外からでも直接アクセスができます。
しかし「private」を付けた場合はクラス内からしかアクセスが出来ません。
例えば先ほどのAnimalクラスのtalkメソッドを「private」にします。
・・・
}
Animalを継承したDogから、上記のようにprivate指定されたtalkを呼び出しができるかというと、アクセスできません。
またサブクラスのオブジェクトからもアクセスは出来ません。
この修飾子はpublicと同じような働きをし、スーパークラス内で定義されたprotected指定されたメンバ変数やメンバメソッドは、サブクラス内からもアクセスが出来ます。また他のクラス内からもアクセスできます。
しかし、パッケージというところまで話を広げると「public」は異なるパッケージからでもアクセス可能ですが、「protected」は異なるパッケージからはアクセスできず、いわば「private」と同じということになります。
なので、「public」と「protected」は明確に分けて使わなければなりません。
最後に
今回紹介した、継承(extends)はプログラムを書く上で大変便利ですが、Javaのクラスで継承(extends)の注意点があります。
まず、1つのサブクラスが継承できるのは1つのスーパークラスのみであるということです。2つ以上のスーパークラスを継承することはできません!
次に、「final修飾子」が付いたスーパークラスの継承はできません。また、スーパークラス内の「private修飾子」の付いた変数やメソッドはサブクラスでは利用できません。
これらのことにも気を付けて、上手に継承(extends)を使いましょう。
そして今回紹介した内容はほんの最初の部分になります。
スーパークラスやサブクラスの使い方、活かし方はたくさんあります。
次回機会がありましたら紹介していきたいと思いますが、早く知りたいという方はご自身で学習してみてください。