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

文章描述了一个Java编程问题,涉及创建Person抽象类以及其子类Student、Company和Employee。每个类都有特定的属性和构造函数,同时重写了equals方法进行对象比较。此外,文章还提到了如何对这些对象进行排序和去重,主要使用Collections.sort方法和自定义比较器。在main方法中,创建对象列表并按要求进行处理和输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:

定义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: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.text.DecimalFormat;
import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        //创建集合,存储元素
        List<Person> personList = new ArrayList<>();
        while(true){
            String choice = sc.next();
            if("s".equals(choice)){
                String name = sc.next();
                int age = sc.nextInt();
                boolean gender = "true".equals(sc.next());
                String stuNo = sc.next();
                String clazz = sc.next();
                personList.add(new Student(name,age,gender,stuNo,clazz));
            }else if("e".equals(choice)){
                String name = sc.next();
                int age = sc.nextInt();
                boolean gender = "true".equals(sc.next());
                double salary = sc.nextDouble();
                Company company = new Company(sc.next());

            personList.add(new Employee(name,age,gender,company,salary));
        }else{
            break;
        }
    }
    /*
    利用Collections工具类里的sort方法,这里我用的是匿名内部类的方式书写的,可以转成lambda表达
    式,不过转完之后会让人难以理解,所以我就不转了
    */
    Collections.sort(personList, new Comparator<Person>() {
        @Override
        public int compare(Person o1, Person o2) {
            int i = o1.name.compareTo(o2.name);
            i = i==0 ? o1.age-o2.age : i;
            return i;
        }
    });
    //增强for对集合进行遍历打印
    for (Person person : personList) {
        System.out.println(person.toString());
    }
    String choice = sc.next();
    if("exit".equals(choice)){
        //手动安全结束虚拟机工作
        System.exit(0);
    }
    
    //创建两个集合
    ArrayList<Student> stuList = new ArrayList<>();
    ArrayList<Employee> empList = new ArrayList<>();

    for (Person person : personList) {
        //用instanceof判断能否转成Student类
        if(person instanceof Student){
            if(ExistsStu(stuList,person)){
                stuList.add((Student)person);
            }
        }else{
            if(ExistsEmp(empList,person)){
                empList.add((Employee)person);
            }
        }
    }
    System.out.println("stuList");
    for (Student student : stuList) {
        System.out.println(student.toString());
    }
    System.out.println("empList");
    for (Employee employee : empList) {
        System.out.println(employee.toString());
    }

}
//判断empList是否存在该元素
private static boolean ExistsEmp(ArrayList<Employee> empList, Person person) {
    for (Employee employee : empList) {
        if(employee.equals(person)){
            return false;
        }
    }
    return true;
}

//判断stuList是否存在该元素
private static boolean ExistsStu(ArrayList<Student> stuList, Person person) {
    for (Student student : stuList) {
        if(student.equals(person)){
            return false;
        }
    }
    return true;
}

}
//抽象类Person
abstract class Person{
    String name;
    int age;
    boolean gender;

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

public Person() {
}

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

@Override
public boolean equals(Object obj) {
    Person p1 = (Person)obj;
    if(p1==null){
        return false;
    }
    if(p1.name==null){
        return false;
    }
    if(!this.name.equals(p1.name)){
        return false;
    }
    if(!(this.age==p1.age)){
        return false;
    }
    return this.gender == p1.gender;
}

}

//学生类
class Student extends Person{
    String stuNo;
    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 s1 = (Student)obj;
    if(s1==null){
        return false;
    }
    if(s1.stuNo==null){
        return false;
    }
    if(!this.stuNo.equals(s1.stuNo)){
        return false;
    }
    if(s1.clazz==null){
        return false;
    }
    return this.clazz.equals(s1.clazz);
}

}
class Company{
    String name;

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

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

@Override
public boolean equals(Object obj) {
    Company c1 = (Company)obj;
    if(c1==null){
        return false;
    }
    if(c1.name==null){
        return false;
    }
    return this.name.equals(c1.name);
}

}
//员工类
class Employee extends Person{
    Company company;
    double salary;

public Employee(String name, int age, boolean gender, Company company, double salary) {
    super(name, age, gender);
    this.company = company;
    this.salary = salary;
}

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

@Override
public boolean equals(Object obj) {
    if(!super.equals(obj)){
        return false;
    }
    Employee e1 = (Employee)obj;
    if(e1.company==null){
        return false;
    }
    if(!this.company.name.equals(e1.company.name)){
        return false;
    }
    
    //这里不知道什么原因,小数对比总会返回false,所以我就用字符串的方式进行判断
    DecimalFormat df = new DecimalFormat("#.#");
    String s1 = df.format(this.salary);
    String s2 = df.format(e1.salary);
    
    return s1.equals(s2);
}

}

解析:

不得不说这题对我来说还是有点难度的,坑很多,也写了不短的时间,如果对里面的工具类比较陌生,也

