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

定义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对象。

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

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

  4. 将personList中的元素按照类型分别放到stuListempList注意:不要将两个内容相同的对象放入列表(是否相同是根据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
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;
public class Main {
    public static void main(String[] args) throws InterruptedException {
       Scanner sc=new Scanner(System.in);
       List<Person> personList=new ArrayList<Person>();
       String name;
       int age;
       boolean gender;
       String stuNo;
       String clazz;
       String companyName;
       Company company;
       double salary;
       //输入
       while(true) {
    	   String t=sc.next();
    	   if(t.equals("s")) {
    		   name=sc.next();
    		   age=sc.nextInt();
    		   gender=sc.nextBoolean();
    		   stuNo=sc.next();
    		   clazz=sc.next();
    		   if(name==null||stuNo==null||clazz==null) {
    			   continue;
    		   }
    		   personList.add(new Student(name, age, gender, stuNo, clazz));
    		   
	       }else if(t.equals("e")){
	    	   name=sc.next();
    		   age=sc.nextInt();
    		   gender=sc.nextBoolean();
    		   salary=sc.nextDouble();
    		   companyName=sc.next();
    		   company=new Company(companyName);
    		   if(name==null) {
    			   continue;
    		   }
    		   //除了companyName可以为空,其他为空均不能创建对象(应该是这么理解吧)
    		   if(companyName==null) {
    			   companyName="null";   //为空的话要给他赋值为空(删了也能过 可能写了句废话 )
    		   }
	    	   personList.add(new Employee(name, age, gender, company, salary));
	       }else{         //要是遇到感叹号就该结束输入啦(题目上好像没说)
	    	   break;
	       }
	      
       }
        //排序(因为之前的类都建好了,Person类还是抽象类,所以比较器只能用Comparator了)
       Collections.sort(personList, new Name_AgeComparator());
      
       for(int i=0;i<personList.size();i++) {
    	   
    		   System.out.println(personList.get(i).toString()); 
    	  
       }
      //只要不输入return和exit就要分组啦
       String str=sc.next();
       while(true) {
    	   if(str.equals("return")||str.equals("exit")) {
    		   break;
    	   }else {
        	   //分组
               List<Person> stuList=new ArrayList<Person>();
               List<Person> empList=new ArrayList<Person>();
               //判断过程要根据equals 是自己定义的 所以比较工资那有坑,用contains是不行的 所以还是循环比较吧
               boolean flag1=true;
               boolean flag2=true;
               for(int i=0;i<personList.size();i++) {
            	   if(personList.get(i).toString().indexOf("Student")>=0) {
            		   if(stuList.size()==0) {
            			   stuList.add(personList.get(i));
            		   }
            		   for(int j=0;j<stuList.size();j++) {
            			   if(personList.get(i).equals(stuList.get(j))){
            				   flag1=false;
            			   }
            		   }
            		   if(flag1) {
            			   stuList.add(personList.get(i));
            			   
            		   }
            		   flag1=true;
            	   }else {
            		   if(empList.size()==0) {
            			   empList.add(personList.get(i));
            		   }
            		   for(int j=0;j<empList.size();j++) {
            			   if(personList.get(i).equals(empList.get(j))){
            				   flag2=false;
            			   }
            		   }
            		   if(flag2) {
            			   empList.add(personList.get(i));
            		   }
            		   flag2=true;
            	   }
               }
               System.out.println("stuList");
               for(int i=0;i<stuList.size();i++) {
            	   
        		   System.out.println(stuList.get(i).toString()); 
        	  
               }
               System.out.println("empList");
               for(int i=0;i<empList.size();i++) {
            	   
        		   System.out.println(empList.get(i).toString()); 
        	  
               }
               break;
           } 
    	   }

       
       
    }
    //Comparator需要创建一个类,又因为想在main方法里直接调,所以就要用static修饰
    static class Name_AgeComparator implements Comparator<Person>{  //不加这个泛型也可以,但以后要强制转换

		@Override
		public int compare(Person o1, Person o2) {
			 if(o1.name.compareTo(o2.name)==0) {
				if(o1.age==o2.age) {
					return 0;
				}else if(o1.age<o2.age) {
					return -1;
				}else {
					return 1;
				}
			}else {
				//比较字符串的方法(放张图片吧)
				return(o1.name.compareTo(o2.name));
			}
		}
    	
    }
    
    
}
abstract class Person{
	String name;
	int age;
	boolean gender;
	public Person(String name, int age, boolean gender) {
		super();
		this.name = name;
		this.age = age;
		this.gender = gender;
	}
	@Override
	public String toString() {
		
		return this.name+'-'+String.valueOf(this.age)+'-'+String.valueOf(this.gender);
	}
	@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;
		if (age != other.age)
			return false;
		if (gender != other.gender)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}
	
}
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.clazz=clazz;
		this.stuNo=stuNo;
	}
	@Override
	public String toString() {
		return"Student:"+ super.toString()+'-'+this.stuNo+'-'+this.clazz;
	}
	@Override
	public boolean equals(Object obj) {
		if (!super.equals(obj))
			return false;
		if (this == obj)
			return true;
		if (getClass() != obj.getClass())
			return false;
		Student other = (Student) obj;
		if (clazz == null) {
			if (other.clazz != null)
				return false;
		} else if (!clazz.equals(other.clazz))
			return false;
		if (stuNo == null) {
			if (other.stuNo != null)
				return false;
		} else if (!stuNo.equals(other.stuNo))
			return false;
		return true;
	}
	
	
}
class Company{
	String name;
	public Company(){
		
	}
	public Company(String name) {
		this.name = name;
	}
	@Override
	public String toString() {
		return 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;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}
	
	
}
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+'-'+salary;
	}
	@Override
	public boolean equals(Object obj) {
		if (!super.equals(obj))
			return false;
		if (this == obj)
			return true;
		if (getClass() != obj.getClass())
			return false;
		Employee other = (Employee) obj;
		if (company == null) {
			if (other.company != null)
				return false;
		} 
		else if (!company.equals(other.company))
			return false;
		//坑在这啊,要用decimal比较,要学会decimal这种用法
		DecimalFormat df = new DecimalFormat("#.#");
		if (!df.format(salary) .equals( df.format(other.salary)))
			return false;
		return true;
	}
	
	
	
	
}

