PTA:7-1 jmu-Java-03面向对象-06-继承覆盖综合练习-Person、Student、Employee、Company

本文介绍了一个Java程序实例,该程序定义了Person抽象类及其子类Student和Employee,并实现了对象间的比较与排序功能。通过具体示例展示了如何创建这些对象,如何利用equals方法判断对象的相等性,以及如何通过自定义比较器对Person对象列表进行排序。

定义Person抽象类,Student类、Company类,Employee类。

Person类的属性String name, int age, boolean gender
Person类的方法:

public Person(String name, int age, boolean gender);
public String toString();         //返回"name-age-gender"格式的字符串
public boolean equals(Object obj);//比较name、age、gender,都相同返回true,否则返回false

Student类继承自Person,属性:String stuNo, String clazz
Student类的方法:

//建议使用super复用Person类的相关有参构造函数
public Student(String name, int age, boolean gender, String stuNo, String clazz);
public String toString();         //返回 “Student:person的toString-stuNo-clazz”格式的字符串
public boolean equals(Object obj);//首先调用父类的equals方法,如果返回true,则继续比较stuNo与clazz。

Company类属性:String name
Company类方法:

public Company(String name);
public String toString();         //直接返回name
public boolean equals(Object obj);//name相同返回true

Employee类继承自Person,属性:Company company, double salary
Employee类方法:

//建议使用super复用Person类的相关有参构造函数
public Employee(String name, int age, boolean gender, double salary, Company company);
public String toString();         //返回"Employee:person的toString-company-salary"格式的字符串
public boolean equals(Object obj);//首先调用父类的equals方法,如果返回true。再比较company与salary。
//比较salary属性时,使用DecimalFormat df = new DecimalFormat("#.#");保留1位小数

编写equals方法重要说明:

  1. 对Employee的company属性的比较。要考虑传入为null的情况。如果company不为null且传入为null,返回false
  2. 对所有String字符类型比较时,也要考虑null情况。

提示

  1. 排序可使用Collections.sort
  2. equals方法要考虑周全

main方法说明

  1. 创建若干Student对象、Employee对象。
    输入s,然后依次输入name age gender stuNo clazz创建Student对象
    输入e,然后依次输入name age gender salary company创建Employee对象
    然后将创建好的对象放入List<Person> personList。输入其他字符,则结束创建。

创建说明: 对于String类型,如果为null则不创建对象,而赋值为null。对于company属性,如果为null则赋值为null,否则创建相应的Company对象。

  1. 对personList中的元素实现先按照姓名升序排序,姓名相同再按照年龄升序排序。提示:可使用Comparable<Person>Comparator<Person>

  2. 接受输入,如果输入为exitreturn退出程序,否则继续下面步骤。

  3. 将personList中的元素按照类型分别放到stuList与empList。注意:不要将两个内容相同的对象放入列表(是否相同是根据equals返回结果进行判定)。

  4. 输出字符串stuList,然后输出stuList中的每个对象。

  5. 输出字符串empList,然后输出empList中的每个对象。

1-3为一个测试点
4-6为一个测试点

输入样例:

s zhang 23 false 001 net15
e wang 18 true 3000.51 IBM
s zhang 23 false 001 net15
e bo 25 true 5000.51 IBM
e bo 25 true 5000.52 IBM
e bo 18 true 5000.54 IBM
e tan 25 true 5000.56 IBM
e tan 25 true 5000.51 IBM
s wang 17 false 002 null
s wang 17 false 002 null
e hua 16 false 1000 null
s wang 17 false 002 net16
e hua 16 false 1000 null
e hua 18 false 1234 MicroSoft
!
continue

输出样例:

Employee:bo-18-true-IBM-5000.54
Employee:bo-25-true-IBM-5000.51
Employee:bo-25-true-IBM-5000.52
Employee:hua-16-false-null-1000.0
Employee:hua-16-false-null-1000.0
Employee:hua-18-false-MicroSoft-1234.0
Employee:tan-25-true-IBM-5000.56
Employee:tan-25-true-IBM-5000.51
Student:wang-17-false-002-null
Student:wang-17-false-002-null
Student:wang-17-false-002-net16
Employee:wang-18-true-IBM-3000.51
Student:zhang-23-false-001-net15
Student:zhang-23-false-001-net15
stuList
Student:wang-17-false-002-null
Student:wang-17-false-002-net16
Student:zhang-23-false-001-net15
empList
Employee:bo-18-true-IBM-5000.54
Employee:bo-25-true-IBM-5000.51
Employee:bo-25-true-IBM-5000.52
Employee:hua-16-false-null-1000.0
Employee:hua-18-false-MicroSoft-1234.0
Employee:tan-25-true-IBM-5000.56
Employee:tan-25-true-IBM-5000.51
Employee:wang-18-true-IBM-3000.51

 这道题主要难度其实并不大,只是每个模块要求的内容相对比较多,要考虑周到会比较花时间

