Java面向对象实践--开发团队调度软件

char c;

for (; ; ) {

String str = readKeyBoard(1, false);

c = str.charAt(0);

if (c != ‘1’ && c != ‘2’ && c != ‘3’ && c != ‘4’){

System.out.println(“输入错误,请重新输入”);

}else break;

}

return c;

}

/**

  • 提升并等待,直到用户按回车后返回

*/

public static void readReturn(){

System.out.println(“按回车继续…”);

readKeyBoard(100,true);

}

/**

  • 读取字符串,将字符串转化为int类型的数

  • @return 一个整数

*/

public static int readInt(){

int n;

for (;😉{

String str = readKeyBoard(2,false);

// parseInt(String s) 将字符串参数解析为带符号的十进制整数。

try {

n = Integer.parseInt(str);

break;

}catch (NumberFormatException e){

System.out.println(“数字输入错误,请重新输入”);

}

}

return n;

}

/**

  • 从键a盘读取Y和N,并将其作为返回值

  • @return

*/

public static char readConfirmSelection(){

char c;

for (;😉{

String str = readKeyBoard(1,false);

c = str.charAt(0);

if (c == ‘Y’ || c == ‘N’){

break;

}else {

System.out.println(“请输入Y或N!”);

}

}

return c;

}

}

Data类


存放用户的信息

package com.caq.team.service;

public class Data {

//一些常量

public static final int EMPLOYEE = 10;

public static final int PROGRAMMER = 11;

public static final int DESIGNER = 12;

public static final int ARCHITECT = 13;

public static final int PC = 21;

public static final int NOTEBOOK = 22;

public static final int PRINTER = 23;

//Employee : 10, id, name, age, salary

//Programmer: 11, id, name, age, salary

//Designer : 12, id, name, age, salary, bonus(分红)

//Architect : 13, id, name, age, salary, bonus, stock(股票)

//定义二维数组,用来存放职员信息

//格式为:二维数组存放数据类型[][] 数组名 = {{},{},{}…}

public static final String[][] EMPLOYEES = {

{“10”, “1”, “马云云”, “22”, “3000”},

{“13”, “2”, “马化腾”, “32”, “18000”, “15000”, “2000”},

{“11”, “3”, “李彦宏”, “23”, “7000”},

{“11”, “4”, “刘强东”, “24”, “7300”},

{“12”, “5”, “雷军军”, “28”, “10000”, “5000”},

{“11”, “6”, “任志强”, “22”, “6800”},

{“12”, “7”, “柳传志”, “29”, “10800”,“5200”},

{“13”, “8”, “杨元庆”, “30”, “19800”, “15000”, “2500”},

{“12”, “9”, “史玉柱”, “26”, “9800”, “5500”},

{“11”, “10”, “丁磊磊”, “21”, “6600”},

{“11”, “11”, “张朝阳”, “25”, “7100”},

{“12”, “12”, “杨致远”, “27”, “9600”, “4800”}

};

//如下的EQUIPMENTS数组与上面的EMPLOYEES数组元素一一对应

//PC :21, model, display

//NoteBook:22, model, price

//Printer :23, name, type

public static final String[][] EQUIPMENTS = {

{},

{“22”, “联想T4”, “6000”},

{“21”, “戴尔”, “NEC17寸”},

{“21”, “戴尔”, “三星 17寸”},

{“23”, “佳能 2900”, “激光”},

{“21”, “华硕”, “三星 17寸”},

{“21”, “华硕”, “三星 17寸”},

{“23”, “爱普生20K”, “针式”},

{“22”, “惠普m6”, “5800”},

{“21”, “戴尔”, “NEC 17寸”},

{“21”, “华硕”,“三星 17寸”},

{“22”, “惠普m6”, “5800”}

};

}

Equipment接口


package com.caq.team.domain;

public interface Equipment {

//接口中的方法默认修饰为public abstract,可省略

String getDescription();

}

PC

实现Equipment接口,返回PC的信息

package com.caq.team.domain;

public class PC implements Equipment{

private String model;

private String display;

public PC() {

}

public PC(String model, String display) {

this.model = model;

this.display = display;

}

public String getModel() {

return model;

}

public void setModel(String model) {

this.model = model;

}

public String getDisplay() {

return display;

}

public void setDisplay(String display) {

this.display = display;

}

@Override

public String getDescription() {

return model + “(” + display + “)”;

}

}

Printer

实现Equipment接口,返回Printer的信息

package com.caq.team.domain;

/**

  • @ClassName Printer

  • @Description TODO

  • @Author Jack

  • @Date 2021/11/8 11:11

  • @Version 1.0

*/

public class Printer implements Equipment {

private String name;

private String type;

public Printer() {

}

public Printer(String name, String type) {

this.name = name;

this.type = type;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getType() {

return type;

}

public void setType(String type) {

this.type = type;

}

@Override

public String getDescription() {

return name + “(” + type + “)”;

}

}

NoteBook

实现Equipment接口,返回NoteBook的信息

package com.caq.team.domain;

public class NoteBook implements Equipment {

private String model; //机器型号

private double price; //价格

public NoteBook() {

}

public NoteBook(String model, double price) {

this.model = model;

this.price = price;

}

public String getModel() {

return model;

}

public void setModel(String model) {

this.model = model;

}

public double getPrice() {

return price;

}

public void setPrice(double price) {

this.price = price;

}

@Override

public String getDescription() {

return model + “(” + price + “)”;

}

}

Employee对象


将Data类中数组的数据取出,封装到对象中

package com.caq.team.domain;

/**

  • @ClassName Employee

  • @Description TODO

  • @Author Jack

  • @Date 2021/11/8 11:15

  • @Version 1.0

*/

public class Employee {

private int id;

private String name;

private int age;

private double salary;

public Employee() {

}

public Employee(int id, String name, int age, double salary) {

this.id = id;

this.name = name;

this.age = age;

this.salary = salary;

}

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public double getSalary() {

return salary;

}

public void setSalary(double salary) {

this.salary = salary;

}

public String getDetails(){

return id + “\t” + name + “\t” + age + “\t” + salary;

}

@Override

public String toString() {

return getDetails();

}

}

Programmer


Employee的子类,有自己的属型和方法

package com.caq.team.domain;

import com.caq.team.service.Status;

/**

  • @ClassName Programmer

  • @Description TODO

  • @Author Jack

  • @Date 2021/11/8 11:17

  • @Version 1.0

*/

public class Programmer extends Employee {

private int memberId; //开发团队中的id

private Status status = Status.FREE;

private Equipment equipment;

public Programmer() {

}

public Programmer(int id, String name, int age, double salary, Equipment equipment) {

super(id, name, age, salary);

this.equipment = equipment;

}

public int getMemberId() {

return memberId;

}

public void setMemberId(int memberId) {

this.memberId = memberId;

}

public Status getStatus() {

return status;

}

public void setStatus(Status status) {

this.status = status;

}

public Equipment getEquipment() {

return equipment;

}

public void setEquipment(Equipment equipment) {

this.equipment = equipment;

}

@Override

public String toString() {

return getDetails() + “\t程序员\t” + status + “\t\t\t” + equipment.getDescription();

}

public String getTeamBaseDetails() {

return memberId + “/” + getId() + “\t” + getName() + “\t” + getAge() + “\t” + getSalary();

}

//2/6 任志强 22 6800.0 程序员

public String getDetailsForTeam() {

return getTeamBaseDetails() + “\t程序员”;

}

}

Designer


同上

package com.caq.team.domain;

/**

  • @ClassName Designer

  • @Description TODO

  • @Author Jack

  • @Date 2021/11/8 11:38

  • @Version 1.0

*/

public class Designer extends Programmer{

private double bonus;//奖金

public Designer() {

}

public Designer(int id, String name, int age, double salary, Equipment equipment, double bonus) {

super(id, name, age, salary, equipment);

this.bonus = bonus;

}

public double getBonus() {

return bonus;

}

public void setBonus(double bonus) {

this.bonus = bonus;

}

@Override

public String toString() {

return getDetails() + “\t设计师\t” + getStatus() + “\t” + bonus + “\t\t” + getEquipment().getDescription();

}

public String getDetailsForTeam() {

return getTeamBaseDetails() + “\t设计师\t” + getBonus();

}

}

Architect


package com.caq.team.domain;

/**

  • @ClassName Architect

  • @Description TODO

  • @Author Jack

  • @Date 2021/11/8 11:41

  • @Version 1.0

*/

public class Architect extends Designer{

private int stock;//股票

public Architect() {

}

public Architect(int id, String name, int age, double salary, Equipment equipment, double bonus, int stock) {

super(id, name, age, salary, equipment, bonus);

this.stock = stock;

}

public int getStock() {

return stock;

}

public void setStock(int stock) {

this.stock = stock;

}

@Override

public String toString() {

return getDetails() + “\t架构师\t” + getStatus() + “\t” + getBonus() + “\t” + stock + “\t” + getEquipment().getDescription();

}

public String getDetailsForTeam() {

return getTeamBaseDetails() + “\t架构师\t” + getBonus() + “\t” + getStock();

}

}

NameListService


package com.caq.team.service;

import com.caq.team.domain.*;

import static com.caq.team.service.Data.*;

/**

  • @ClassName NameListService

  • @Description 负责将data中的数据封装到Employee[]数组中,同时提供相关操作Employee[]的方法

  • @Author Jack

  • @Date 2021/11/8 11:46

  • @Version 1.0

*/

public class NameListService {

private Employee[] employees;

/**

  • 给employees及数组元素进行初始化

*/

public NameListService() {

//根据项目提供的Data类构建相应大小的employees数组

//再根据Data类中的数据构建不同的对象,包括Employee、Programmer、Designer和Architect对象,以及相关联的Equipment子类的对象

//将对象存于数组中

//Data类位于com.caq.team.service包中

employees = new Employee[EMPLOYEES.length];

/**

  • 程序解析

  • 通过一个循环来获取数组中的信息

  • 用到了包装类的常用操作,以及常用的结构

  • 通过包装类的方法将字符转化为想要的基本数据类型,与前面定义的常量通过switch结构进行匹配,

  • 对应的数字代表一种对象类型(EMPLOYEE,PROGRAMMER,DESIGNER,ARCHITECT),不同的对象有不同装备的方法,

  • 也是用switch结构进行匹配,对应的数字有特殊的Equipment匹配过后返回一个Equipment对象作为

  • (EMPLOYEE,PROGRAMMER,DESIGNER,ARCHITECT)的参数一同加入数组employees中.

  • 最后提供了相关操作Employee[]的方法

*/

for (int i = 0; i < employees.length; i++) {

//获取员工信息

int type = Integer.parseInt(EMPLOYEES[i][0]);

//获取Employee的4个基本信息

int id = Integer.parseInt(EMPLOYEES[i][1]);

String name = EMPLOYEES[i][2];

int age = Integer.parseInt(EMPLOYEES[i][3]);

double salary = Integer.parseInt(EMPLOYEES[i][4]);

Equipment equipment;

double bonus;

int stock;

switch (type) {

case EMPLOYEE:

employees[i] = new Employee(id, name, age, salary);

break;

case PROGRAMMER:

equipment = createEquipment(i);

employees[i] = new Programmer(id, name, age, salary, equipment);

break;

case DESIGNER:

equipment = createEquipment(i);

bonus = Double.parseDouble(EMPLOYEES[i][5]);

employees[i] = new Designer(id, name, age, salary, equipment, bonus);

break;

case ARCHITECT:

equipment = createEquipment(i);

bonus = Double.parseDouble(EMPLOYEES[i][5]);

stock = Integer.parseInt(EMPLOYEES[i][6]);

employees[i] = new Architect(id, name, age, salary, equipment, bonus, stock);

break;

}

}

}

/**

  • 获取指定index上员工的位置

  • @param index

  • @return

*/

private Equipment createEquipment(int index) {

//找到EQUIPMENT数组中的type和model类型,并把它转换为int类型

int key = Integer.parseInt(EQUIPMENTS[index][0]);

String modelOrName = EQUIPMENTS[index][1];

switch (key) {

case PC://21

String display = EQUIPMENTS[index][2];

return new PC(modelOrName, display);

case NOTEBOOK://22

double price = Double.parseDouble(EQUIPMENTS[index][2]);

return new NoteBook(modelOrName, price);

case PRINTER://23

String type = EQUIPMENTS[index][2];

return new Printer(modelOrName, type);

}

return null;

}

/**

  • 获取当前所有员工

*/

public Employee[] getAllEmployees() {

return employees;

}

/**

  • 获取指定ID的员工对象。

  • @param id

  • @return

  • @throws TeamException

*/

public Employee getEmployee(int id) throws TeamException {

for (int i = 0; i < employees.length; i++) {

if (employees[i].getId() == id) {

return employees[i];

}

}

throw new TeamException(“找不到指定的员工”);

}

}

status类

表示员工的状态

package com.caq.team.service;

/**

  • @ClassName Status

  • @Description 表示员工的状态

  • @Author Jack

  • @Date 2021/11/8 11:22

  • @Version 1.0

*/

public class Status {

private final String NAME;

private Status(String name) {

this.NAME = name;

}

public static final Status FREE = new Status(“FREE”);

public static final Status BUSY = new Status(“BUSY”);

public static final Status VOCATION = new Status(“VOCATION”);

//只能有get方法了,因为上面是常量

public String getNAME() {

return NAME;

}

@Override

public String toString() {

return NAME;

}

}

TeamException


TeamException

package com.caq.team.service;

/**

  • @ClassName TeamException

  • @Description TODO

  • @Author Jack

  • @Date 2021/11/8 22:09

  • @Version 1.0

*/

public class TeamException extends Exception {

static final long serialVersionUID = -3387514229948L;

public TeamException() {

super();

}

public TeamException(String msg) {

super(msg);

}

}

TeamService


关于开发团队成员的管理:添加、删除等。

package com.caq.team.service;

import com.caq.team.domain.Architect;

import com.caq.team.domain.Designer;

import com.caq.team.domain.Employee;

import com.caq.team.domain.Programmer;

import com.caq.team.service.Status;

import com.caq.team.service.TeamException;

/**

  • 关于开发团队成员的管理:添加、删除等。

*/

public class TeamService {

private static int counter = 1;//给memberId赋值使用

private final int MAX_MEMBER = 5;//限制开发团队的人数

private Programmer[] team = new Programmer[MAX_MEMBER];//保存开发团队成员

private int total;//记录开发团队中实际的人数

public TeamService() {

super();

}

/**

  • 获取开发团队中的所有成员

  • @return

*/

public Programmer[] getTeam(){

Programmer[] team = new Programmer[total];

for(int i = 0;i < team.length;i++){

team[i] = this.team[i];

}

return team;

}

/**

  • 将指定的员工添加到开发团队中

  • @param e

  • @throws TeamException

*/

public void addMember(Employee e) throws TeamException {

// 成员已满,无法添加

if(total >= MAX_MEMBER){

throw new TeamException(“成员已满,无法添加”);

}

// 该成员不是开发人员,无法添加

if(!(e instanceof Programmer)){

throw new TeamException(“该成员不是开发人员,无法添加”);

}

// 该员工已在本开发团队中

if(isExist(e)){

throw new TeamException(“该员工已在本开发团队中”);

}

// 该员工已是某团队成员

// 该员正在休假,无法添加

Programmer p = (Programmer)e;//一定不会出现ClassCastException

if(“BUSY”.equalsIgnoreCase(p.getStatus().getNAME())){//if(p.getStatus().getNAME().equals(“BUSY”)){

throw new TeamException(“该员工已是某团队成员”);

}else if(“VOCATION”.equalsIgnoreCase(p.getStatus().getNAME())){

throw new TeamException(“该员正在休假,无法添加”);

}

// 团队中至多只能有一名架构师

// 团队中至多只能有两名设计师

// 团队中至多只能有三名程序员

//获取team已有成员中架构师,设计师,程序员的人数

int numOfArch = 0,numOfDes = 0,numOfPro = 0;

for(int i = 0;i < total;i++){

if(team[i] instanceof Architect){

numOfArch++;

}else if(team[i] instanceof Designer){

numOfDes++;

}else if(team[i] instanceof Programmer){

numOfPro++;

}

}

//正确的

if(p instanceof Architect){

if(numOfArch >= 1){

throw new TeamException(“团队中至多只能有一名架构师”);

}

}else if(p instanceof Designer){

if(numOfDes >= 2){

throw new TeamException(“团队中至多只能有两名设计师”);

}

}else if(p instanceof Programmer){

if(numOfPro >= 3){

throw new TeamException(“团队中至多只能有三名程序员”);

}

}

//错误的

// if(p instanceof Architect && numOfArch >= 1){

// throw new TeamException(“团队中至多只能有一名架构师”);

// }else if(p instanceof Designer && numOfDes >= 2){

// throw new TeamException(“团队中至多只能有两名设计师”);

// }else if(p instanceof Programmer && numOfPro >= 3){

// throw new TeamException(“团队中至多只能有三名程序员”);

// }

//将p(或e)添加到现有的team中

team[total++] = p;

//p的属性赋值

p.setStatus(Status.BUSY);

p.setMemberId(counter++);

}

/**

  • 判断指定的员工是否已经存在于现有的开发团队中

  • @param e

  • @return

*/

private boolean isExist(Employee e) {

for(int i = 0;i < total;i++){

return team[i].getId() == e.getId();

}

return false;

}

/**

  • 从团队中删除成员
    

*/

public void removeMember(int memberId) throws TeamException {

int i = 0;

for(;i < total;i++){

if(team[i].getMemberId() == memberId){

team[i].setStatus(Status.FREE);

break;

}

}

//未找到指定memberId的情况

if(i == total){

throw new TeamException(“找不到指定memberId的员工,删除失败”);

}

//后一个元素覆盖前一个元素,实现删除操作

for(int j = i + 1;j < total;j++){

team[j - 1] = team[j];

}

//写法一:

// team[total-1] = null;

// total–;

//写法二:

team[–total] = null;

}

}

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

总结

面试建议是,一定要自信,敢于表达,面试的时候我们对知识的掌握有时候很难面面俱到,把自己的思路说出来,而不是直接告诉面试官自己不懂,这也是可以加分的。

以上就是蚂蚁技术四面和HR面试题目,以下最新总结的最全,范围包含最全MySQL、Spring、Redis、JVM等最全面试题和答案,仅用于参考

一份还热乎的蚂蚁金服面经(已拿Offer)面试流程4轮技术面+1轮HR

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!
是否已经存在于现有的开发团队中

  • @param e

  • @return

*/

private boolean isExist(Employee e) {

for(int i = 0;i < total;i++){

return team[i].getId() == e.getId();

}

return false;

}

/**

  • 从团队中删除成员
    

*/

public void removeMember(int memberId) throws TeamException {

int i = 0;

for(;i < total;i++){

if(team[i].getMemberId() == memberId){

team[i].setStatus(Status.FREE);

break;

}

}

//未找到指定memberId的情况

if(i == total){

throw new TeamException(“找不到指定memberId的员工,删除失败”);

}

//后一个元素覆盖前一个元素,实现删除操作

for(int j = i + 1;j < total;j++){

team[j - 1] = team[j];

}

//写法一:

// team[total-1] = null;

// total–;

//写法二:

team[–total] = null;

}

}

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。[外链图片转存中…(img-LimC4Eob-1712134398788)]

[外链图片转存中…(img-KxBQ8o9H-1712134398788)]

[外链图片转存中…(img-zwOw4m5C-1712134398788)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

总结

面试建议是,一定要自信,敢于表达,面试的时候我们对知识的掌握有时候很难面面俱到,把自己的思路说出来,而不是直接告诉面试官自己不懂,这也是可以加分的。

以上就是蚂蚁技术四面和HR面试题目,以下最新总结的最全,范围包含最全MySQL、Spring、Redis、JVM等最全面试题和答案,仅用于参考

[外链图片转存中…(img-PIZqn2Ze-1712134398789)]

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!

  • 30
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值