JAva親サブクラスが同名変数の同名メソッドを継承する
3142 ワード
何気なく見つけたこの面白い問題.
次のコードを見ると、親クラスと子クラスにString name変数が定義されていますが、最終的に継承された後は1つのnameしか残っていませんか?それとも親の子の名前は互いに関係ないのですか?
付与後、最後に何が出力されますか?以下のように見る
出力:
a
b
このように、親value()のname="b"が呼び出されても、子クラスはまずname="a"であり、
System.out.println(name); 依然として出力a ,子クラスが親メソッドを参照することによって、子クラスのnameの値は変更されません.割り当てられた変数名がnameであっても
しかし、変更されたのは親クラス内の自分のname変数であるため、System.out.println(super.name);出力b
親と子は同じ名前の変数を定義し、上書きするのではなく、それぞれが同じ名前の変数であっても自分の空間を持っていることが分かった.
サブクラスで親を呼び出す同名変数nameに値を割り当てる方法は、親自身のname変数の値を変更するだけです.
もう一つ見て、親参照、多態問題を結合します.
son.i=10
son.i=10
100
このように、親の子に同じ名前の変数がある場合、参照タイプは親であり、子のオブジェクトであってもson.iの iは親のiです.
境界線
Parent a=new Son(); sonの親はparentで、 参照a変数の使用 または a.メソッドの場合、sonクラスに対応する変数やメソッドがあっても、親クラスparentにa.変数がない または a.メソッドは、コンパイルできません.
ただし、親parentに対応する変数とメソッドが存在し、sonサブクラスにも同名の変数とメソッドがある場合、a.メソッド サブクラスのメソッドが呼び出され、 a.変数呼び出しは確かに親の変数です.
次のコードを参照
出力:
dogs are eating ( animal.eat()はサブクラスのeat()を呼び出します. )
10 ( animal.i 呼び出されたのは親のi)
次のコードを見ると、親クラスと子クラスにString name変数が定義されていますが、最終的に継承された後は1つのnameしか残っていませんか?それとも親の子の名前は互いに関係ないのですか?
付与後、最後に何が出力されますか?以下のように見る
public class Son extends Parent{
String name; // name
void value(){
name ="a";
super.value(); // value(), name b
System.out.println(name); // a
System.out.println(super.name); // b
}
public static void main (String[] args){
TestTest test =new TestTest();
test.value();
}
}//end class
class Parent{ //
String name; // name
void value (){
name = "b";
}
}//end class
出力:
a
b
このように、親value()のname="b"が呼び出されても、子クラスはまずname="a"であり、
System.out.println(name); 依然として出力a ,子クラスが親メソッドを参照することによって、子クラスのnameの値は変更されません.割り当てられた変数名がnameであっても
しかし、変更されたのは親クラス内の自分のname変数であるため、System.out.println(super.name);出力b
親と子は同じ名前の変数を定義し、上書きするのではなく、それぞれが同じ名前の変数であっても自分の空間を持っていることが分かった.
サブクラスで親を呼び出す同名変数nameに値を割り当てる方法は、親自身のname変数の値を変更するだけです.
もう一つ見て、親参照、多態問題を結合します.
public class Son_test extends Parent
{
int i = 10;
public static void main(String[] args)
{
Son_test son_test = new Son_test();
System.out.println("son.i=" + son_test.i);// i=10;
son_test.set(100); // , , i
System.out.println("son.i=" + son_test.i); // i=10
Parent son =son_test; // , , Parent
System.out.println( son.i); // i=100 ,,,,,,,
}
}
class Parent
{
int i = 10;
public void set(int i)
{
this.i = i;
}
}
出力:son.i=10
son.i=10
100
このように、親の子に同じ名前の変数がある場合、参照タイプは親であり、子のオブジェクトであってもson.iの iは親のiです.
境界線
Parent a=new Son(); sonの親はparentで、 参照a変数の使用 または a.メソッドの場合、sonクラスに対応する変数やメソッドがあっても、親クラスparentにa.変数がない または a.メソッドは、コンパイルできません.
ただし、親parentに対応する変数とメソッドが存在し、sonサブクラスにも同名の変数とメソッドがある場合、a.メソッド サブクラスのメソッドが呼び出され、 a.変数呼び出しは確かに親の変数です.
次のコードを参照
public class A {
Animal animals = new Dog();
Dog dogs = new Dog();
public static void main(String[] args) {
A as =new A();
as.go2();
}
void go2(){
animals.eat(); // Animal animals =new Dog(), ,
System.out.println(animals.i);
}
//
class Animal {
int i=10; // i
void eat() {
System.out.println("animal are eating");
}
}
class Dog extends Animal {
int i=100; // i
void eat() {
System.out.println("dogs are eating");
}
}
出力:
dogs are eating ( animal.eat()はサブクラスのeat()を呼び出します. )
10 ( animal.i 呼び出されたのは親のi)