可以上网查找资料了解一下。

最后说一句,做完之后真TM爽。

### 回答1: 这是一个综合练习,涉及到面向对象中的继承覆盖。题目中给出了四个类:PersonStudentEmployeeCompany。我们需要在这些类中定义属性和方法,使得它们能够正确地继承覆盖Person类是基类,它包含了一个人的基本信息,如姓名、年龄、性别等。Student类和Employee类都是Person类的子类,它们分别表示学生和员工。在这两个类中,我们需要定义一些特有的属性和方法,如学生的学号和课程成绩,员工的工号和薪水等。 Company类是一个独立的类,它表示一个公司。在这个类中,我们需要定义一个员工列表,用来存储公司的所有员工。同时,我们还需要定义一些方法,如添加员工、删除员工、计算公司总薪水等。 在这个综合练习中,我们需要注意继承覆盖的关系。子类可以继承父类的属性和方法,但是也可以覆盖父类的方法,以实现自己的特定功能。同时,我们还需要注意类之间的关系,如Student类和Employee类都是Person类的子类,而Company类则是独立的一个类。 ### 回答2: 面向对象编程是软件开发中一个非常重要的概念。在这种思想下,所有的程序都是由对象和方法组成的,而对象之间可以通过方法进行交互。继承覆盖又是面向对象编程中非常重要的两个概念,它们可以帮助程序员更加高效和便捷地开发复杂的应用程序。 在JMU-Java-03课程中,我们学习了继承覆盖的相关知识,并通过综合练习来巩固和应用这些知识。在这个练习中,我们需要为一个公司编写一个程序,其中包含PersonStudentEmployeeCompany四个类。 Person类是一个基础类,它包含一个姓名和一个年龄属性。Student继承Person类,并添加了一个学校属性。Employee类也继承Person类,它包含一个工作单位和一个工资属性。最后,Company继承Employee类,并添加了一个员工列表属性以及对应的方法。 在这个练习中,我们需要注意如下几点: 首先,需要正确理解继承覆盖的概念。继承是从已有的类中派生出新的类,而覆盖则是在子类中重写父类的方法。在这个程序中,通过Person类作为基础类,可以很方便地为StudentEmployee添加新的属性和方法。 其次,需要注意代码的结构和组织。编写一个好的程序不仅需要正确运用继承覆盖的概念,还需要注意代码的可读性、可复用性等方面。在这个程序中,可以将Person类作为基础类,然后让StudentEmployee继承自它,这样可以提高代码的可读性,同时也可以方便地重用Person类的代码。 最后,需要注意程序的测试和调试。在开发过程中,需要不断测试和调试程序,以确保程序的正确性和稳定性。在这个练习中,可以编写一些简单的测试用例,来检验程序的正确性。如果程序中出现了错误,也需要及时进行调试和修改。 总之,在这个练习中,我们通过继承覆盖练习,进一步巩固了面向对象编程的基本概念和应用方法,同时也了解了如何编写简单的复杂应用程序。通过不断练习和实践,我们可以更加熟练地掌握这些知识,从而成为一名优秀的软件工程师。 ### 回答3: 继承覆盖面向对象编程的核心概念之一,它们的作用是实现代码的重复利用和扩展。在本次的综合练习中,我们创建了四个类:PersonStudentEmployeeCompany,它们之间都存在了继承覆盖的关系。 首先是Person类,它是其他三个类的基类,所有的人都拥有姓名和年龄两个属性,因此这两个属性被定义在Person类中。Person类还有两个方法,一个是构造方法,用于初始化姓名和年龄;另一个是introduce()方法,用于介绍一个人的姓名和年龄。这样的抽象定义使得我们可以很方便地创建不同类型的人。 接着是Student类,它继承Person类,因此它也拥有姓名和年龄两个属性,并且继承Person类的构造方法和introduce()方法。在Student类中,我们另外定义了一个属性grade,表示学生的年级。为了方便创建和操作学生,我们还定义了一系列方法,比如setGrade()、getGrade()、study()等,这些方法可以让我们方便地操作学生和获取他们的信息。 Employee类和Company类的定义与Student类类似,它们也都继承Person类,但是定义了不同的属性和方法。Employee类中定义了属性salary,表示雇员的工资,同时还有一个work()方法,表示雇员在工作。Company类中定义了属性name,表示公司的名称,同时还有一个hire()方法,表示招聘新员工。在Company类中,我们还定义了一个employees数组,用于保存公司全部的雇员信息。 综上所述,我们通过继承覆盖的方式,创建了上述四个类,并且定义了它们各自的属性和方法。这些类中的方法可以让我们很方便地操作不同类型的人,并且可以相互协作,形成一个完整的系统。这就是面向对象编程的魅力所在,它可以通过抽象、封装、继承和多态等方式,帮助我们更好地组织和管理复杂的代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值