ここで私が書いた三つのクラスは次のとおりです。多型
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());
}
}
テスタークラスのmainメソッドからの出力は次のとおりです。
I am a rectangle! 1 I am a rectangle! L*W 0 1
なぜ0ではなく1を返しs.xん?変数の現在のインスタンスではなく、そのクラスにも同じインスタンス変数が宣言されているか、Rectangleクラスの変数は、Shapeクラスの以前のpublic x変数をgetX()メソッドは、矩形クラスの1を返しますか?
また、一般に、スーパークラスはそのクラスで宣言されている場合にのみ、そのサブクラスメソッドの実装にアクセスできますか?これは、同じシグネチャを持つ同じ量のメソッドが "Shape"クラス(オーバーライドされたRectangle実装)にあり、それらを有効なShapeメソッドとして受け入れることをコンパイラが認識するためですか?
にインスタンス変数の隠蔽についての詳細を読むことができます!?インスタンス変数をpublicにしないでください! – DrinkJavaCodeJava
何が起こるかを確認するテストでした。以前はMVCデザインを行っていたので、私はカプセル化について十分に認識しています。 – PragmaticProgrammer