コード
###前提・実現したいこと
こんにちは。部下にJavaで継承を教えている途中のものです。
部下が練習で初期値をもった親クラスと子クラスを作ったところ、
私が思っていたように子クラスの値が反映されず、親クラスの値が反映されてしまいました。
私自身、コンストラクタでフィールドに値を代入することはよくしていたのですが、
あまり初期値をもつようなクラスを作成したことがなかったので、
初期値をもたせる、もたせないの良し悪しは別にして、
どうしてこうなるのかがお恥ずかしい話、うまく説明できません。
ご理解いただける皆様、よろしければご教授いただけたら幸いです。
###問題点
子クラスが初期値をもつか、もたないか
(すなわちStudentクラスのString className〜をコメントアウトするかしないか)
で挙動が変わる所を説明できません。
同じ名前でも二度初期値として宣言すると別のフィールドとして扱われるのでしょうか?
ご教授いただけたら幸いです。
###ソースコード
Human.java(親クラスです)
package testExtends; public class Human { String className = "Human"; String getClassName() { return this.className; } }
Student.java(子クラスです)
package testExtends; public class Student extends Human { String className = "Student";//(ここをコメントアウトするかしないかで結果が変わります) }
main文です
package testExtends; public class main { public static void main(String[] args) { Student student = new Student(); System.out.println(student.className); System.out.println(student.getClassName()); student.className = "foo"; System.out.println(student.className); System.out.println(student.getClassName()); System.out.println(); Human student2 = new Student(); System.out.println(student2.className); System.out.println(student2.getClassName()); student2.className = "bar"; System.out.println(student2.className); System.out.println(student2.getClassName()); } }
子クラスの初期値をコメントアウトしない場合
Student
Human
foo
HumanHuman
Human
bar
bar
と表示され、
子クラスの初期値をコメントアウトした場合
Human
Human
foo
fooHuman
Human
bar
bar
と表示されます。こちらが私が本来こうなるべきだと思っていた方です。
よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/03/01 07:01 編集
2016/03/01 03:57
2016/03/01 04:00
2016/03/01 04:21