アプリ版:「スタンプのみでお礼する」機能のリリースについて

【参考書引用】
変数の型はBase、オブジェクトの型はDerived。

その為、b.workメソッドの呼び出しでエラーが起こるのは、変数bはあくまでもBase型のため、Derived型としては振舞うことが出来ないという風に解釈しているのですが、なぜ、workメソッドではDerivedクラスとして振舞うことが出来ないのにshowメソッドの呼び出しではDeriverdクラスとして振舞っているのでしょうか?

ソースコードは一部省略しています
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
class Base {
public String show() { return "BaseClass show()";}
}
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
class Derived extends Base {
public String show() {  return "DerivedClass show()";}
public String work() {  return "DerivedClass work()";}
}
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
public class Sample1 {
public static void main(String[] args) {
Base b = new Derived();

System.out.println(b.work()); //エラー
System.out.println(b.show()); //Derivedのshowメソッドの実行
}}

A 回答 (3件)

いちおう補足しておくと, 「オブジェクト指向言語ならどんなものでも必ず同じ挙動になる」というものでもない. これは Java だか

らこうなっているだけであり, 他の言語では違う挙動かもしれない.
    • good
    • 0

変数bの型は、Baseクラスです。


これは、生成したインスタンスがDerivedだとしても、Baseクラスの定義を扱うことになります。

Baseクラスにはwork()の定義は存在しないため、エラーになるのは当たり前です。
show()がDerivedクラスの動作をするのは、インスタンス化したクラスはDerivedだからです。
定義としてはBaseクラスのshow()になりますが、実際走行するのはインスタンス化されたオブジェクトのshow()になります。
当然、Baseクラスをインスタンス化していたら、Baseクラスのshow()が走行することになります。

よくわからないようでしたら、オブジェクト指向の継承について、基礎を学ぶといいかと思います。
    • good
    • 0
この回答へのお礼

ありがとうございます。
何回も読み込んで理解を深めようと思います。

お礼日時:2021/04/07 02:42

格好よくいうと


・メソッドが呼び出せるかどうかは変数の型で静的に決まる
・どのメソッドを呼び出すかはオブジェクトの型で動的に決まる
というわけだが.

「メソッドが呼び出せるかどうか」は変数の型を使って判定する. 今の場合変数 b の型はクラス Base だから, その変数を使って呼び出すことのできるメソッドはクラス Base (とそれが継承したスーパークラスや実装しているインターフェイス) で宣言されたものに限定される. メソッド work() は Base では宣言されていないので, 変数 b を使って呼び出すことはできない.

一方 (呼び出すことのできるメソッドについて) 実際に「どのメソッドを呼び出すか」はオブジェクトで決まる. 今の場合はクラス Derived のインスタンスであるオブジェクトに対して呼び出しているので, クラス Derived (とそれが継承したスーパークラスや実装しているインターフェイス) で定義されたメソッドのうち
Derived に最も近いクラス/インターフェイス
で定義されたものを呼び出す. メソッド show() では Derived 自身でも定義しているので, クラス Derived のオブジェクトに対してはそれが呼び出される.
    • good
    • 0
この回答へのお礼

本の説明で腑に落ちないところが、納得できました。
とても分かりやすい説明ありがとうございます

お礼日時:2021/04/07 02:42

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!