現在、javaを独学で学んでいるのですが、以下のコードの実行結果が「10」となる理由がわかりません。
独自の解釈としては、A obj = new B();
でスーパークラスAの型をもつ変数objでサブクラスBのオブジェクトを扱えるようにし、obj.func();
の際はサブクラスに定義されたfuncメソッドが実行(サブクラスで宣言したnum変数がインクリメントされ「31」になる)され、その後System.out.println(obj.num);
で「31」が出力されるのではと考えていましたが、異なるようでした。
答えから推測すると、System.out.println(obj.num)
の際にはスーパークラスの変数を呼んでいるのではと思うのですが、メソッドを呼ぶ際は
「呼び出そうとしているメソッドが変数の型となっているクラスに定義されているかどうか」
をチェックし、定義されていた場合は
「実行時にインスタンス化されているオブジェクトのメソッドが呼び出される」
と認識しているのですが、変数を呼ぶ場合は上記のようなメソッドの呼び出し時とは異なり、サブクラスの変数ではなく、型となっているスーパークラスの変数を呼んでくるというルールなのでしょうか。
以下コードとなります。
初歩的な質問で申し訳ありませんが、よろしくお願いいたします。
class A { int num = 10; void func() { num++;} } class B exetends A { static int num = 30; void func() { num++;} } class Test { public static void main(String[] args) { A obj = new B(); obj.func(); System.out.println(obj.num); } }
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。