java多态继承学的不太懂,求帮助

3、设计图形Shape类及其子类Circle和Rectangle类,它们的关系如图所示。

img

说明:

  1. Shape类是抽象类,其中getArea()、isContains()为抽象方法。getArea()计算图形的面积,isContains()判断某个点是否在图形内,由子类分别重写。print()方法为非抽象方法,打印指定范围内的在图形内的所有点,print()方法在Shape类中设计好,由子类继承实现代码的复用。
  2. Circle和 Rectangle类中均包含一个Point成员,标识圆的圆心以及矩形的左上角坐标(注意,屏幕的原点(0,0)在左上角)。isContains()方法借用Point类中的计算距离的相关方法判断某个点是否在图形内。
  3. Point类中的 getDistance()、getDistanceOfX ()、 getDistanc eOfY ()3个方法分别计算两个点间的距离,某个点到x轴的距离和某个点到y轴的距离。
    完成如下的设计:
    (1) 按说明完成 Shape类、Point类、Circle类、Rectangle类的设计。

    (2) 在测试类中定义一个Shape类型的数组,存入几个Circle类对象和 Rectangle类对象,并利用一个循环打印出所有图形的面积和图形,体会多态性的概念。

    按照面向接口编程的架构编写完成【例6-3】中用户管理系统前台代码。
    系统架构如图所示。

img

1)正确实现应用层 Application类依赖接口的编程方式。
2)组织应用层注册 registe()和登录 login()的业务流程。注册时要检查用户是否已存在,用户两次输入的密码是否一致。登录时对用户输入的用户名和密码进行验证。
注册、登录的工作过程如下:
注册用户
请输入用户名:lucy
请输入密码:1234
请重新输入密码:123
两次输入的密码不相符,请重新输入!
注册用户
请输入用户名:lucy
请输入密码:1234
请重新输入密码:1234
lucy,注册成功!
登录
请输入用户名:lucy
请输入密码:1234
lucy已登录

回答:第一个Shape类的UML图设计有一些问题,我修改了一点,代码如下

img

package test;

/**
 * @author bbyh
 * @date 2022/12/19 0019 11:53
 * @description
 */
public abstract class Shape {
    /**
     * 计算图形面积
     *
     * @return 返回图形面积
     */
    public abstract double getArea();

    /**
     * 判断是否包含
     *
     * @param x x坐标
     * @param y y坐标
     * @return 返回是否包含,包含则返回true,不包含返回false
     */
    public abstract boolean isContains(int x, int y);

    public void print() {
        // 该处为默认实现,由子类进行重写
    }
}
package test;

/**
 * @author bbyh
 * @date 2022/12/19 0019 11:57
 * @description
 */
public class Point {
    private int x;
    private int y;

    public Point() {
    }

    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }

    public double getDistance(int x, int y) {
        return Math.sqrt(Math.pow(this.x - x, 2) + Math.pow(this.y - y, 2));
    }

    public double getDistanceOfX(int x) {
        return Math.abs(x);
    }

    public double getDistanceOfY(int y) {
        return Math.abs(y);
    }
}
package test;

/**
 * @author bbyh
 * @date 2022/12/19 0019 11:54
 * @description
 */
public class Circle extends Shape {
    private final Point point;
    private final double r;

    public Circle(Point point, double r) {
        this.point = point;
        this.r = r;
    }

    @Override
    public double getArea() {
        return Math.PI * r * r;
    }

    @Override
    public boolean isContains(int x, int y) {
        return point.getDistance(x, y) < r;
    }

    @Override
    public void print() {
        System.out.println("圆形的面积为:" + getArea());
    }
}
package test;

/**
 * @author bbyh
 * @date 2022/12/19 0019 11:54
 * @description 实际设计有问题,point里面的方法太少了,且无法判断正负值
 */
public class Rectangle extends Shape {
    private final Point point;
    private final double width;
    private final double height;

    public Rectangle(Point point, double width, double height) {
        this.point = point;
        this.width = width;
        this.height = height;
    }

    @Override
    public double getArea() {
        return width * height;
    }

    @Override
    public boolean isContains(int x, int y) {
        return x - point.getX() < width && y - point.getY() < height;
    }

