7-2 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情况。

提示
排序可使用Collections.sort
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对象。

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

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

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

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

  6. 输出字符串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

这道题真长都不想看,不过拖了这么久还是要写的。
里面get/set方法是我直接快捷粘上去的(右键Source或者Alt+Shift+s;然后选择Generate Getters and Setters;勾选你要添加的对象的get/set方法),这道题里没什么用的我已经注释掉了,但是我觉得写程序的时候加上get/set这是个比较好的习惯。
先附上一点要用的知识点:

  1. DecimalFormat
  2. getClass
  3. Comparable 和 Comparator比较

import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Scanner;

abstract class Person{		//按照题目要求定义抽象类,其实是不是抽象类并不重要
	private String name, c;
	private int age;
	private boolean gender;
	
	public String getName() {
		return name;
	}

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

	public String getC() {
		return c;
	}

//	public void setC(String c) {
//		this.c = c;
//	}

	public int getAge() {
		return age;
	}

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

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

	public Person(String c, String name, int age, boolean gender) {
		this.c = c;
		this.name = name;
		this.age = age;
		this.gender = gender;
	}
	
	@Override
	public String toString() {
		return name + "-" + age + "-" + gender;
		//返回"name-age-gender"格式的字符串
	}
	
	public boolean equals(Object obj) {		
		Person per = (Person) obj;
		//对于String类型,如果为null则不创建对象,而赋值为null。比较name之前应先判断其是否为空。
		if(per.name == null || this.name == null)
			return false;
		return (per.name.compareTo(this.name) == 0 && per.age == this.age && per.gender == this.gender );
		//比较name、age、gender,都相同返回true,否则返回false
	}
}

class Student extends Person{
	private String stuNo;
	private String clazz;
	
//	public String getStuNo() {
//		return stuNo;
//	}
//
//	public void setStuNo(String stuNo) {
//		this.stuNo = stuNo;
//	}
//
//	public String getClazz() {
//		return clazz;
//	}
//
//	public void setClazz(String clazz) {
//		this.clazz = clazz;
//	}

	public Student(String c, String name, int age, boolean gender, String stuNo, String clazz) {
		super(c, name, age, gender);	//用super复用Person类的相关有参构造函数,切记放在首句
		this.stuNo = stuNo;
		this.clazz = clazz;
	}
	
	public String toString(){	
		return super.toString() + "-" + stuNo + "-" + clazz;
		//返回 “Student:person的toString-stuNo-clazz”格式的字符串
	}
	
	public boolean equals(Object obj) {
		Student per = (Student)obj;
		if(super.equals(obj)) {		
			//首先调用父类的equals方法,如果返回true,则继续比较stuNo与clazz。
			if(per.stuNo == null || per.clazz == null || this.stuNo == null || this.clazz == null) 
				return false;
			return (per.stuNo.compareTo(this.stuNo) == 0 && per.clazz.compareTo(this.clazz) == 0);
		}
		return false;
	}
}

class Company{
	private String name;
	
//	public String getName() {
//		return name;
//	}
//
//	public void setName(String name) {
//		this.name = name;
//	}
//
	public Company(String name) {
		this.name = name;
	}
	
	public String toString() {	//直接返回name
		return name;
	}
	
//	@Override
//	public int hashCode() {
//		final int prime = 31;
//		int result = 1;
//		result = prime * result + ((name == null) ? 0 : name.hashCode());
//		return result;
//	}

//右键Source或者Alt+Shift+s;然后选择Generate hashCode() and equals()...(这两个一般要一起用的)
	@Override
	public boolean equals(Object obj) {
		if (this == obj)	//如果this和obj指向的内存单元相同,即两个指的就是同一个东西当然要返回true了
			return true;
		if (obj == null)	//如果obj指向空
			return false;
		if (getClass() != obj.getClass())	//getClass()获得类名,若类都不同那内容肯定也不同了
			return false;
		Company other = (Company) obj;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;	//name相同返回true
	}
}

