继承与多态
任务:(继承与多态)设计一个Shape类,该类无数据成员,函数成员:getArea()、getPerimeter()分别获得图形的面积(0)、周长(0),由此派生Circle类、Rectangle类并重写上述2个方法。然后设计实现GeoArrayList有序图形列表类(升序)数据成员自定(可以使用ArrayList<>),该类可以实现以ArryLsit为参数的构造方法及无参构造方法,向GeoArrayList添加对象方法insertGeoShape(Shape)(要求加入后不影响原有升序关系)、reMove(Sahpe)方法删除图形对象、getIndex(Shape)得到对象在列表的位置、get(index)读指定位置的对象、Size()返回列表长度、Clear()清空列表、Contains(Shape)判断图形是否在列表中、displayGeoList()依次显示列表中的所有对象的面积及对象的类别名称,GeoArrayList列表的升序以面积大小判断。设计主类:定义2个数组一个圆数组、一个矩形数组,然后将这两个数组添加到一个GeoArrayList对象中,然后显示列表中的所有对象。
代码:
shape类:
package MyWorks;
public class Shape {
public double getArea() {
return 0;
}
public double getPerimeter() {
return 0;
}
}
Circle类:
package MyWorks;
public class Circle extends Shape {
public double radius;
public Circle(double r) {
radius = r;
}
public double getArea() {
return this.radius * this.radius * Math.PI;
}
public double getPerimeter()
{
return this.radius*Math.PI*2;
}
}
Rectangle类:
package MyWorks;
public class Rectangle extends Shape{
public double height,width;
public Rectangle(double h,double w) {
height = h;
width =w;
}
public double getArea()
{
return this.height*this.width;
}
public double getPerimeter()
{
return 2*(this.height+this.width);
}
}
GeoArrayList类:
package MyWorks;
import java.util.*;
public class GeoArrayList {
public ArrayList<Shape> array = new ArrayList<Shape>();
// 向GeoArrayList添加对象方法insertGeoShape(Shape)(要求加入后不影响原有升序关系)
public void insertGeoShape(Shape s) {
array.add(s);
Collections.sort(array, new Comparator<Shape>() {
public int compare(Shape a, Shape b) {
return a.getArea() > b.getArea() ? 1 : -1;
}
});
}
// reMove(Shape)方法删除图形对象
public void reMove(Shape s) {
array.remove(s);
}
// getIndex(Shape)得到对象在列表的位置
public int getIndex(Shape s) {
return array.indexOf(s);
}
// get(index)读指定位置的对象
public Shape get(int index) {
return array.get(index);
}
// Size()返回列表长度
public int Size() {
return array.size();
}
// Clear()清空列表
public void Clear() {
array.clear();
}
// Contains(Shape)判断图形是否在列表中
public boolean Contains(Shape s) {
if (array.contains(s))
return true;
else
return false;
}
// displayGeoList()依次显示列表中的所有对象的面积及对象的类别名称
public void displayGeoList() {
for (int i = 0; i < array.size(); i++) {
System.out.println(array.get(i).getArea() + " " + array.get(i).getClass().getName());
}
}
// GeoArrayList列表的升序以面积大小判断
public GeoArrayList(ArrayList<Shape> array) {
this.array = array;
Collections.sort(array, new Comparator<Shape>() {
public int compare(Shape a, Shape b) {
return a.getArea() > b.getArea() ? 1 : -1;
}
});
}
public GeoArrayList() {
}
}
主类:
package MyWorks;
public class myMain {
public static void main(String[] args) {
// TODO Auto-generated method stub
Circle[] circle = { new Circle(1), new Circle(2), new Circle(3) };
Rectangle[] rect = { new Rectangle(1, 2), new Rectangle(2, 3) };
GeoArrayList geo = new GeoArrayList();
for(Circle c:circle) {
geo.insertGeoShape(c);
}
for(Rectangle r:rect) {
geo.insertGeoShape(r);
}
geo.displayGeoList();
}
}
运行截图: