前回までのjava
多重継承(複数の親を持つ)はjavaさんではできないよ。
オーバーライド(メソッドの再定義)
親がもっているメソッドを同じ名前で子クラスで再定義する。
@Override
っていままで時々書いていたでしょう
「再定義してますよ」という注釈のこと。
これを入れることによって、次のメソッドのエラーチェックができるようになるのだ。
@Overrideのあとにpublic void start{}が書かれていたが、これは「親に同じ名前のメソッドがある」状態。
からっぽだけど。
それをここで上書きしますよ、という。
こういう注釈を「アノテーション」という。
>アノテーション(annotation)は元々、注釈、注記といった意味合いの英語である。意味は場合により様々であり、IT用語としては特にプログラミングに注意書きを追加する機能、ドキュメントの印刷時に済みの余白などに文字を追加する機能、
ここを読んでおくこと
/**
* Javaドキュメンテーションコメント
* @author koyama
* @version 1.0
*/
とか。
> 最初は「作成者」を意味する「@author」だけが記述されているので、ここへ次のように、説明と「バージョン」を意味する「@version」を追加します。この「@author」や「@version」といった文字列はJavadocコメントの中で特別な意味を持つタグです。この他にも、いくつかのタグがあります。
>【1】Override
Overrideは、スーパークラスのメソッドをオーバーライドするという注釈を付けたいときに使用します
> StandardPrinterクラスのtoString()メソッドは、StandardPrinterクラスのスーパークラスであるObjectクラスのtoString()メソッドをオーバーライドしたつもりがタイピングミスにより、toStrimg()メソッドとなっています。(中略)
こういった単純ミスを防ぐために、Overrideアノテーション型のアノーテションを利用します。具体的には「@Override」をメソッドの修飾子へ付けます。これにより、開発者はコンパイラへ、このメソッドはスーパークラスのメソッドをオーバーライドすることを知らせます。
メソッド宣言にfinalを付けると継承禁止になるよ。
インスタンスの姿
教科書p421
newとかされると、多重構造のメソッドはまず「子クラス」側の部分で対応しようとする。「子クラスにないかな・・・ないのか。じゃあ親を見に行くよ」という。
同じメソッドが親/子にあると(オーバーライド状態)、両方中に持ってるんだけど、子クラスの方のメソッドを実行し親の方は実行しない。
しかし!
親クラスの方の同じ名前のメソッドが役に立つ場合もある。
p424
親の方が一回の攻撃で10pのダメージに変更したのに
子供のほうが5pのままで、コードのあちこちを記述しなおさなになってしまうとよろしくないとか、そういう時に、「子クラスから親クラスのメソッドを呼び出して利用」ということができる。
その場合、
super.attack(m);//親クラスのattack
と書く。
この教科書はすーぱーひーろーが「子クラス」だから大変大変混乱しやすい。
このsuper.は、「スーパークラス」いわゆる「親クラスの」という記述。
p425のコードをSuperHero適当に追加して記述する。Mainにも追加。
--->part2-11/SuperHero.java
public class SuperHero extends Hero{
private boolean flying;
public void fly() {
this.flying=true;
System.out.println("飛び上がった");
}
public void land() {
this.flying=false;
System.out.println("着地した");
}
public void run() {
System.out.println("撤退した");
}
public void attack(Matango m) {
super.attack(m);;
if (this.flying) {//飛行中ならさらにもう1回攻撃
super.attack(m);
}
}
}
--->Main413.java
public class Main413 {
public static void main(String[] args) {
Hero h =new Hero();
h.run();
SuperHero sh = new SuperHero();
sh.run();
sh.fly();
Matango m = new Matango();
sh.attack(m);
}
}
---
みなとは逃げ出した
撤退した
飛び上がった
みなとの攻撃
5pのダメージをあたえた
みなとの攻撃
5pのダメージをあたえた
自分のものはthis.
親のものはsuper.
何も書いてなければ「自分」
なお「親の」フィールドやメソッドは利用できるが、おじいさんやもっと上は利用できないよ
p427
new SuperHero();
をすると、
まず親インスタンスのHeroが作られ、
その外側に子インスタンスが作られ、
子クラスが呼び出される
すべてのコンストラクタは「まず親の」コンストラクタを呼び出しているらしい
呼び出すためのsuper();とかが書いてなければコンパイル側で勝手に書き足しているらしい
p430をMain430.javaとして作成しましょう