class Employee extends Person{
	private Company company;
	private double salary;
	
//	public Company getCompany() {
//		return company;
//	}
//
//	public void setCompany(Company company) {
//		this.company = company;
//	}
//
//	public double getSalary() {
//		return salary;
//	}
//
//	public void setSalary(double salary) {
//		this.salary = salary;
//	}

	public Employee(String c, String name, int age, boolean gender, double salary, Company company) {
		super(c, name, age, gender);		//使用super复用Person类的相关有参构造函数
		this.salary = salary;
		this.company = company;
	}
	
	
	@Override
	public String toString() {
		return super.toString() + "-" + company.toString() + "-" + salary;
		//返回"Employee:person的toString-company-salary"格式的字符串
	}
	
	@Override
	public boolean equals(Object obj) {
		if(super.equals(obj)) {		//首先调用父类的equals方法,如果返回true。再比较company与salary。
			Employee per = (Employee)obj;
			if(this.company.toString() == null || per.company.toString() == null) 	
				return false;
			//比较salary属性时,使用DecimalFormat df = new DecimalFormat("#.#");保留1位小数
			String newpersalary = new DecimalFormat("#.#").format(per.salary);
			String newthissalary = new DecimalFormat("#.#").format(this.salary);
			return (per.company.toString().compareTo(this.company.toString()) == 0 && newpersalary.compareTo(newthissalary) == 0);
		}
		return false;
	}
	
}

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner input = new Scanner(System.in);
		String c, name, stuNo, clazz, companyname, str;
		int age;
		boolean gender;
		double salary;
		ArrayList<Person> personList = new ArrayList<Person>();
		ArrayList<Student> studentList = new ArrayList<Student>();
		ArrayList<Employee> employeeList = new ArrayList<Employee>();
		while(true) {
			c = input.next();
			if(c.compareTo("s") == 0) {
				name = input.next();
				age = input.nextInt();
				gender = input.nextBoolean();
				stuNo = input.next();
				clazz = input.next();
				Student student = new Student(c, name, age, gender, stuNo, clazz);
				personList.add(student);
			}
			else if(c.compareTo("e") == 0) {
				name = input.next();
				age = input.nextInt();
				gender = input.nextBoolean();
				salary = input.nextDouble();
				companyname = input.next();
				Company company = new Company(companyname);
				Employee employee = new Employee(c, name, age, gender, salary, company);
				personList.add(employee);
			}
			else {
				personList.sort(Comparator.comparing(Person::getName).thenComparingInt(Person::getAge));
				//对personList中的元素实现先按照姓名升序排序,姓名相同再按照年龄升序排序。
				for(int i = 0; i < personList.size(); ++i) {
					//将personList中元素输出,并将其非重复元素分到studentList和employeeList数组中
					if(personList.get(i).getC().compareTo("s") == 0) {
						System.out.println("Student:" + personList.get(i).toString());
						int flag = 0;
						for(int j = 0; j < studentList.size(); ++j) {
							if(studentList.get(j).equals(personList.get(i))) {
								flag = 1;
								break;
							}
						}
						if(flag == 0) 
							studentList.add((Student)personList.get(i));
					}
					else if(personList.get(i).getC().compareTo("e") == 0){
						System.out.println("Employee:" + personList.get(i).toString());
						int flag = 0;
						for(int j = 0; j < employeeList.size(); ++j) {
							if(employeeList.get(j).equals(personList.get(i))) {
								flag = 1;
								break;
							}
						}
						if(flag == 0) 
							employeeList.add((Employee)personList.get(i));
					}
				}
				str = input.next();
				//如果输入为exit则return退出程序
				if(str.compareTo("exit") == 0 || str.compareTo("return") == 0)
					return;
				System.out.println("stuList");
				for(int i = 0; i < studentList.size(); ++i) 
					System.out.println("Student:" + studentList.get(i).toString());
				System.out.println("empList");
				for(int i = 0; i < employeeList.size(); ++i)
					System.out.println("Employee:" + employeeList.get(i).toString());
			}
		}
	}
}

你可能感兴趣的:(JAVA上机作业)