1. 父类:GeometricObject
package package2;
class GeometricObject {
protected String color;
protected double weight;
public GeometricObject(String color, double weight) {
this.color = color;
this.weight = weight;
}
public void set_color(String color) {
this.color = color;
}
public void set_weight(double weight) {
this.weight = weight;
}
public String get_color() {
return color;
}
public double get_weight() {
return weight;
}
public double findArea() {
return 0;
}
}
- 父类中的color和weight属性在后面不需要被用到
- 父类的findArea()方法里面可以随便写,因为它的子类要重写这个方法
2. 子类Circle()
package package2;
class Circle extends GeometricObject{
private double radius;
public Circle(double radius, String color, double weight) {
super(color, weight);
this.radius = radius;
}
public void set_radius(double radius) {
this.radius = radius;
}
public double get_radius() {
return radius;
}
public double findArea() {
return 3.14*radius*radius;
}
}
- 子类的构造器的参数列表要把父类的参数也加进去,因为在构造子类的时候,父类也必须被构造
- 如果每个类都不写构造器,那么都会有一个默认的空参构造器,在子类默认的空参构造器中也会默认super()
- 如果父类没写构造器,或者是个空参构造器,那么在Circle子类的构造器就不用写父类的属性,Circle子类的构造器的函数体中也什么都不用写,自动默认super()
3. 子类MyRectangle()
package package2;
public class MyRectangle extends GeometricObject{
private double width;
private double height;
public MyRectangle(double width, double height, String color, double weight) {
super(color, weight);
this.width = width;
this.height = height;
}
public void set_width(double width) {
this.width = width;
}
public void set_height(double height) {
this.height = height;
}
public double get_width() {
return width;
}
public double get_height() {
return height;
}
public double findArea() {
return height*width;
}
}
4. 测试类
package package2;
public class GeomtricTest {
public static void main(String[] args) {
GeomtricTest g = new GeomtricTest();
Circle c = new Circle(3, "red", 0);
MyRectangle m = new MyRectangle(1, 2, "blue", 0);
g.equalsArea(c, m);
g.displayGeometricObject(c);
g.displayGeometricObject(m);
System.out.println(g.equalsArea(c, m));
System.out.println(g.displayGeometricObject(c));
System.out.println(g.displayGeometricObject(m));
}
public boolean equalsArea(GeometricObject o1, GeometricObject o2) {
return o1.findArea() ==o2.findArea();
}
public double displayGeometricObject(GeometricObject o3) {
return o3.findArea();
}
}
- public boolean equalsArea(GeometricObject o1, GeometricObject o2) 的参数是父类的对象,但是实际传入的是子类的对象,体现了多态,引用数据类型可以指向任意其子类的对象
- Circle c = new Circle(3, "red", 0); 在创建对象时不能再Circle c = new Circle();因为没有定义空参构造器
- 这里体现了多态的好处:还可以定义很多种形状的子类,只要子类中重写了findArea()方法,那么在测试类中就可以通过创建该子类对象Xn,把Xn传入测试类的方法g.equalsArea(x1, x2);中即可比较他们面积大小