JAVA 期中考试

前言

这次JAVA期中考试, 总体上来讲几乎没有难度。只要上课认真听了, 并且下课有认真写PTA的话, 我认为难度几乎就是0。因为题目简单, 也不涉及到什么设计的内容(因为类图已经给出来了)。所以这里就不分析太多了。

实现

老样子先看题目

  1. 第一题

    设计一个类表示平面直角坐标系上的点Point,私有属性分别为横坐标x与纵坐标y,数据类型均为实型数,除构造方法以及属性的getter与setter方法外,定义一个用于显示信息的方法display(),用来输出该坐标点的坐标信息,格式如下:(x,y),数值保留两位小数。为简化题目,其中,坐标点的取值范围设定为(0,200]。若输入有误,系统则直接输出Wrong Format

    设计一个类表示平面直角坐标系上的线Line,私有属性除了标识线段两端的点point1、point2外,还有一个字符串类型的color,用于表示该线段的颜色,同样,除构造方法以及属性的getter与setter方法外,定义一个用于计算该线段长度的方法getDistance(),还有一个用于显示信息的方法display(),用来输出线段的相关信息,输出格式如下:

    The line's color is:颜色值
    The line's begin point's Coordinate is:
    (x1,y1)
    The line's end point's Coordinate is:
    (x2,y2)
    The line's length is:长度值
    

    其中,所有数值均保留两位小数,建议可用String.format("%.2f", data)方法。

  2. 第二题

    在“点与线(类设计)”题目基础上,对题目的类设计进行重构,以实现继承与多态的技术性需求。

    对题目中的点Point类和线Line类进行进一步抽象,定义一个两个类的共同父类Element(抽象类),将display()方法在该方法中进行声明(抽象方法),将Point类和Line类作为该类的子类。

    再定义一个Element类的子类面Plane,该类只有一个私有属性颜色color,除了构造方法和属性的getter、setter方法外,display()方法用于输出面的颜色,输出格式如下:The Plane's color is:颜色

    在主方法内,定义两个Point(线段的起点和终点)对象、一个Line对象和一个Plane对象,依次从键盘输入两个Point对象的起点、终点坐标和颜色值(Line对象和Plane对象颜色相同),然后定义一个Element类的引用,分别使用该引用调用以上四个对象的display()方法,从而实现多态特性。示例代码如下:

    element = p1;//起点Point
    element.display();
    element = p2;//终点Point
    element.display();
    element = line;//线段
    element.display();
    element = plane;//面
    element.display();
    
  3. 第三题
    在“点与线(继承与多态)”题目基础上,对题目的类设计进行重构,增加容器类保存点、线、面对象,并对该容器进行相应增、删、遍历操作。

    在原有类设计的基础上,增加一个GeometryObject容器类,其属性为ArrayList类型的对象(若不了解泛型,可以不使用
    增加该类的add()方法及remove(int index)方法,其功能分别为向容器中增加对象及删除第index - 1(ArrayList中index>=0)个对象。
    在主方法中,用户循环输入要进行的操作(choice∈[0,4]),其含义如下:

    1:向容器中增加Point对象

    2:向容器中增加Line对象

    3:向容器中增加Plane对象

    4:删除容器中第index - 1个数据,若index数据非法,则无视此操作

    0:输入结束

从上面三个题目我们可以看到一条清晰的逻辑。我们首先写一个点类, 里面包含两个double属性。以及一个线类, 包含两个点以及一个String属性。最后有一个Plane类包含一个String的属性。紧接着抽象出一个Element类使display方法作为接口。最后的ArrayList则是对多态的运用。至于那些构造函数和getter和setter直接用IDE自动生成就好了。到最后题目给出的类图是这样的。
img

应为比较简单, 所以我们直接看代码

  1. 第一题

    构建点类和线类

    // 点类
    class Point {
        private double x;
        private double y;
    
        public Point(double x, double y) {
            this.x = x;
            this.y = y;
        }
    
        public double getX() {
            return x;
        }
    
        public void setX(double x) {
            this.x = x;
        }
    
        public double getY() {
            return y;
        }
    
        public void setY(double y) {
            this.y = y;
        }
    
        public void display() {
            String sx = String.format("%.2f", x);
            String sy = String.format("%.2f", y);
            System.out.println("(" + sx + "," + sy + ")");
        }
    }
    
    // 线类
    class Line {
        private Point point1;
        private Point point2;
        private String color;
    
        public Line(Point point1, Point point2, String color) {
            this.point1 = point1;
            this.point2 = point2;
            this.color = color;
        }
    
        public Point getPoint1() {
            return point1;
        }
    
        public void setPoint1(Point point1) {
            this.point1 = point1;
        }
    
        public Point getPoint2() {
            return point2;
        }
    
        public void setPoint2(Point point2) {
            this.point2 = point2;
        }
    
        public String getColor() {
            return color;
        }
    
        public void setColor(String color) {
            this.color = color;
        }
    
        // 获得距离
        public double getDistance() {
            return Math.sqrt(Math.pow(point1.getX() - point2.getX(), 2)
                    + Math.pow(point1.getY() - point2.getY(), 2));
        }
    
        public void display() {
            System.out.println("The line's color is:" + color);
            System.out.println("The line's begin point's Coordinate is:");
            point1.display();
            System.out.println("The line's end point's Coordinate is:");
            point2.display();
            String distance = String.format("%.2f", getDistance());
            System.out.println("The line's length is:" + distance);
        }
    }
    
  2. 第二题

    抽象出一个Element类

    // 抽象出的 Element 类
    abstract class Element {
        public abstract void display();
    }
    
    class Point extends Element {
        // ... 这里省略 因为几乎没有变化 
    }
    
    class Line extends Element {
        // ... 这里省略 因为几乎没有变化 
    }
    
    // Plane 类
    class Plane extends Element {
        private String color;
    
        public Plane(String color) {
            this.color = color;
        }
    
        public String getColor() {
            return color;
        }
    
        public void setColor(String color) {
            this.color = color;
        }
    
        @Override
        public void display() {
            System.out.println("The plane's color is:" + color);
        }
    }
    
  3. 第三题

    建立一个 GeometryObject 类, 用 ArrayList<Element>作为属性

    class GeometryObject {
        private ArrayList<Element> list = new ArrayList<>();
    
        public GeometryObject() {}
    
        public void add(Element e) {
            list.add(e);
        }
        public ArrayList<Element> getList() {
            return list;
        }
        public void remove(int index) {
            if(index < 0 || index >= list.size())
                return;
            list.remove(index - 1);
        }
    }
    
    // 抽象出的 Element 类
    abstract class Element {
        public abstract void display();
    }
    
    class Point extends Element {
        // ... 这里省略 因为几乎没有变化 
    }
    
    class Line extends Element {
        // ... 这里省略 因为几乎没有变化 
    }
    
    // Plane 类
    class Plane extends Element {
        // ... 这里省略 因为几乎没有变化 
    }
    

总结

从以上的代码也可以看的出来。这次的期中考试没有很难。只是简单的运用了一下多态和泛型的语法。要求我们会使用ArrayList就可以比较轻松的写出来。而这些都是上课讲过的内容。所以说到底还是要上课认真听讲。下课要多写多练。

就整个课程而言。因为我学过C++, 并且了解过JAVA的语法。所以个人认为, 对于面向对象的思想我是没有简单的停留在表面的。但是这也是正是我缺少的部分。因为是个人的自学而不是系统的学习, 难免会缺乏系统的方法以及系统的理解。比如上课讲的"单一职责", 我在以前通过东拼西凑的知识也大概能够意识到需要这样做。但是如果要叫我说出一套具体的理论来的话,我也只能支支吾吾什么都说不出了。所以我认为, 就目前而言, JAVA课使我学到的就是怎么系统的设计一个程序。虽然这部分目前讲的还不是很多。但是以后会越来越多的。

posted @ 2022-10-28 21:19  nagimegesa  阅读(125)  评论(0)    收藏  举报