Java面向对象实践--开发团队调度软件,2024年最新mysql复合索引面试题

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

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

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

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
img

正文

  • Employee对象

  • Programmer

  • Designer

  • Architect

  • NameListService

  • TeamException

  • TeamService

  • 视图TeamView

  • 测试类

  • 实现效果

  • 四、项目总结

      • 1.获取数据,封装数据
  • 2.提供增删改查功能对数组

  • 3.提供视图

  • 4.学习总结

前言

=================================================================

这几天又把Java基础部分给复习了一遍,尝试跟着视频做了一个开发团队调度软件。

感觉Java基础还是不够扎实,还要继续努力学习,不断的实践才行!!!

开发团队调度软件

=======================================================================

一、需求说明

=====================================================================

1.添加成员


当选择**“添加团队成员”**菜单时,将执行从列表中添加指定(通过ID)成员到开发团队的功能:

1-团队列表2-添加团队成员3-删除团队成员4-退出请选择(1-4) : 2

--------------------添加成员---------------------------------

请输入要添加的员工ID: 2

添加成功

按回车键继续…

2.开发团队人员组成要求


​ 最多一名架构师

​ 最多两名设计师

​ 最多三名程序员

3.添加失败显示原因


如果添加操作因某种原因失败,将显示类似以下信息(失败原因视具体原因而不同) :

1-团队列表2-添加团队成员3-删除团队成员4-退出请选择(1-4): 2

----------------添加成员------------------

请输入要添加的员工ID: 2

添加失败,原因:该员工已是某团队成员

按回车键继续…

失败信息包含以下几种:

成员已满,无法添加

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

该员工已在本开发团队中

该员工已是某团队成员

该员正在休假,无法添加

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

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

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

二、软件设计架构

=======================================================================

TeamView模块为主控模块

TeamService模块为实体对象(Employee及其子类如程序员等)的管理模块

NameListService和TeamService类分别用各自的数组来管理公司员工和开发团队成员对象

domain模块为Employee及其子类等JavaBean类所在的包

team.domain模块中包含了所有实体类

image-20211108105335312

其中程序员(Programmer)及其子类,均会领用某种电子设备(Equipment)

Equipment接口及其实现子类的设计


image-20211108110300360

Employee类及其子类的设计


image-20211109102001121

Status类


用来封装员工的状态,busy和free

NameListService类的设计


employees用来保存公司所有员工对象

功能:负责将Data中的数据封装到Employee[]数组中,同时提供相关操作Employee[]的方法。

说明:

getAllEmployees ()方法:获取当前所有员工。

返回:包含所有员工对象的数组

getEmployee(id : int)方法:获取指定ID的员工对象。

参数:指定员工的ID

返回:指定员工对象

异常:找不到指定的员工

TeamService类的设计


image-20211109102146737

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

counter为静态变量,用来为开发团队新增成员自动生成团队中的唯一ID,即memberId。(提示:应使用增1的方式)

MAX_MEMBER:表示开发团队最大成员数

team数组:用来保存当前团队中的各成员对象

total:记录团队成员的实际人数

TeamView类的设计


listSvc和teamSvc属性:供类中的方法使用

enterMainMenu ()方法:主界面显示及控制方法。

以下方法仅供enterMainMenu()方法调用:

listAllEmployees ()方法:以表格形式列出公司所有成员

getTeam()方法:显示团队成员列表操作

addMember ()方法:实现添加成员操作

deleteMember ()方法:实现删除成员操作

三、代码实现

=====================================================================

项目结构


image-20211109102553828

工具类


用来读取键盘的输入

package com.caq.team.view;

import java.util.Scanner;

/**

  • @ClassName TSUtility01

  • @Description 工具类,用来读取用户的输入

  • @Author Jack

  • @Date 2021/11/8 8:01

  • @Version 1.0

*/

public class TSUtility {

//System.in作为参数传递给Scanner的构造函数,使Scanner用键盘作为输入,然后用new在内存中实例化一个Scanner出来,使得其它变量能调用这块内存区。

private static Scanner scan = new Scanner(System.in);

/**

  • 用来接受用户输入的方法

  • @param limit

  • @param blackReturn

  • @return

*/

private static String readKeyBoard(int limit, boolean blackReturn) {

String line = “”;

while (scan.hasNext()) {

line = scan.nextLine();

if (line.length() == 0) {

if (blackReturn) {

return line;

} else continue;

}

if (line.length() < 1 || line.length() > limit) {

System.out.println(“输入长度不大于(不大于” + limit + “)” + “请重新输入”);

continue;

}

break;

}

return line;

}

/**

  • 读取菜单中的选项

  • @return 1,2,3,4数字

*/

public static char readMenuSelection() {

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 表示员工的状态

面试资料整理汇总

成功从小公司跳槽进蚂蚁定级P7,只因刷了七遍这些面试真题

成功从小公司跳槽进蚂蚁定级P7,只因刷了七遍这些面试真题

这些面试题是我朋友进阿里前狂刷七遍以上的面试资料,由于面试文档很多,内容更多,没有办法一一为大家展示出来,所以只好为大家节选出来了一部分供大家参考。

面试的本质不是考试,而是告诉面试官你会做什么,所以,这些面试资料中提到的技术也是要学会的,不然稍微改动一下你就凉凉了

在这里祝大家能够拿到心仪的offer!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
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 表示员工的状态

面试资料整理汇总

[外链图片转存中…(img-VBRNAYMy-1713259877871)]

[外链图片转存中…(img-AAy3srjf-1713259877872)]

这些面试题是我朋友进阿里前狂刷七遍以上的面试资料,由于面试文档很多,内容更多,没有办法一一为大家展示出来,所以只好为大家节选出来了一部分供大家参考。

面试的本质不是考试,而是告诉面试官你会做什么,所以,这些面试资料中提到的技术也是要学会的,不然稍微改动一下你就凉凉了

在这里祝大家能够拿到心仪的offer!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-dofTohii-1713259877872)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值