a) 该类有一个Point的类型的私有属性center,表示shape的中心点坐标
b) 二个成员方法:double getArea()获取图形的面积,默认返回值为0,double getPerimeter() 获取图形的周长,默认返回值为0
a) 重写Shape的getArea和getPerimer方法,以计算圆的周长和面积
b) 重写圆的toString方法,使得该方法能够显示圆心坐标和圆的半径
c) 重写圆的equals方法,当两个圆的圆心坐标相同,并且半径相同就认为两个圆相等
d) 重写hashCode方法,确保当equals方法为true时,hashCode值相等
e) 给每个圆定义编号属性,表明该圆是生成的第几个
f) 定义一个属性MIN_RADIUS,表示半径的最小值0.5(不可修改),当给半径赋值时,如果值小于该最小值,则将半径设为该最小值。
a) 该类有两个私有属性:width(宽),heighth(高)
b) 创建一个无参的构造方法,该方法创建一个中心在原点,宽高都为1的长方形
c) 创建一个有参的构造方法,该方法创建一个指定宽高和中心点的长方形
d) 重写父类的getArea和getPerimeter方法,计算长方形的周长和面积
e) 重写toString方法,使得该方法能显示长方形的宽、高和中心点坐标
a) 该类有三个私有属性:a,b,c表示三角形的三个边
b) 定义一个无参构造方法,该方法创建一个三角形,中心点在原点,a,b,c的值都为1
c) 定义一个有参的构造方法,该方法创建一个指定边长和中心点的三角形
d) 重写父类的getArea和getPerimeter方法,计算三角形的周长和面积
e) 重写toString方法,使得该方法能显示三角形的三边和中心点坐标
首先我们需要创建一个Shape类作为基类,该类应该包含一个私有的Point类型的center属性,以表示图形的中心点坐标和两个方法double getArea()和double getPerimeter(),分别获取图形的面积和周长。
import java.awt.Point;
public class Shape {
private Point center;
public Shape(Point center) {
this.center = center;
}
public double getArea() {
return 0;
}
public double getPerimeter() {
return 0;
}
}
接下来我们需要创建一个Circle类,继承Shape类,圆心属性被删除,在Shape类中的center属性作为圆心,重写Shape的getArea和getPerimeter方法,以计算圆的周长和面积。
public class Circle extends Shape {
private static int count = 0;
private int id;
private double radius;
private final double MIN_RADIUS = 0.5;
public Circle(Point center, double radius) {
super(center);
this.radius = radius < MIN_RADIUS ? MIN_RADIUS : radius;
count++;
id = count;
}
@Override
public double getArea() {
return Math.PI * radius * radius;
}
@Override
public double getPerimeter() {
return 2 * Math.PI * radius;
}
@Override
public String toString() {
return "Circle" + id + ": Center = " + super.center.toString() + ", Radius = " + radius;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
Circle circle = (Circle) o;
return Double.compare(circle.radius, radius) == 0 &&
center.equals(circle.center);
}
@Override
public int hashCode() {
return center.hashCode() + Double.hashCode(radius);
}
}
重写圆形的toString方法,使其能够显示圆心坐标和圆的半径,重写圆形的equals方法和hashCode方法,判断圆是否相等,以及保证相等时hashCode值相等。
给每个圆定义一个编号属性,表明该圆是生成的第几个。
我们需要定义一个静态的属性count,用于计数生成的圆对象的个数,以及一个实例的属性id,表示该圆是第几个生成的。每次生成一个Circle对象时,count自增,将值赋给id即可。
private static int count = 0;
private int id;
public Circle(Point center, double radius) {
super(center);
this.radius = radius < MIN_RADIUS ? MIN_RADIUS : radius;
count++;
id = count;
}
定义一个属性MIN_RADIUS,表示半径的最小值0.5,在给半径赋值时,如果小于该最小值,则将半径设为该最小值。
private final double MIN_RADIUS = 0.5;
this.radius = radius < MIN_RADIUS ? MIN_RADIUS : radius;
接下来我们需要定义一个Rectangle类,该类继承自Shape类,包含属性width(宽)和height(高),以及无参和有参构造方法,重写父类的getArea、getPerimeter和toString方法。
public class Rectangle extends Shape {
private double width;
private double height;
public Rectangle(Point center, double width, double height) {
super(center);
this.width = width;
this.height = height;
}
@Override
public double getArea() {
return width * height;
}
@Override
public double getPerimeter() {
return 2 * (width + height);
}
@Override
public String toString() {
return "Rectangle: Center = " + super.center.toString() + ", Width = " + width + ", Height = " + height;
}
}
最后,在TestShape类中,定义一个Shape变量shape,分别创建圆、长方形和三角形对象赋值给shape变量,并通过调用shape的不同方法,验证图形的面积和周长计算是否正确。
public class TestShape {
public static void main(String[] args) {
Point center = new Point(0, 0);
Circle circle = new Circle(center, 2);
System.out.println(circle.toString());
System.out.println("Circle Perimeter = " + circle.getPerimeter());
System.out.println("Circle Area = " + circle.getArea());
Rectangle rectangle = new Rectangle(center, 3, 4);
System.out.println(rectangle.toString());
System.out.println("Rectangle Perimeter = " + rectangle.getPerimeter());
System.out.println("Rectangle Area = " + rectangle.getArea());
Triangle triangle = new Triangle(center, 3, 4, 5);
System.out.println(triangle.toString());
System.out.println("Triangle Perimeter = " + triangle.getPerimeter());
System.out.println("Triangle Area = " + triangle.getArea());
}
}
完整代码如下:
import java.awt.Point;
public class Shape {
private Point center;
public Shape(Point center) {
this.center = center;
}
public double getArea() {
return 0;
}
public double getPerimeter() {
return 0;
}
}
public class Circle extends Shape {
private static int count = 0;
private int id;
private double radius;
private final double MIN_RADIUS = 0.5;
public Circle(Point center, double radius) {
super(center);
this.radius = radius < MIN_RADIUS ? MIN_RADIUS : radius;
count++;
id = count;
}
@Override
public double getArea() {
return Math.PI * radius * radius;
}
@Override
public double getPerimeter() {
return 2 * Math.PI * radius;
}
@Override
public String toString() {
return "Circle" + id + ": Center = " + super.center.toString() + ", Radius = " + radius;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
Circle circle = (Circle) o;
return Double.compare(circle.radius, radius) == 0 &&
center.equals(circle.center);
}
@Override
public int hashCode() {
return center.hashCode() + Double.hashCode(radius);
}
}
public class Rectangle extends Shape {
private double width;
private double height;
public Rectangle(Point center, double width, double height) {
super(center);
this.width = width;
this.height = height;
}
@Override
public double getArea() {
return width * height;
}
@Override
public double getPerimeter() {
return 2 * (width + height);
}
@Override
public String toString() {
return "Rectangle: Center = " + super.center.toString() + ", Width = " + width + ", Height = " + height;
}
}
public class Triangle extends Shape {
private double a;
private double b;
private double c;
public Triangle(Point center, double a, double b, double c) {
super(center);
this.a = a;
this.b = b;
this.c = c;
}
@Override
public double getArea() {
double p = getPerimeter() / 2;
return Math.sqrt(p * (p - a) * (p - b) * (p - c));
}
@Override
public double getPerimeter() {
return a + b + c;
}
@Override
public String toString() {
return "Triangle: Center = " + super.center.toString() + ", a = " + a + ", b = " + b + ", c = " + c;
}
}
public class TestShape {
public static void main(String[] args) {
Point center = new Point(0, 0);
Circle circle = new Circle(center, 2);
System.out.println(circle.toString());
System.out.println("Circle Perimeter = " + circle.getPerimeter());
System.out.println("Circle Area = " + circle.getArea());
Rectangle rectangle = new Rectangle(center, 3, 4);
System.out.println(rectangle.toString());
System.out.println("Rectangle Perimeter = " + rectangle.getPerimeter());
System.out.println("Rectangle Area = " + rectangle.getArea());
Triangle triangle = new Triangle(center, 3, 4, 5);
System.out.println(triangle.toString());
System.out.println("Triangle Perimeter = " + triangle.getPerimeter());
System.out.println("Triangle Area = " + triangle.getArea());
}
}