Java面向对象综合实践:从Person到Company的继承体系设计与对象管理

Java面向对象综合实践:从Person到Company的继承体系设计与对象管理 1. 从Person到Company的继承体系设计在Java面向对象编程中继承体系的设计往往从最基础的类开始。我们先来看Person类的设计这个类将作为整个继承体系的基类。Person类包含三个基本属性name姓名、age年龄和gender性别。这些属性被声明为private以保证封装性同时提供对应的getter和setter方法。public abstract class Person { private String name; private int age; private 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 other (Person) obj; return age other.age gender other.gender Objects.equals(name, other.name); } }从Person类派生出Student类和Employee类体现了面向对象中is-a的关系。Student类增加了stuNo学号和clazz班级属性Employee类则增加了salary薪资和company公司属性。这种设计遵循了里氏替换原则子类可以完全替代父类。2. 方法覆盖与多态的实现在继承体系中方法覆盖是实现多态的关键。我们来看Student类如何覆盖toString()和equals()方法public 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 other (Student) obj; return Objects.equals(stuNo, other.stuNo) Objects.equals(clazz, other.clazz); } }Employee类的equals()方法实现需要特别注意company属性可能为null的情况以及salary属性的比较精度问题public 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.company company; this.salary salary; } Override public boolean equals(Object obj) { if (!super.equals(obj)) return false; Employee other (Employee) obj; if (company null) { if (other.company ! null) return false; } else if (!company.equals(other.company)) return false; DecimalFormat df new DecimalFormat(#.#); return df.format(salary).equals(df.format(other.salary)); } }3. 对象管理与集合操作在实际应用中我们需要管理多个Person对象并进行排序、去重等操作。首先创建一个List 来存储所有人员ListPerson personList new ArrayList(); // 添加Student和Employee对象 personList.add(new Student(zhang, 23, false, 001, net15)); personList.add(new Employee(wang, 18, true, 3000.51, new Company(IBM)));对personList进行排序可以使用Comparator接口实现自定义排序规则。这里我们实现按姓名升序、姓名相同按年龄升序的排序Collections.sort(personList, new ComparatorPerson() { Override public int compare(Person p1, Person p2) { int nameCompare p1.getName().compareTo(p2.getName()); if (nameCompare ! 0) return nameCompare; return Integer.compare(p1.getAge(), p2.getAge()); } });4. 对象分类与去重处理将personList中的对象按照类型分类到stuList和empList中并确保不添加重复对象ListPerson stuList new ArrayList(); ListPerson empList new ArrayList(); for (Person person : personList) { if (person instanceof Student) { if (!containsPerson(stuList, person)) { stuList.add(person); } } else if (person instanceof Employee) { if (!containsPerson(empList, person)) { empList.add(person); } } } private boolean containsPerson(ListPerson list, Person person) { for (Person p : list) { if (p.equals(person)) { return true; } } return false; }这种分类处理在实际业务中很常见比如在学校管理系统中分离学生和教职工在企业HR系统中区分不同部门的员工等。通过合理的继承体系设计和对象管理可以大大简化这类业务逻辑的实现。