Java の extends キーワードを使って継承を実装しよう!初心者向けにやさしく解説
新人
「Javaで他のクラスの機能をそのまま使うには、どうすればいいんですか?」
先輩
「それにはextendsというキーワードを使うと便利だよ。Javaでは親クラスの機能を子クラスが引き継ぐために使うんだ。」
新人
「エクステンドって読むんですね。どんなふうに使うんですか?」
先輩
「じゃあ、extendsキーワードの意味と使い方について、順番に見ていこう!」
1. extendsキーワードとは何か(意味と読み方)
Javaのextends(エクステンズ)キーワードは、あるクラスが別のクラスの機能を引き継ぐために使います。これは「継承」と呼ばれる仕組みで、すでにあるクラス(親クラス)のコードを再利用することができます。
たとえば、「動物」という親クラスを作って、「犬」や「猫」という子クラスでその機能を使いたい場合にextendsを使います。
英語のextendには「広げる」「伸ばす」という意味があります。つまり、既存のクラスにさらに機能を広げる、というイメージで覚えるとわかりやすいでしょう。
次のように書くことで、親クラスの機能を子クラスに継承できます。
public class Animal {
void eat() {
System.out.println("食べます");
}
}
public class Dog extends Animal {
void bark() {
System.out.println("ワンワン");
}
}
このように、Dogクラスはextends Animalと書くことで、Animalクラスのeat()メソッドをそのまま使えるようになります。
この仕組みを使えば、同じようなコードを繰り返し書かなくても、共通する動きを再利用できるため、プログラムがスッキリまとまります。
2. Javaで継承を使うときにextendsが必要な理由
extendsは、Javaで継承を使うときに必ず必要なキーワードです。もしextendsを使わずに別のクラスの機能を使おうとすると、そのクラスをコピーして同じ内容をもう一度書くことになってしまいます。
たとえば、犬と猫のクラスをそれぞれ作るとき、「名前を表示する」や「動く」といった動きが共通しているなら、それらをAnimalクラスにまとめておき、共通部分は親クラスに書くのが基本です。
public class Animal {
String name;
void move() {
System.out.println(name + "が動きます");
}
}
public class Cat extends Animal {
void meow() {
System.out.println("ニャー");
}
}
このコードでは、Catクラスはextends Animalで継承しているので、nameやmove()もそのまま使えます。
実際にMainクラスで使ってみると、次のようになります。
public class Main {
public static void main(String[] args) {
Cat cat = new Cat();
cat.name = "ミケ";
cat.move();
cat.meow();
}
}
ミケが動きます
ニャー
このように、親クラスに共通する機能をまとめておくことで、CatだけでなくDogやBirdなど他のクラスでも同じ機能を使いまわすことができます。
extendsがあることで、親クラスと子クラスの関係を明確にし、コードを再利用しやすくしてくれます。
プログラミングの世界では、「同じことを繰り返し書かない(DRY原則)」が大切です。extendsを使えば、同じ機能を一度だけ書いて、何度でも使えるようになります。
また、JavaのプログラムはPleiadesで簡単に実行できるので、まずは小さな親クラスと子クラスを作って試してみるのがおすすめです。
extendsキーワードは、Javaで継承を使ううえで欠かせない基本の仕組みです。初心者のうちは、親クラスを作って、子クラスでextendsをつけるパターンを何度も繰り返して覚えていきましょう。
3. extendsを使った継承の基本コード例
それでは実際に、extendsを使ったJavaの継承の基本的なコードを見ていきましょう。ここでは、親クラスに共通する機能を持たせて、それを子クラスが引き継いで使うという、よくあるパターンを紹介します。
まずは親クラスとなるPersonクラスを作成します。このクラスには名前を表示する機能を持たせましょう。
public class Person {
String name;
void sayHello() {
System.out.println("こんにちは、私は" + name + "です。");
}
}
次に、Personクラスを継承する子クラスStudentを作ります。子クラスでは独自のstudyメソッドも追加してみましょう。
public class Student extends Person {
void study() {
System.out.println("勉強しています。");
}
}
最後に、これらのクラスを動かすためのMainクラスを作成します。
public class Main {
public static void main(String[] args) {
Student s = new Student();
s.name = "田中";
s.sayHello(); // 親クラスのメソッド
s.study(); // 子クラスのメソッド
}
}
こんにちは、私は田中です。
勉強しています。
このように、extendsを使うことで、子クラスStudentが親クラスPersonのメソッドを自然に使えるようになります。これがJavaにおける継承の基本の使い方です。
4. extendsで引き継いだメソッドを使ってみよう
先ほどの例では、親クラスのメソッドを子クラスでそのまま使うことができました。ここではもう少し応用して、親クラスにいろいろな機能を用意し、それを子クラスが引き継いで使う様子を見てみましょう。
たとえば、親クラスAnimalに「鳴く」や「移動する」などのメソッドを追加して、子クラスで使う例を考えます。
public class Animal {
String name;
void move() {
System.out.println(name + "が歩きます。");
}
void sound() {
System.out.println(name + "が鳴きます。");
}
}
このAnimalクラスを引き継ぐDogクラスを作成します。
public class Dog extends Animal {
void wagTail() {
System.out.println(name + "がしっぽを振ります。");
}
}
このとき、Dogクラスのインスタンスは、親クラスのmoveやsoundも使えるようになります。Mainクラスで確認しましょう。
public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
dog.name = "ポチ";
dog.move();
dog.sound();
dog.wagTail();
}
}
ポチが歩きます。
ポチが鳴きます。
ポチがしっぽを振ります。
このように、子クラスのDogが、親クラスのメソッドをextendsで引き継ぎ、そのまま使うことができています。
これは実際のプログラミングでもとても便利で、「共通の機能は親に書いて、個別の動きは子に書く」という考え方がプログラムを整理しやすくしてくれます。
5. 親クラスと子クラスを別ファイルに分けて使う方法(簡単な方法で)
PleiadesでJavaのプログラムを書くときは、親クラスと子クラスを別ファイルに分けるのが基本です。そうすることで、クラスごとの役割がはっきりして、コードが見やすくなります。
たとえば、Animal.javaというファイルに親クラスを、Dog.javaというファイルに子クラスを、Main.javaというファイルに実行用のコードを書くと、構成がとてもスッキリします。
① Animal.java(親クラス)
public class Animal {
String name;
void eat() {
System.out.println(name + "が食べています。");
}
}
② Dog.java(子クラス)
public class Dog extends Animal {
void bark() {
System.out.println("ワンワン!");
}
}
③ Main.java(実行用)
public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
dog.name = "シバ";
dog.eat(); // 親クラスのメソッド
dog.bark(); // 子クラスのメソッド
}
}
シバが食べています。
ワンワン!
このように、クラスごとにファイルを分けることで、クラスの役割が明確になり、後からプログラムを見直すときにも分かりやすくなります。
Pleiadesでは、プロジェクト内に新しいJavaクラスを作ると自動で別ファイルになるので、意識的にクラスを整理して使うことができます。
これからJavaを学んでいく中で、extendsを使った継承と、クラスの分割をセットで覚えておくと、より実践的なプログラミングに役立ちます。
6. extendsを使ったときの注意点(よくある間違い)
Javaでextendsを使うときは、いくつかの注意点があります。特に初心者がやってしまいがちな間違いをここで紹介します。
- 親クラスの定義を忘れる:子クラスに
extendsを書いても、親クラスが存在していなければエラーになります。 - 継承する順番を間違える:
public class A extends Bのように書きますが、Bが親、Aが子になります。順番を逆に書くとコンパイルエラーになります。 - メソッド名の重複:親クラスと子クラスに同じ名前のメソッドを定義すると、子クラスのメソッドが使われます。これは混乱のもとになるので、初心者のうちは同じ名前を避けましょう。
- 変数の重複:親クラスと子クラスに同じ名前の変数があると、子クラスの変数が優先されます。これも注意が必要です。
例えば、次のようなコードでは、親クラスと子クラスの両方にnameという変数があります。
public class Parent {
String name = "親";
}
public class Child extends Parent {
String name = "子";
void printName() {
System.out.println(name);
}
}
public class Main {
public static void main(String[] args) {
Child c = new Child();
c.printName();
}
}
子
このように、子クラスの変数が優先されます。初心者のうちは、同じ名前を避けて書いたほうが安全です。
7. 親クラスに変更を加えたときの子クラスへの影響
Javaでextendsを使っていると、親クラスを修正したときに子クラスにも影響が出ることがあります。これもとても大事なポイントです。
たとえば、親クラスにあったメソッドの名前を変更すると、そのメソッドを使っていた子クラス側でエラーが出る可能性があります。
次のような例を見てみましょう。
public class Parent {
void greet() {
System.out.println("こんにちは");
}
}
public class Child extends Parent {
void useGreet() {
greet();
}
}
public class Main {
public static void main(String[] args) {
Child c = new Child();
c.useGreet();
}
}
こんにちは
このコードは問題なく動きます。しかし、親クラスのgreet()というメソッドをsayHello()に名前を変えると、子クラスのuseGreet()でエラーになります。なぜなら、もうgreet()が存在しないからです。
つまり、親クラスを修正するときは、子クラスの動きも必ず確認する必要があります。これはJavaの継承においてとても重要な考え方です。
Pleiadesを使って開発していると、クラス間のエラーがすぐに表示されるので、変更後はエラーが出ていないかをしっかりチェックしましょう。
8. extendsを使ったクラス設計のコツ(初心者向けアドバイス)
extendsを使いこなすには、クラスをどう設計するかも大事なポイントです。ここでは初心者が覚えておきたい設計のコツをいくつか紹介します。
- 共通点を親クラスにまとめる:複数のクラスで同じような変数やメソッドが出てきたら、親クラスにまとめて継承させるとスッキリします。
- 子クラスは個性を表現する:共通しない機能は子クラスに書きましょう。たとえば「猫は鳴く」「鳥は飛ぶ」など。
- 名前はわかりやすく:クラス名やメソッド名は、何をするかがはっきり伝わるように名付けましょう。
- 1つのクラスに役割を詰め込みすぎない:親クラスに機能を詰めすぎると逆にわかりにくくなります。バランスが大切です。
たとえば、「果物」を表すクラスを作るとき、次のように設計することができます。
public class Fruit {
String name;
void showName() {
System.out.println("これは" + name + "です。");
}
}
public class Apple extends Fruit {
void taste() {
System.out.println("甘いです。");
}
}
public class Lemon extends Fruit {
void taste() {
System.out.println("すっぱいです。");
}
}
public class Main {
public static void main(String[] args) {
Apple apple = new Apple();
apple.name = "りんご";
apple.showName();
apple.taste();
Lemon lemon = new Lemon();
lemon.name = "レモン";
lemon.showName();
lemon.taste();
}
}
これはりんごです。
甘いです。
これはレモンです。
すっぱいです。
このように、共通の処理は親クラスに、個別の特徴は子クラスに、というルールを守ると、コードがとても見やすくなります。
extendsを使ったクラス設計は、Javaを使った本格的な開発でもよく使われます。最初はシンプルなクラス構成から練習し、少しずつ複雑な設計にも挑戦していきましょう。
まずはPleiadesで親クラスと子クラスをそれぞれ作り、extendsを使って実行してみてください。実際にコードを書いて動かすことで、「継承」や「引き継ぐ」の意味がだんだんと体にしみついていきます。