java程序 编程 创建 语言

  1. 创建一个Shape父类,

a) 该类有一个Point的类型的私有属性center,表示shape的中心点坐标

b) 二个成员方法:double getArea()获取图形的面积,默认返回值为0,double getPerimeter() 获取图形的周长,默认返回值为0

  1. 将Circle类改为继承自Shape类,删除原有的圆心属性, Shape类的center属性作为圆心,在此基础上修改原有的求两个圆的关系的方法,使其能够正常执行。

a) 重写Shape的getArea和getPerimer方法,以计算圆的周长和面积

b) 重写圆的toString方法,使得该方法能够显示圆心坐标和圆的半径

c) 重写圆的equals方法,当两个圆的圆心坐标相同,并且半径相同就认为两个圆相等

d) 重写hashCode方法,确保当equals方法为true时,hashCode值相等

e) 给每个圆定义编号属性,表明该圆是生成的第几个

f) 定义一个属性MIN_RADIUS,表示半径的最小值0.5(不可修改),当给半径赋值时,如果值小于该最小值,则将半径设为该最小值。

  1. 定义一个长方形Rectangle类,该类继承自Shape类,

a) 该类有两个私有属性:width(宽),heighth(高)

b) 创建一个无参的构造方法,该方法创建一个中心在原点,宽高都为1的长方形

c) 创建一个有参的构造方法,该方法创建一个指定宽高和中心点的长方形

d) 重写父类的getArea和getPerimeter方法,计算长方形的周长和面积

e) 重写toString方法,使得该方法能显示长方形的宽、高和中心点坐标

  1. 定义一个三角形Triangle类,该类继承自Shape类,

a) 该类有三个私有属性:a,b,c表示三角形的三个边

b) 定义一个无参构造方法,该方法创建一个三角形,中心点在原点,a,b,c的值都为1

c) 定义一个有参的构造方法,该方法创建一个指定边长和中心点的三角形

d) 重写父类的getArea和getPerimeter方法,计算三角形的周长和面积

e) 重写toString方法,使得该方法能显示三角形的三边和中心点坐标

  1. 定义一个测试类TestShape,在main方法中定义一个Shape 变量shape,分别创建圆、长方形和三角形对象赋值给shape变量,赋值后通过调用shape的getArea,getPerimeter和toString方法,验证是否能正确计算不同图形的面积和周长。
不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    首先我们需要创建一个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());
        }
    }
    

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^