    @Override
    public void print() {
        System.out.println("矩形的面积为:" + getArea());
    }
}
package test;

/**
 * @author bbyh
 * @date 2022/12/19 0019 12:18
 * @description
 */
public class Test {
    public static void main(String[] args) {
        Shape[] shape = new Shape[4];
        shape[0] = new Circle(new Point(3, 3), 3);
        shape[0].print();

        shape[1] = new Rectangle(new Point(3, 3), 3, 4);
        shape[1].print();

        shape[2] = new Circle(new Point(3, 3), 4);
        shape[2].print();

        shape[3] = new Rectangle(new Point(3, 3), 3, 5);
        shape[3].print();
    }
}

第二个用户管理前台代码如下

img

package login;

/**
 * @author bbyh
 * @date 2022/12/19 0019 12:34
 * @description
 */
public interface UserDao {
    /**
     * 添加用户
     *
     * @param user 要添加的用户
     * @return 返回用户是否添加成功
     */
    boolean addUser(User user);

    /**
     * 获取用户
     *
     * @param userName 用户名
     * @param password 密码
     * @return 返回获取到的用户
     */
    User getUser(String userName, String password);
}
package login;

/**
 * @author bbyh
 * @date 2022/12/19 0019 12:35
 * @description
 */
public class User {
    private String userName;
    private String password;

    public User() {
    }

    public User(String userName, String password) {
        this.userName = userName;
        this.password = password;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}
package login;

import java.util.Objects;

/**
 * @author bbyh
 * @date 2022/12/19 0019 12:34
 * @description
 */
public class UserDaoForArray implements UserDao {
    private final User[] data = new User[10];
    private int count = 0;

    public UserDaoForArray() {
    }

    @Override
    public boolean addUser(User user) {
        if (getUser(user.getUserName(), user.getPassword()) == null) {
            data[count++] = user;
            return true;
        }
        return false;
    }

    @Override
    public User getUser(String userName, String password) {
        for (int i = 0; i < count; i++) {
            if (Objects.equals(data[i].getUserName(), userName) && Objects.equals(data[i].getPassword(), password)) {
                return data[i];
            }
        }
        return null;
    }
}
package login;

import java.util.Objects;
import java.util.Scanner;

/**
 * @author bbyh
 * @date 2022/12/19 0019 12:34
 * @description
 */
public class Application {
    private UserDao userDao;

    public Application(UserDao userDao) {
        this.userDao = userDao;
    }

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    public void register() {
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入用户名:");
        String userName = scanner.next();

        System.out.print("请输入密码:");
        String password = scanner.next();

        System.out.print("请重新输入密码:");
        String repeatPassword = scanner.next();

        if (Objects.equals(password, repeatPassword)) {
            if (userDao.addUser(new User(userName, password))) {
                System.out.println(userName + "注册成功");
            } else {
                System.out.println(userName + "已存在,不能再次注册");
            }
        } else {
            System.out.println("两次输入的密码不相符,请重新输入");
        }
    }

    public void login() {
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入用户名:");
        String userName = scanner.next();

        System.out.print("请输入密码:");
        String password = scanner.next();

        if (userDao.getUser(userName, password) != null) {
            System.out.println(userName + "已登录");
        } else {
            System.out.println(userName + "未登录");
        }
    }
}
package login;

import java.util.Scanner;

/**
 * @author bbyh
 * @date 2022/12/19 0019 12:50
 * @description
 */
public class Test {
    public static void main(String[] args) {
        UserDao userDao = new UserDaoForArray();
        Application application = new Application(userDao);

        boolean flag = true;
        Scanner scanner = new Scanner(System.in);

        while (flag) {
            System.out.println("1、登录");
            System.out.println("2、注册");
            System.out.println("3、退出系统");
            System.out.print("请输入选项:");

            int choice = scanner.nextInt();
            switch (choice) {
                case 1:
                    application.login();
                    break;
                case 2:
                    application.register();
                    break;
                case 3:
                    flag = false;
                    break;
                default:
                    break;
            }
            System.out.println();
        }
    }
}

Java面向对象实验 5——继承与多态
这篇类似的,讲的非常详细,借鉴一下
https://blog.csdn.net/qq_46476515/article/details/127463252