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

这篇博客主要讲解了Java面向对象编程中关于继承和覆盖的概念,通过Person、Student、Employee和Company四个类的实例,阐述了如何定义抽象类、子类以及实现toString()和equals()方法。博客提到了如何处理对象比较、排序以及在main方法中创建和管理对象的过程。最后,博主分享了对代码的理解和个人见解。

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

7-8 jmu-Java-03面向对象-06-继承覆盖综合练习-Person、Student、Employee、Company(带个人意见代码解释)

题目内容:
定义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方法重要说明:
对Employee的company属性的比较。要考虑传入为null的情况。如果company不为null且传入为null,返回false
对所有String字符类型比较时,也要考虑null情况。
提示:
排序可使用Collections.sort
equals方法要考虑周全

main方法说明
创建若干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对象。
对personList中的元素实现先按照姓名升序排序,姓名相同再按照年龄升序排序。提示:可使用Comparable或Comparator
接受输入,如果输入为exit则return退出程序,否则继续下面步骤。
将personList中的元素按照类型分别放到stuList与empList。注意:不要将两个内容相同的对象放入列表(是否相同是根据equals返回结果进行判定)。
输出字符串stuList,然后输出stuList中的每个对象。
输出字符串empList,然后输出empList中的每个对象。

import java.util.*;
import java.text.DecimalFormat;//用最快的速度将数字格式化为需要的样子,题目要求(#.#)->86h
class Person {
	 private String name;
	 private int age;
	 private boolean gender;
	 //构造函数Person 
	 Person(String name,int age,boolean gender) {
		  this.name = name;
		  this.age = age;
		  this.gender = gender;
		 }
	 //定义返回字符串的格式,返回"name-age-gender"格式的字符串
	 public String toString() {
	 	 return this.name + "-" + age + "-" + gender;
	 }
	 /* 比较name,age,gender
	 instanceof判断obj是否为Person类实例,名字是否相同,年龄是否相等及gender是否相等
	 String比较用__.equals(__),数值用== 
	 (Person)obj类型强制转换*/ 
	 public boolean equals(Object obj) {
		  if (obj instanceof Person) {
		  	 return this.name.equals(((Person) obj).name) && this.age == ((Person) obj).age && this.gender == ((Person) obj).gender;
		  } else {
		  	 return false;
		  }
	 }
	 //获取name和age
	 String getString() {
	  	return this.name;
	 } 
	 int getAge() {
	  	return this.age;
	 }
}
//Student继承Person
class Student extends Person {
 	private String stuNo, clazz;

	//构造函数Student 
	 Student(String name, int age, boolean gender, String stuNo, String clazz) {
		  super(name, age, gender);
		  this.stuNo = stuNo;
		  this.clazz = clazz;
	}
	//定义返回字符串的格式,返回 “Student:person的toString-stuNo-clazz”格式的字符串
	 public String toString() {
	  	return "Student:" + super.toString() + "-" + stuNo + "-" + clazz;
	 }
	 
	 /* 先调用父类Person的equals方法->super.equals(obj),再继续比较stuNo和clazz
	 instanceof判断obj是否为Student类实例,stuNo是否相同,clazz是否相同
	 String比较用__.equals(__);Student)obj类型强制转换*/
	 public boolean equals(Object obj) {
	  	if (obj instanceof Student) {
	   		return super.equals(obj) && this.stuNo.equals(((Student) obj).stuNo) && this.clazz.equals(((Student) obj).clazz);
	  	} else {
	   		return false;
	  	}
	}
}
class Company {
	 private String name; 
	 
	 //构造函数Company 
	 Company(String name) {
	  	this.name = name;
	 } 
	 
	 //定义返回字符串格式,直接返回name
	 public String toString() {
	  	return name;
	 } 
	 
	 /* 比较name
	 instanceof判断obj是否为Company类实例,名字是否相同
	 String比较用__.equals(__)
	 (Company)obj类型强制转换*/
	 public boolean equals(Object obj) {
	 	 if (obj instanceof Company) {
	   		return ((Company) obj).name.equals(this.name);
	 	 } else {
	   		return false;
	  	}
	 }
}
//Employee继承Person 
class Employee extends Person { 
	 private Company company;
	 private double salary;
	 
	 //构造函数Employee 
	 Employee(String name, int age, boolean gender, Company company, double salary) {
		  super(name, age, gender);
		  this.salary = salary;
		  this.company = company;
	}
	
	 //定义返回字符串格式,返回"Employee:person的toString-company-salary"格式的字符串
	 public String toString() {
	  	return "Employee:" + super.toString() + "-" + company.toString() + "-" + salary;
	 }
	 
