JAvaの継承と遡及
コードを整理したら、もっとはっきり見えます.以下のようにJavaコード
実行結果は、Child type test:child.i:2 child.getI():-2 child.j:Child J child.getJ():Child J Child:Child Buffer;child.getClassName():Child Parent type test: parent.i:1 parent.getI():-2 parent.j:Parent J parent.getJ():Child J Child:Child Buffer;Child Buffer; parent.getClassName():Parent ChildはParentを継承し、子の変数と静的メソッドはそれぞれ親の変数と静的メソッドを非表示にし、子のインスタンスメソッドは親のインスタンスメソッドを上書きします.隠すのは父類の東を隠すだけだが、それは実質的に存在する.カバーは親の東を完全に消して子に置き換えるもので、回復できない.childが強制的にParentタイプに変換されると、隠されたものが復元され、上書きされた方法は二度と戻らない(サブクラスの方法はこの例では元の親の方法に永久に取って代わった).これが違いであり、この問題の試験点でもある.
class Parent {
int i = 1;
String j = "Parent J";
StringBuffer k = new StringBuffer("Parent:");
public String getJ() {
return j;
}
public int getI() {
return i;
}
public void printBuffer() {
k.append("Parent Buffer;");
System.out.println(k);
}
static String getClassName() {
return "Parent";
}
}
class Child extends Parent {
int i = 2;
String j = "Child J";
StringBuffer k = new StringBuffer("Child:");
public String getJ() {
return j;
}
public int getI() {
return -i;
}
public void printBuffer() {
k.append("Child Buffer;");
System.out.println(k);
}
static String getClassName() {
return "Child";
}
}
public class ExtendDemo {
public static void main(String[] args) {
Child child = new Child();
System.out.println("Child type test:");
System.out.println("child.i:" + child.i);
System.out.println("child.getI():" + child.getI());
System.out.println("child.j:" + child.j);
System.out.println("child.getJ():" + child.getJ());
child.printBuffer();
System.out.println("child.getClassName():" + child.getClassName());
System.out.println();
Parent parent = child;
System.out.println("Parent type test:");
System.out.println("parent.i:" + parent.i);
System.out.println("parent.getI():" + parent.getI());
System.out.println("parent.j:" + parent.j);
System.out.println("parent.getJ():" + parent.getJ());
parent.printBuffer();
System.out.println("parent.getClassName():" + parent.getClassName());
}
}
実行結果は、Child type test:child.i:2 child.getI():-2 child.j:Child J child.getJ():Child J Child:Child Buffer;child.getClassName():Child Parent type test: parent.i:1 parent.getI():-2 parent.j:Parent J parent.getJ():Child J Child:Child Buffer;Child Buffer; parent.getClassName():Parent ChildはParentを継承し、子の変数と静的メソッドはそれぞれ親の変数と静的メソッドを非表示にし、子のインスタンスメソッドは親のインスタンスメソッドを上書きします.隠すのは父類の東を隠すだけだが、それは実質的に存在する.カバーは親の東を完全に消して子に置き換えるもので、回復できない.childが強制的にParentタイプに変換されると、隠されたものが復元され、上書きされた方法は二度と戻らない(サブクラスの方法はこの例では元の親の方法に永久に取って代わった).これが違いであり、この問題の試験点でもある.