かんたんなJava入門これからJavaを始めようという人の為の超入門サイトです。かんたんなJava入門twitter7facebook0hatenabookmark60lineあるクラスを継承したクラスを書くと、親クラスのメンバ(メソッド及びフィールド)を全て引き継ぐことが出来るっていうところまで、継承って何?で説明しました。その際、親クラスのメソッドを単純に引き継ぐだけでなく、親クラスのメソッドを子クラスで定義しなおす(上書きする)ことも出来ます。親クラスで定義されているメソッドを子クラスで再定義することをオーバーライドと言います。似たのにオーバーロードっていうのがありますが、全く関係ないので混同しないようにして下さい。参考:メソッドのオーバーロードって何?オーバーライドってどういうことなのかよく分かるように、実際にやってみましょう。linkもくじオーバーライドをしてみるオーバーライドの仕組みフィールドをオーバーライド?継承とフィールドオーバーライドをしてみるこんなCarクラスがあるとします。}}フィールドはgasのみ。60で初期化しています。60リットルと思っていてください。メンバメソッドは、ガソリンを消費して走るdriveメソッドガソリンを補給するputGasメソッド現在のガソリンの量を出力するcheckGasメソッドの3つです。driveメソッドは、引数に渡したガソリンの量に応じて走るものとします。燃費はリッター当たり10kmということにしておきましょう。フィールドのgasの数値は、使った分だけ減ります。putGasメソッドは、引数に渡した数量だけgasが増えます。checkGasメソッドは、現在のgasの値を出力します。継承の仕組みにスポットを当てる為、あえてカプセル化は不十分な状態になっています。同一パッケージ内のCarTestクラスでこのCarクラスをインスタンス化して走らせてみましょう。}}このCarTestクラスを実行すると、標準出力に以下のように出力されます。ここまでは理解できますでしょうか。今度はCarクラスを継承したEconomyCarクラスを作ります。EconomyCarクラスは燃費が抜群によくてリッター20km走るとします。}}EconomyCarクラスは、Carクラスを継承しているので、何も書かずともフィールドもメソッドもCarクラスのものを全て引き継いでいます。driveメソッドのみ処理内容を再定義することで、リッター20km走るようにしています。このように子クラスにおいて処理内容を再定義することをオーバーライドと言います。「@Override」はアノテーションと言って、親クラスのメソッドをオーバーライドすることを宣言する際に付けます。アノテーションを付けることで、もし親クラスに同名のメソッドがなければコンパイラがエラーメッセージを出してくれるので、付けておくことをおすすめします。なくてもプログラム上問題はありません。このEconomyCarクラスをインスタンス化して走らせてみましょう。}}低燃費が自慢のEconomyCarクラスのインスタンスは、リッター20km走ってますね。子クラスのインスタンスメソッドを呼べば、子クラスで再定義(オーバーライド)されているメソッドが呼ばれているのが分かると思います。オーバーライドの仕組み前ページ及びこのページ冒頭で、継承について「親クラスのメンバを引き継ぐ」という表現をしましたが、実際は、継承とは、引き継いでいるというより「親クラスのインスタンスを内包した状態」と言う方が正しいです。この考え方は、オーバーライドの仕組みを理解する為に非常に重要です。具体的にどういうことか見ていきましょう。Carクラスを継承したEconomyCarクラスのインスタンスの内部構造を図で表すとこんな感じになります。EconomyCarインスタンスの中に、Carインスタンスが内包されていて、親子それぞれのクラスのメンバがその中に存在している状態です。EconomyCarクラスのメンバはご覧のようにdriveメソッドだけです。一応、メンバの概要だけ再掲しておきます。}}この状態で、EconomyCarクラスのインスタンスメソッドを呼ぶ(及びフィールドにアクセスする)とはどういう状態かと言うと、こういうことです。子クラスのインスタンスメソッドを外から呼んだ際、そのメソッドが子クラスでオーバーライドされている場合はその子クラスのメソッドが呼ばれます。子クラスでは何ら定義されていないメソッドが呼ばれた場合は、内包している親クラスのメソッドが呼ばれます。子クラスにてオーバーライドされた親クラスのメソッドは、隠されたような状態になるわけです。これがオーバーライドの基本的な仕組みです。子クラスのインスタンスは、親クラスのインスタンスを内包しているオーバーライドとは親クラスのメソッドを子クラスのメソッドが覆い隠している状態というのを理解して下さい。フィールドをオーバーライド?この例の場合、オーバーライドされて書き換えられた部分はdriveメソッドの処理中の数字部分(燃費)だけですね。"km走りました");}これならnenpi(燃費)というフィールドを作って、driveメソッドでそのnenpiの数値を使うようにしておけば、子クラスでnenpiを書き換えるだけで燃費をコントロールすることが出来そうです。CarクラスとEconomyCarクラスを以下のようにしてみましょう。20;}こうすればEconomyCarのnenpiは20になります。これならわざわざdriveメソッドをオーバーライドせずとも、リッター20km走れるようになるんじゃないでしょうか?実行してみましょう。以下のようにCarとEconomyCarを続けて走らせます。残念ながらご覧のように、このやり方では低燃費は実現しません。一体、なぜでしょうか??継承とフィールドフィールドも原則的にはメソッドのオーバーライドと同じで、子クラスに同名のフィールドがあればそちらが優先して使われます。先ほどの例に出てきたnenpiフィールドを使った場合は以下のようになります。この状態だとEconomyCarのnenpiが20に変わっても、EconomyCarの走行距離は2倍にはなりません。言うと、この場合呼ばれるdriveメソッドは親インスタンスのdriveメソッドだからです。先ほど説明したように、EconomyCarクラスでdriveメソッドをオーバーライドしていない状態で、EconomyCarインスタンスのdriveメソッドを呼ぶということは、内包されている親インスタンスのdriveメソッドが呼ばれることになります。Carクラスのdriveメソッド内で使われているthis.nenpiは、もちろん自身のインスタンス(Carインスタンス)のnenpiを指します。子クラスがあろうと無かろうと関係ありません。以下省略}なので子クラスでフィールドの値をいくつに書き替えていようとも、この状態では全く関係ないということになります。親クラスから子クラスのフィールドにアクセスすることは不可能なので、残念ながらこのやり方では低燃費を実現することはできません。子クラスから親クラスのメンバにアクセスする為に用意されているのが、super.○○という書き方です。superに関しては次回に詳しくやります。逆に親クラスから子クラスのメンバへはアクセスできません。子クラスにとっては親が存在しないことはありえませんが、親クラスというのは継承されてこそ親となるので、クラス設計の段階で存在するかどうかも分からない子クラスのメンバにアクセスする方法がないのは、ある意味当然と言えます。ちなみに親クラスが持つフィールドと同名のフィールドを子クラスで宣言することは、オーバーライドとは言わず、「継承によるフィールドの隠蔽」なんていう風に呼ばれていて、実は推奨されていません(実装すること自体は可能ですが)。上記のように、子クラスでフィールドを宣言したところで、親クラスのメソッドを経由してしまうと全くアクセス不能なので、非常に扱いづらくバグの原因となる可能性が高いからです。非推奨とは言え、無理に子クラスでnenpiフィールドを再宣言するのなら、driveメソッドもオーバーライドして子クラスのdriveメソッドからそのnenpiを触るというやり方にする必要があります。}}これでは子クラスにおいて、親クラスと全く同じ内容のdriveメソッドをオーバーライドしていることになります。結果的にはdriveメソッド内のthisが指し示すインスタンスが変わるので意図通りに動くことは動きますが、どうもやり方が不細工かつ非効率的です。継承を使う意義(親クラスの存在意義)が薄れてしまっています。nenpiというパラメータ(フィールド)を用意することで、燃費をコントロールするというやり方自体は、設計として決して悪いものではないと思います。次回は、なんとかしてnenpiフィールドを取り入れた設計を完成させてみましょう。superを使います。topへ厳選3冊!効率よくJavaを習得したい人にオススメの入門書シェアするtwitter7facebook0hatenabookmark60lineコメントそうですね。コンストラクタを書いてなかったらデフォルトコンストラクタが動いているってことです。継承とコンストラクタについても書いてますのでまた読んでみてください。継承と、インターフェースと。19:51>なので子クラスでフィールドの値をいくつに書き替えていようとも、この状態では全く関係ないということになります。>親クラスから子クラスのフィールドにアクセスすることは不可能なので、残念ながらこのやり方では低燃費を実現することはできません。かんたんなJavaとあり「これからJavaを始めようという人の為の超入門サイトです。」とあったので勘違いしました。このサイトは、Javaを始めてみたがよくわからずもっと親切丁寧におしえてもらうためのサイトですね。上記の書き方は、それを何度か試した人にしかわからない発言ですし。おかしいな」と疑問に思った人へのアドバイスですね。初心者は脳みそがあっぷあっぷでこんなレベルまで考えられないです。30万円未満この本は全く何も分からない初心者の方にお勧めです。プログラミングをするには覚えなければならない事が無茶苦茶いっぱいありますが、この本は教えてくれる順番、その構成が素晴らしいです。RPGのゲームを作るというストーリーにのっとってちょっとずつ難しいことを教えてもらえます。無機質で膨大なデータが載っているような本は読む気にならないという方は、こういうストーリー仕立ての本でチャレンジしてみてはいかがでしょうか?(注:RPGを作る為の本ではありません。)ある程度、Javaを読み書きできるようになったら、オブジェクト指向について学ぶべきです。本書は、抽象的で分かったような分からんようなオブジェクト指向という考え方について、非常に分かりやすい例を出して説明してくれています。オブジェクト指向とは何なのか?という本質を掴むのにこれほど適した本はないと思います。オブジェクト志向の理念を理解できれば、より効率のいいコードをより楽に書けるようになるはずです。Java上級者を目指すなら必読の一冊![詳細]フォローするtwitterfeedline管理人Nobuo_CREATEWordPressテーマPrinciple、マテリアルを作ったり、Androidアプリを作ったり、Java入門サイトを作ったり、本を書いたりしています。大阪の北野田駅近くのマイスタイルという学習塾を経営しています。オススメ書籍この本は全く何も分からない初心者の方にお勧めです。プログラミングをするには覚えなければならない事が無茶苦茶いっぱいありますが、この本は教えてくれる順番、その構成が素晴らしいです。RPGのゲームを作るというストーリーにのっとってちょっとずつ難しいことを教えてもらえます。無機質で膨大なデータが載っているような本は読む気にならないという方は、こういうストーリー仕立ての本でチャレンジしてみてはいかがでしょうか?(注:RPGを作る為の本ではありません。)ある程度、Javaを読み書きできるようになったら、オブジェクト指向について学ぶべきです。本書は、抽象的で分かったような分からんようなオブジェクト指向という考え方について、非常に分かりやすい例を出して説明してくれています。オブジェクト指向とは何なのか?という本質を掴むのにこれほど適した本はないと思います。オブジェクト志向の理念を理解できれば、より効率のいいコードをより楽に書けるようになるはずです。Reserved.arrowuphome。