代码如下:


import java.util.*;

/**
 * @author: PQ丶Lee
 * @createTime: 2022-11-17 18:30
 **/
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        List<Person> personList = new ArrayList<>() ;
        boolean loop = true;
        while (loop) {
            String key = sc.next();
            if (key.charAt(0) == 's') {
                //(String name, int age, boolean gender, String stuNo, String clazz)
                String name = sc.next();
                int age = sc.nextInt();
                boolean b = Boolean.parseBoolean(sc.next());
                String stuNo = sc.next();
                String clazz = sc.next();
                if (name == null || stuNo== null || clazz==null){
                    personList.add(new Student(name, age, b, stuNo, clazz));
                }else {
                    personList.add(new Student(name, age, b, stuNo, clazz));
                }
            } else if (key.charAt(0) == 'e') {
                //Employee(String name, int age, boolean gender,  double salary,Company company)
                String name1 = sc.next();
                int age = sc.nextInt();
                boolean b = Boolean.parseBoolean(sc.next());
                double sal = sc.nextDouble();
                String name2 = sc.next();
                if (name1==null||name2==null){
                    personList.add(new Employee(name1, age, b, sal, new Company(name2)));
                }else {
                    personList.add(new Employee(name1, age, b, sal, new Company(name2)));
                }
            } else {
                loop = false;
            }
        }

        Collections.sort(personList, new Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                if (!(o1.getName().equals(o2.getName()))) {
                    return o1.getName().compareTo(o2.getName());
                } else {
                    return o1.getAge() - o2.getAge();
                }
            }
        });
        for (Person p :personList){
            System.out.println(p);
        }
        String key2 = sc.next();
        if (key2.equals("exit") || key2.equals("return")){
            System.exit(0);
        }
        List<Student> stuList = new ArrayList<>();
        List<Employee> empList = new ArrayList<>();
        for (Object obj : personList){
            if (obj instanceof Student) {
                Student stu = (Student) obj;
                boolean lo = true;
                for (Student student :stuList){
                    if (stu.equals(student)){
                        lo = false;
                    }
                }
                if (lo){
                    stuList.add(stu);
                }
            } else if (obj instanceof Employee) {
                Employee emp = (Employee) obj;
                boolean lo = true;
                for (Employee employee :empList){
                    if (emp.equals(employee)){
                        lo = false;
                    }
                }
                if (lo){
                    empList.add(emp);
                }

            }
        }
        System.out.println("stuList");
        for (Student s :stuList){
            System.out.println(s);
        }
        System.out.println("empList");
        for (Employee e :empList){
            System.out.println(e);
        }
    }
}
abstract class Person {
    private String name;
    private int age;
    private boolean gender;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public boolean isGender() {
        return gender;
    }

    public void setGender(boolean gender) {
        this.gender = gender;
    }

    public Person(String name, int age, boolean gender) {
        this.name = name;
        this.age = age;
        this.gender = gender;
    }

    @Override
    public String toString() {
        return this.name + "-" + this.age + "-" + this.gender;
    }

    public boolean equals(Object obj) {
        if (obj instanceof Person) {
            Person person = (Person) obj;
            return (this.name.equals(person.name)) && (this.gender == person.gender) && (this.age == person.age);
        }
        return false;
    }
}

/**
 * //建议使用super复用Person类的相关有参构造函数
 * public Student(String name, int age, boolean gender, String stuNo, String clazz);
 * public String toString();         //返回 “Student:person的toString-stuNo-clazz”格式的字符串
 * public boolean equals(Object obj);//首先调用父类的equals方法,如果返回true,则继续比较stuNo与clazz。
 */
class Student extends Person {
    private String stuNo;
    private String clazz;

    public Student(String name, int age, boolean gender, String stuNo, String clazz) {
        super(name, age, gender);
        this.stuNo = stuNo;
        this.clazz = clazz;
    }

    @Override
    public String toString() {
        return "Student:"+super.toString() + "-" + stuNo + "-" + clazz;
    }

    public boolean equals(Object obj) {
        if (super.equals(obj)) {
            if (obj instanceof Student) {
                Student student = (Student) obj;
                return this.stuNo.equals(student.stuNo) && this.clazz.equals(student.clazz);
            }
        }

        return false;
    }
}

/**
 * public Company(String name);
 * public String toString();         //直接返回name
 * public boolean equals(Object obj);//name相同返回true
 */
class Company {
    private String name;

    public Company(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return name;
    }

    public boolean equals(Object obj) {
        if (obj instanceof Company) {
            Company company = (Company) obj;
            return company.name.equals(company.name);
        }
        return false;

    }
}

/**
 * //建议使用super复用Person类的相关有参构造函数
 * public Employee(String name, int age, boolean gender, double salary, Company company);
 * public String toString();         //返回"Employee:person的toString-company-salary"格式的字符串
 * public boolean equals(Object obj);//首先调用父类的equals方法,如果返回true。再比较company与salary。
 * //比较salary属性时,使用DecimalFormat df = new DecimalFormat("#.#");保留1位小数
 */