在这里插入图片描述

### 回答1: 这是一个综合练习,涉及到四个类:PersonStudentEmployeeCompany,主要是关于继承覆盖的知识。 Person类是一个基类,包含了姓名、年龄、性别等基本信息,StudentEmployee类都继承Person类,别表示学生和员工,它们都有自己的特定属性和方法。Company类表示公司,包含了若干个员工,可以进行员工的招聘、解雇、查询等操作。 在这个练习中,需要实现以下功能: 1. 定义Person类,包含姓名、年龄、性别等属性和get/set方法。 2. 定义Student类,继承Person类,包含学号、专业等属性和get/set方法。 3. 定义Employee类,继承Person类,包含工号、职位等属性和get/set方法。 4. 定义Company类,包含员工列表、招聘、解雇、查询等方法。 5. 在Company类中,实现招聘方法,可以向员工列表中添加新员工。 6. 在Company类中,实现解雇方法,可以从员工列表中删除指定员工。 7. 在Company类中,实现查询方法,可以根据员工的姓名、工号等信息查询员工。 以上就是这个综合练习的主要内容,通过实现这些功能,可以加深对继承覆盖的理解,同时也可以提高面向对象编程的能力。 ### 回答2: 这四个类涵盖了人、学生、员工和公司四个角色,运用了继承覆盖的知识,展现了面向对象编程的核心思想:封装、继承和多态。 首先,我们需要了解什么是继承继承面向对象编程中的一种关系,它可以让一个类继承另一个类的属性和方法。在这四个类中,Person作为基类,包含了所有人都有的属性和方法,如姓名、性别、年龄、自我介绍等等;而子类StudentEmployee继承Person类的属性和方法,并且添加了自己特有的属性和方法,如学号、班级、职位、薪水等等。 接着,我们需要了解什么是覆盖覆盖也是一种面向对象编程中的关系,它可以让子类重新定义父类中已有的方法或属性。在这个例子中,我们可以发现Student类中重新定义了父类中的自我介绍方法,并且覆盖了父类原有的自我介绍方法。这样做可以让Student类表现出自己的特点,而不是简单的复制父类的方法。 最后,我们需要了解面向对象编程的核心思想:封装、继承和多态。封装可以让类的内部数据和方法隐藏起来,只留下对外的公共接口。继承可以让类之间建立联系,共享代码和数据。多态可以让子类在继承父类的同时,通过覆盖和重载方法,表现出自己的特点。这些思想共同构成了面向对象编程的核心,让代码变得更加简洁、易于维护,并且有着强大的扩展性。 在实际应用中,我们可以根据不同的需求,设计出不同的类和继承关系,运用覆盖和多态,提高代码的效率和可读性。同时,我们还需要注意代码的可维护性和可扩展性,遵循面向对象编程的规范和原则,使代码更加健壮和可靠。 ### 回答3: 7-1 jmu-java-03面向对象-06-继承覆盖综合练习-personstudentemployeecompany是一道针对Java编程的题目,主要考察面向对象继承覆盖及多态等相关知识。在这道题目中,我们需要设计一个类Person,然后通过继承Person类来创建StudentEmployee两个子类,最后再构建一个类Company,通过聚合Employee来实现一个公司的信息管理系统。 首先,我们需要定义一个Person类,这个类可以包含一些基本的属性和方法,比如姓名、年龄、性别等属性,以及打印个人信息的方法。接着,我们可以通过继承Person类来创建Student类和Employee类。由于在Person类中已经定义了一些基本的属性和方法,因此我们只需要在StudentEmployee类中添加一些与学生和员工相关的特定属性和方法即可。 然后,我们需要创建一个Company类,这个类可以通过聚合Employee类来实现对公司员工的管理。在Company类中,我们可以定义一些方法来实现对员工信息的增删改查等操作。这些方法可以通过调用Employee类中已经定义好的方法来实现。同时,为了方便操作,我们可以在Employee类中添加一些get和set方法,以便在Company类中调用。 整个题目的思路其实非常简单,通过继承覆盖来实现类与类之间的关联,通过聚合来实现对多个类的管理。这些思想都是面向对象编程语言中的核心概念,掌握好这些概念,能够让我们更加熟练地操作面向对象编程,写出高质量的代码。同时,这道题目也是对我们面向对象编程能力的一次综合考察,能够让我们更好地发现自身的不足,从而进一步提升个人的编程水平。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值