java多态——练习题

 

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);中即可比较他们面积大小

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值