class Employee extends Person {
    private Company company;
    private double salary;
//new Employee(name1, sc.nextInt(), Boolean.parseBoolean(sc.next()), sc.nextDouble(), new Company(name2))
    public Employee(String name, int age, boolean gender,  double salary,Company company) {
        super(name, age, gender);
        this.company = company;
        this.salary = salary;
    }

    @Override
    public String toString() {
        return "Employee:"+super.toString() + "-" + this.company + "-" + this.salary;
    }

    public boolean equals(Object obj) {
        if (super.equals(obj)) {
            if (obj instanceof Employee) {
                Employee employee = (Employee) obj;
                if (this.salary != employee.salary) {
                    return false;
                }
                if (company == null) {
                    return false;
                }
                return true;
            }
        }
        return false;
    }
}



效果实现图:

 

 

7 - 2 jmu - Java - 03 面向对象 - 06 - 继承覆盖综合练习中,需要定义 Person 抽象类Student Company Employee ,并完成相应的方法实现与对象创建操作。 ### 定义与实现 #### Person 抽象类 由于未给出 Person 的具体定义,假设其有 name、age、gender 属性以及对应的构造函数和 `toString`、`equals` 方法。 ```java abstract class Person { protected String name; protected int age; protected boolean gender; public Person(String name, int age, boolean gender) { this.name = name; this.age = age; this.gender = gender; } @Override public String toString() { return name + "-" + age + "-" + gender; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null || getClass() != obj.getClass()) return false; Person person = (Person) obj; return age == person.age && gender == person.gender && (name == null ? person.name == null : name.equals(person.name)); } } ``` #### Student ```java class Student extends Person { private String stuNo; private String clazz; public Student(String name, int age, boolean gender, String stuNo, String clazz) { super(name, age, gender); this.stuNo = stuNo; this.clazz = clazz; } @Override public String toString() { return "Student:" + super.toString() + "-" + stuNo + "-" + clazz; } @Override public boolean equals(Object obj) { if (!super.equals(obj)) return false; Student student = (Student) obj; return (stuNo == null ? student.stuNo == null : stuNo.equals(student.stuNo)) && (clazz == null ? student.clazz == null : clazz.equals(student.clazz)); } } ``` #### Company ```java class Company { private String name; public Company(String name) { this.name = name; } @Override public String toString() { return name; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null || getClass() != obj.getClass()) return false; Company company = (Company) obj; return (name == null ? company.name == null : name.equals(company.name)); } } ``` #### Employee ```java import java.text.DecimalFormat; class Employee extends Person { private Company company; private double salary; public Employee(String name, int age, boolean gender, double salary, Company company) { super(name, age, gender); this.salary = salary; this.company = company; } @Override public String toString() { return "Employee:" + super.toString() + "-" + company + "-" + salary; } @Override public boolean equals(Object obj) { if (!super.equals(obj)) return false; Employee employee = (Employee) obj; DecimalFormat df = new DecimalFormat("#.#"); String formattedSalary1 = df.format(salary); String formattedSalary2 = df.format(employee.salary); return (company == null ? employee.company == null : company.equals(employee.company)) && formattedSalary1.equals(formattedSalary2); } } ``` ### 主方法实现 ```java import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); List<Person> personList = new ArrayList<>(); while (scanner.hasNext()) { String type = scanner.next(); if ("s".equals(type)) { String name = scanner.next(); int age = scanner.nextInt(); boolean gender = scanner.nextBoolean(); String stuNo = scanner.next(); String clazz = scanner.next(); if (name != null) { personList.add(new Student(name, age, gender, stuNo, clazz)); } } else if ("e".equals(type)) { String name = scanner.next(); int age = scanner.nextInt(); boolean gender = scanner.nextBoolean(); double salary = scanner.nextDouble(); String companyName = scanner.next(); Company company = companyName == null ? null : new Company(companyName); if (name != null) { personList.add(new Employee(name, age, gender, salary, company)); } } else { break; } } // 可以在这里进行排序等操作 // Collections.sort(personList); for (Person person : personList) { System.out.println(person); } } } ``` ### 实现思路 1. **的设计**:定义Person 抽象类作为基StudentEmployee 继承Person Company 作为 Employee 属性型。 2. **方法实现**:每个都重写了 `toString` 和 `equals` 方法,其中 Employee 的 `equals` 方法在比较 salary 时保留一位小数。 3. **对象创建**:在主方法中,根据输入的字符型(s 或 e)创建相应的 StudentEmployee 对象,并将其添加到 `personList` 中。 ### 注意事项 - 对于 String 型的属性,当输入为 null 时,对象属性赋值为 null。 -Employee 的 `equals` 方法中,比较 salary 时使用 `DecimalFormat` 保留一位小数。 -Company 属性的比较要考虑 null 的情况。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值