多態についての問題
1356 ワード
public class Test {
public static void main( String[] args) {
m(new GraduateStudent());
m(new Student());
m(new Person());
}
public static void m(Object x){
System.out.println(x.toString());
}
}
class GraduateStudent extends Student {
}
class Student extends Person {
public String toString() {
return "Student" ;
}
}
class Person extends Object {
public String toString() {
return "Person";
}
/**
* :
*Student
*Student
*Person
*/
理由は次のとおりです.
静的メソッドmは、パラメータオブジェクトxのtoString()メソッドを呼び出し、マルチステートの呼び出しルールによって呼び出され、呼び出しのメソッドは、参照のタイプではなく呼び出しのオブジェクトによって決定されるので、
m(new GraduateStudio()はclass GraduateStudio extends StudioのtoString()メソッドを呼び出そうとしたが、クラスにはtoString()メソッドが定義されていないため、jvmはベースクラスclass Studio extends Personを上に探し、toString()メソッドを見つけてStudentを表示するしかない.
同じ理屈で、m(new Studio);StudentクラスのtoStringメソッドも呼び出し、Studentを表示する.
そしてm(new Person();PersonクラスのtoStringメソッドを呼び出し、Personを表示します.
このような概念が必要です
ステートメント
Object mary = new Person();
オブジェクトタイプの参照(reference)でPersonタイプのオブジェクトを参照することを意味し、maryのメンバーメソッドtoStringはObjectではなくPersonによって決定される.これはマルチステートの実行規則です.静的不静とは関係ない.