私が書いた3つのクラスは次のとおりです。
public class Shape {
public int x = 0;
public void getArea() {
System.out.println("I don't know my area!");
}
public String toString() {
return "I am a shape!";
}
public int getX() {
return x;
}
}
public class Rectangle extends Shape {
public int x = 1;
public int getX() {
return x;
}
public void getArea() {
System.out.println("L*W");
}
public String toString() {
return "I am a rectangle!";
}
}
public class Tester {
public static void main(String[] args) {
Shape s = new Shape();
Rectangle r = new Rectangle();
System.out.println(r);
System.out.println(r.x + "\n");
s = r;
System.out.println(s);
s.getArea();
System.out.println(s.x);
System.out.println(s.getX());
}
}
Tester クラスのメイン メソッドからの出力は次のとおりです。
私は長方形です! 1 私は長方形です! 長さ×幅 0 1
sx が 1 ではなく 0 を返すのはなぜですか? 変数の現在のインスタンスが Rectangle ではなく、そのクラスにも同じインスタンス変数が宣言されているか、または Rectangle クラスの変数が、getX() に対する場合のように、Shape クラスの以前のパブリック x 変数をオーバーライドしていないか。矩形クラスのメソッドしたがって、1 を返しますか?
また、原則として、スーパークラスは、そのクラスでも宣言されている場合にのみ、そのサブクラスのメソッドの実装にアクセスできますか? これは、同じシグネチャを持つ同量のメソッドが (オーバーライドされた Rectangle 実装を持つ) 「Shape」クラスにあり、それらを有効な Shape メソッドとして受け入れることをコンパイラが確認するためですか?
前もって感謝します、