4.3 jmu-Java-03面向对象-06-继承覆盖综合练习-Person、Student、Employee、Company (20 分)

4.3 jmu-Java-03面向对象-06-继承覆盖综合练习-Person、Student、Employee、Company (20 分)

定义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 personList。输入其他字符,则结束创建。

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

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

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

  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.util.Scanner;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Collections;
  • 写Person类中比较重要的一个点是用到了接口。implements是类去实现一个接口会用到的一个语句,Comparable<Person>是接口本身的定义,这是一个作为比较器的接口,传入的是<Person>类。需要做到的点是要在本类中将compareTo函数具体实现。
  • 关于compareTo函数,一般我们会用
    • 1表示当前值大于传入值;
    • -1表示当前值小于传入值;
    • 0表示当前值等于传入值;如果需要对类的多个属性进行比较的话,可以在这个分支再次进行拓展。
class Person implements Comparable<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 int hashCode() {
		return Objects.hash(age, gender, name);
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Person other = (Person) obj;
		return age == other.age && gender == other.gender && Objects.equals(name, other.name);
	}

	@Override
	public int compareTo(Person o) {
		int x = this.name.compareTo(o.name);
		if(x!=0) {
			return x;
		}
		else {
			if(this.age>o.age)
				return 1;
			else if (this.age<o.age)
				return -1;
			else
				return 0;
		}
	}
}
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 int hashCode() {
		final int prime = 31;
		int result = super.hashCode();
		result = prime * result + Objects.hash(clazz, stuNo);
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (!super.equals(obj))
			return false;
		if (getClass() != obj.getClass())
			return false;
		Student other = (Student) obj;
		return Objects.equals(clazz, other.clazz) && Objects.equals(stuNo, other.stuNo);
	}
	
}
class Company{
	private String name;

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

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

	@Override
	public int hashCode() {
		return Objects.hash(name);
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Company other = (Company) obj;
		return Objects.equals(name, other.name);
	}
	
}
  • 在Employee类中学习到在编写equals函数的时候,当我们要去比较浮点数的大小的时候,我们可以使用DecimalFormat类去新建一种浮点数的标准格式(以字符串的形式确定下来),然后直接去比较这种确定下来的形式,避免由于浮点误差而产生的误判。
class Employee extends Person{
	private Company company;
	private 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 + "-" + salary;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = super.hashCode();
		result = prime * result + Objects.hash(company, salary);
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (!super.equals(obj))
			return false;
		if (getClass() != obj.getClass())
			return false;
		Employee other = (Employee) obj;
		DecimalFormat df = new DecimalFormat("#.#");//创建一个Decimal的格式
		return Objects.equals(company, other.company)
				&& (df.format(salary)).equals(df.format(other.salary));
	}
}
public class Main {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		List<Person> personList = new ArrayList<>();
		List<Person> stuList = new ArrayList<>();
		List<Person> empList = new ArrayList<>();
		String choice;
		while(sc.hasNext())
		{
			choice = sc.next();
			if(choice.equals("s")) {
				String name = sc.next();
				if(name.equals("null"))
				{
					name = null;
				}
				int age = sc.nextInt();
				boolean gender = sc.nextBoolean();
				String stuNo = sc.next();
				if(stuNo.equals("null"))
				{
					stuNo = null;
				}
				String clazz = sc.next();
				if(clazz.equals("null"))
				{
					clazz = null;
				}
				Person student = new Student(name,age,gender,stuNo,clazz);
				personList.add(student);
				//
				if(!stuList.contains(student)) {
					stuList.add(student);
				}
			}
			else if(choice.equals("e")) {
				String _name = sc.next();
				if(_name.equals("null"))
				{
					_name = null;
				}
				int _age = sc.nextInt();
				boolean _gender = sc.nextBoolean();
				double salary = sc.nextDouble();
				String company_name = sc.next();
				Company company;
				if(company_name.equals("null"))
				{
					company = null;
				}
				else
				{
					company = new Company(company_name);
				}
				Person employee = new Employee(_name,_age,_gender,company,salary);
				personList.add(employee);
				//
				if(!empList.contains(employee)) {
					empList.add(employee);
				}
			}
			else break;
		}
		//output
		Collections.sort(personList);
		for (Person person : personList) {
			System.out.println(person.toString());
		}
	    if(sc.next().equals("exit"))  {
	    	   sc.close();
	    	   return ;
	       }  
	    
		//
		Collections.sort(stuList);
		System.out.println("stuList");
		for (Person person : stuList) {
			System.out.println(person.toString());
		}
		//
		Collections.sort(empList);
		System.out.println("empList");
		for (Person person : empList) {
			System.out.println(person.toString());
		}
		sc.close();
	}
}
  • 在主函数中主要学到的以下的一些零散的知识:
    • 进行流程控制未必一定都是switch-case结构比较好,一些情况下级联的if-else if结构也很不错,因为在前者中,通常break语句只能跳出switch-case结构中的某个case,而没有办法直接跳出循环,但是后者却可以。
    • 注意到当我们要对许多个类进行某种排序的时候,单纯使用数据结构自带的sort很多时候并不能达到我们想要的效果,所以这些情况下,就需要我们自己去给类加上想要用于比较的比较器接口自己去实现它的比较函数。
    • 在对LIst中的多个类进行sort的时候,可以多多关注Collections.sort