	 /* 首先调用父类的equals方法->super.equals((Employee)obj),如果相等返回true,再比较company与salary。
	 instanceof判断obj是否为Employee类实例,stuNo是否相同,clazz是否相同
	 String比较用__.equals(__);(Employee)obj类型强制转换*  */
	 public boolean equals(Object obj) {
	  //对Employee的company属性的比较,要考虑传入为null的情况。如果company不为null但obj传入为null,返回false
	  	if (obj == null) {
	   		return false;
	  	}
	  	if (obj instanceof Employee) {
	   		Employee t = (Employee) obj;
	   		if (super.equals(obj)) {
	    			DecimalFormat p = new DecimalFormat("#.#");//数值按“#.#”格式输出,小数点后保留一位
	    			return t.company.equals(company) && p.format(t.salary).equals(p.format(salary));
	   		}
	   		return false;
	  		} else {
	   	return false;
	 	}
	 }
}
public class pta7_80306{ 
	 public static void main(String[] args) {
		  Scanner sc = new Scanner(System.in);  
		  List<Person> personList = new ArrayList<>(20);//定义动态列表personList,列表类型为Person,列表大小20
		  String m;
		  while (sc.hasNext()) {
			   m = sc.next();
			   int age;
			   boolean gender;
			   String name;
			   
			   /* 创建若干Student对象和Employee对象,输入除s和e之外符号退出创建
			   personList.add()将创建好的对象放入personList */
			   if ("s".equals(m)) {
				   name = sc.next();
				    age = sc.nextInt();
				    gender = sc.nextBoolean();
				    String stuNo = sc.next();
				    String clazz = sc.next();
				    personList.add(new Student(name, age, gender, stuNo, clazz));
		  	 } else if ("e".equals(m)) {
				    name = sc.next();
				    age = sc.nextInt();
				    gender = sc.nextBoolean();
				    double salary = sc.nextDouble();
				    String company = sc.next();
				    
		/* 对于String类型,如果为null则不创建对象,而赋值为null
	    对于company属性,如果为null则赋值为null,否则创建相应的Company对象。 */
	    
				    if ("null".equals(company)) {
				     	personList.add(new Employee(name, age, gender, new Company("null"), salary));
				    } else {
				     	personList.add(new Employee(name, age, gender, new Company(company), salary));
				    }
			} else {
			   	break;
			}
		}
	 /* 对personList中的元素实现先按照姓名升序排序,姓名相同再按照年龄升序排序
	  对于obj1.compareTo.obj2方法,obj>obj2,>0;obj1<obj2,<0*/  
		  personList.sort((obj1, obj2) -> {
		   	if (obj1.getString().compareTo(obj2.getString()) < 0) {
		    		return -1;
		   	} else if (obj1.getString().compareTo(obj2.getString()) > 0) {
		    		return 1;
		   	} else {
		    		return obj1.getAge() - obj2.getAge();
		  	}
		  });
		
		//输出排好后的personList
		  for (Person obj : personList) {
		   	System.out.println(obj.toString());
		  }
		  String sExit = "exit";
		  String sReturn = "return";
		  m = sc.next();
		  
	 /* 如果输入为exit则return退出程序,否则继续下面步骤
	  将personList中的元素按照类型分别放到stuList与empList */
		  if ((!sExit.equals(m) && !sReturn.equals(m))) {
			   List<Student> stuList = new ArrayList<>(20);
		   	   List<Employee> empList = new ArrayList<>(20);
			   for (Person now : personList) {
				    if (now instanceof Student) {
				     	if (!stuList.contains(now)) {
				     		stuList.add((Student) now);
				     	}
				    }
				    if (now instanceof Employee) {
				      	if (!empList.contains(now)) {
				       		empList.add((Employee) now);
				     	}
			     	   }
		    		}
		    		
 	/* 如果输入为exit则return退出程序,否则继续下面步骤
	  将personList中的元素按照类型分别放到stuList与empList */
		  if ((!sExit.equals(m) && !sReturn.equals(m))) {
			   List<Student> stuList = new ArrayList<>(20);
			   List<Employee> empList = new ArrayList<>(20);
			   for (Person now : personList) {
			    	if (now instanceof Student) {
				     if (!stuList.contains(now)) {
				     	stuList.add((Student) now);
				     }
				}
				if (now instanceof Employee) {
				    if (!empList.contains(now)) {
				       empList.add((Employee) now);
				      }
		    		}
		    	   }
		    }
	}
}

写在最后的话:很久以前写的作业了,运行结果随缘,忘记代码是否原创,但代码解释肯定原创,因为仅是个人拙见,有不同意见也欢迎评论。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值