题外话:

  • 关于equals方法的重构:
    • 首先我们一般比较传入的obj是否于我们当前的类是同一个引用
    • 其次我们一般还会比较传入的obj是否是一个null
    • 如果需要比较的本类是子类,我们会额外先去比较它与传入的类是不是有共同的父类。(用super调用父类的equals)
    • 接下来是比较当前的两个类的类名是不是相同的。
    • 在接下来会新建一个本类的实例去存储传入的类,为后续逐一比较两个类的属性做铺垫。
    • return部分一般直接取两个类逐一属性的比较的逻辑结果的总合取的结果。
  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
### 回答1: "jmu-java-03面向对象-06-继承覆盖综合练习" 指的是一个练习题目,要求定义四个类:PersonStudentEmployeeCompany。其中,Person 类是父类,StudentEmployee继承Person 类,Company 类可能有多个 Employee 对象。这道题的目的是练习继承覆盖的使用方法。 ### 回答2: 面向对象编程中的继承是非常重要的概念,它可以让我们避免重复编码,提高代码的重用性和灵活性。在这个题目中,我们需要继承Person类,并创建一个Student类和一个Employee类。同时,我们还需要创建一个Company类来管理所有的Employee。 首先,我们需要在Person类中创建属性(name, age, gender),并定义构造函数来初始化它们。然后,我们可以创建一个Student类,并继承Person类,在其中添加新的属性及其相应的getter和setter方法。例如,我们可以添加一个grade字段来表示学生的班级。同样地,我们可以创建一个Employee类,并继承Person类,在其中添加新的属性及其相应的getter和setter方法。例如,我们可以添加一个salary字段来表示员工的工资。 接下来,我们需要在Company类中管理所有的Employee。我们可以使用ArrayList来存储Employee对象,并定义相应的addEmployee和removeEmployee方法来添加或删除Employee对象。同时,我们也可以实现计算公司总工资和打印员工信息的方法。 在继承覆盖方法方面,我们需要注意一个重要的概念:父类的方法可以被子类继承覆盖。例如,在Person类中定义了一个speak方法,我们可以在StudentEmployee类中重写这个方法,使得它们的行为不同。同时,我们也可以使用super关键字来调用父类的方法,以实现方法的增强。 最后,为了保证代码的可读性和可维护性,我们需要对类和方法进行适当的封装和注释。这可以帮助其他开发者更好地理解我们的代码,并且在后续的开发中,也可以更方便地进行扩展和修改。 综上所述,这个练习中涉及到了继承覆盖方法、ArrayList、封装和注释等多个面向对象编程的知识点。通过这个练习,我们可以更深入地理解面向对象编程的思想,并且提高我们的编程技巧和代码质量。 ### 回答3: 在面向对象编程中,继承覆盖是两个非常重要的概念。继承让一个类可以继承另一个类的属性和方法,而覆盖则让子类可以覆盖父类的方法,从而实现自己的特定功能。在这个综合练习中,我们需要创建一个Person类,并根据需要创建StudentEmployeeCompany类,以便练习继承覆盖。 首先,我们需要创建Person类,该类需要包含两个属性:姓名和年龄,并且需要有一个构造函数,以便创建Person对象时可以初始化这两个属性。Person类还应该有一个获取姓名的方法和一个获取年龄的方法。这些方法应该被所有的子类继承,并且应该被子类覆盖以实现自己的特定功能。 接下来,我们可以创建Student类,该类是Person类的子类,所以它可以继承Person类的属性和方法。但是学生还有一个额外的属性:学校。因此,我们需要为学生类添加一个新的属性,并添加一个构造函数来初始化这个新属性。学生类还需要覆盖Person类的获取姓名和获取年龄方法,并添加一个获取学校的方法。 然后,我们可以创建Employee类,这个类也是Person类的子类,它可以继承Person类的属性和方法。但是员工还有一些额外的属性,例如工作编号和薪水。因此,我们需要为Employee类添加这些新的属性,并添加一个构造函数来初始化这些新属性。Employee类还应该覆盖Person类的获取姓名和获取年龄方法,并添加一个获取工作编号和薪水的方法。 最后,我们可以创建一个Company类,这个类需要实现某些方法来管理公司的员工。因此,Company类应该有一个员工列表属性,并且应该有一个添加员工和移除员工的方法。这些方法需要在公司中添加或删除员工对象。此外,公司类还应该有一个方法来计算所有员工的总薪水。 综上所述,这个综合练习中涉及了面向对象编程的许多关键概念,例如继承覆盖和类的组合。通过实现这些类和方法,我们可以更好地理解这些概念,并掌握如何在实际的编程任务中应用这些概念。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

驼同学.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值