面向对象-封装
现实生活中的封装
在现实生活中有很多封装的案例,例如:手机、电脑等等都是属于封装。
对于手机的封装:
- 首先是对手机部件的封装,给他们一个坚硬的外壳,保证内部部件的安全;
- 还有的就是对他们功能的封装,对于手机的某个功能例如计算器,我们并不需要直到这个计算器的计算功能是如何实现的,只需要知道怎么去使用这个计算功能即可。
封装有什么作用
- 保证内部结构安全
- 屏蔽复杂,暴露简单(对功能的封装)
在代码中封装的作用
在一个类体中的数据,假设对代码进行封装后,对于代码的调用者来说是方便的,调用者不需要考虑这个代码的具体实现,只需要有一个简单的操作入口便能使用这个代码的功能(例如:java.util.Arrays这个工具类中有一个sort方法,可以对数组进行排序,这里我们并不需要考虑排序功能是如何实现的,只需要会使用这个sort方法便能使用数组排序的功能);对于类体中安全级别较高的数据,可以使用封装使外部人员不能访问,保证数据安全。
对属性进行封装
- 将类中的属性私有化(每个属性都使用private修饰)
- 对外提供简单的操作入口(为每一个属性都定义一对Setter/Getter方法)
public class Test {
public static void main(String[] args){
Student stu1 = new Student();
stu1.setNo(1);
stu1.setName("张三");
stu1.setGender('男');
stu1.setAge(12);
System.out.println("学号:" + stu1.getNo() + ",姓名:" + stu1.getName() + ",性别:" + stu1.getGender() + ",年龄:" + stu1.getAge());
}
}
class Student {
private int no; //学号
private String name; //姓名
private char gender; //性别
private int age; //年龄
//学号的Setter/Getter方法
public void setNo(int no) {
this.no = no;
}
public int getNo() {
return this.no;
}
//姓名的Setter/Getter方法
public void setName(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
//性别的Setter/Getter方法
public void setGender(char gender) {
this.gender = gender;
}
public char getGender () {
return this.gender;
}
//年龄的Setter/Getter方法
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return this.age;
}
}
对于年龄属性的设置可以通过Setter方法设置一个关卡,用于过滤所有年龄不合法的数据。
//年龄的Setter/Getter方法
public void setAge(int age) {
if(age <= 0 || age >=120) {
System.out.println(“您的年龄不合法,请重新赋值”);
} else {
this.age = age;
}
}
对员工管理系统进行封装
import java.util.Scanner;
class Employee {
private int no; //员工编号
private String name; //员工姓名
//Constructor
public Employee(){}
public Employee(int no,String name) {
this.no = no;
this.name = name;
}
//Getter Setter
public void setNo(int no) {
this.no = no;
}
public int getNo() {
return no;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
class User{
String userName; //用户名
String password; //密码
//Constructor
public User(){}
public User(String userName, String password){
this.userName = userName;
this.password = password;
}
//Getter Setter
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserName() {
return userName;
}
public void setPassword(String password) {
this.password = password;
}
public String getPassword() {
return password;
}
}
public class Test2 {
static User[] users = new User[2]; //用户数组
static Employee[] emps = new Employee[2]; //员工数组
static int userNum = 0; //用户总数
static boolean isLogin = false; //登录状态
static int empNo = 1000; //员工编号
static int empSum = 0; //员工人数
//注册用户,注册成功返回true,注册失败返回false
public static boolean register(String userName,String password) {
//超出扩容
if(userNum >= users.length) userExpansion();
User user = findUser(userName);
//用户名不能相同
if(user == null) {
//将用户名和密码给User对象,并将这个user对象放到users数组中
users[userNum++] = new User(userName,password);
return true;
}
return false;
}
//登录用户,登录成功返回true,登录失败返回false
public static boolean login(String userName, String password) {
User user = findUser(userName);
if(user != null) { //找到了
if(password.equals(user.getPassword())) {
return true;
}
}
return false;
}
//增加员工
public static void addEmployee(String name) {
//超出扩容
if(empSum >= emps.length) employeeExpansion();
//赋值并更新
emps[empSum++] = new Employee(++empNo,name);
}
//查询所有员工
public static void selectedEmployee() {
//查询所有员工
if(emps[0] == null) System.out.println("没有任何员工");
for(Employee emp : emps) {
if(emp == null) break;
System.out.println("员工编号:" + emp.getNo() + "\t员工姓名:" + emp.getName());
}
}
//根须员工编号查询
public static void selectedEmployee(int no) {
//查询单个员工
Employee emp = findEmployee(no);
if(emp == null) System.out.println("不存在该员工");
else System.out.println("员工编号:" + emp.getNo() + "\t员工姓名:" + emp.getName());
}
//通过用户名寻找用户
public static User findUser(String userName) {
for(User user : users) {
if(user == null) break;
if(userName.equals(user.getUserName())) {
return user;
}
}
return null;
}
//通过员工编号寻找员工
public static Employee findEmployee(int no) {
for(Employee emp : emps) {
if(emp == null) break;
if(no == emp.getNo()) {
return emp;
}
}
return null;
}
//通过员工编号找到员工对象所在数组的索引值,找不到返回-1
private static int indexOf(int no) {
for(int i=0; i<emps.length; i++) {
if(emps[i].getNo() == no) {
return i;
}
}
return -1;
}
//通过员工编号删除员工
public static boolean delEmployee(int no) {
int index = indexOf(no);
if(index == -1) {
return false;
}
//找到了位移
for(int i=index; i<empSum-1; i++) {
emps[i] = emps[i+1];
}
//清空最后一个元素
emps[empSum-1] = null;
//更新员工人数
empSum--;
return true;
}
//对员工数组进行扩容,一次扩容原来的2倍
public static void employeeExpansion() {
Employee[] new_emps = new Employee[emps.length * 2];
for(int i=0; i<emps.length; i++) {
new_emps[i] = emps[i];
}
emps = new_emps;
}
//对用户数组进行扩容,一次扩容原来的2倍
public static void userExpansion() {
User[] new_users = new User[users.length * 2];
for(int i=0; i<users.length; i++) {
new_users[i] = users[i];
}
users = new_users;
}
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
//用户注册与登录
while1:while(true) {
System.out.print("请选择功能:1、注册 2、登录:");
String flag = sc.next();
switch(flag) {
case "1": {
//获取用户输入
System.out.print("请输入用户名:");
String userName = sc.next();
System.out.print("请输入密码:");
String password = sc.next();
//注册
boolean isRegister = register(userName,password);
if(isRegister) {
System.out.println("用户创建成功");
continue while1;
} else {
System.out.println("用户名不能相同");
}
break;
}
case "2": {
//获取用户输入
System.out.print("请输入用户名:");
String userName = sc.next();
System.out.print("请输入密码:");
String password = sc.next();
//登录
isLogin = login(userName,password);
if(isLogin) {
System.out.println("登录成功!");
break while1;
} else {
System.out.println("登录失败!");
}
break;
}
}
}
//对员工进行CRUD操作
System.out.println("欢迎使用员工管理系统!");
while(isLogin) {
System.out.println("请选择功能:1.添加员工 2.查询员工 3.修改员工 4.删除员工");
String flag = sc.next();
switch (flag) {
case "1": {
System.out.print("请输入员工姓名:");
String name = sc.next();
//添加员工
addEmployee(name);
System.out.println("你已添加成功!");
break;
}
case "2": {
//查询
boolean isFindAll = false;
System.out.print("查询所有员工true;查询单个员工false:");
isFindAll = sc.nextBoolean();
if(isFindAll) { //查询所有员工
if(emps[0] == null) System.out.println("没有任何员工");
for(Employee emp : emps) {
if(emp == null) break;
System.out.println("员工编号:" + emp.getNo() + "\t员工姓名:" + emp.getName());
}
} else { //查询单个员工
System.out.print("请输入你想查询的员工工号:");
int in_empNo = sc.nextInt();
Employee emp = findEmployee(in_empNo);
if(emp == null) System.out.println("不存在该员工");
else System.out.println("员工编号:" + emp.getNo() + "\t员工姓名:" + emp.getName());
}
break;
}
case "3": {
//修改
System.out.print("请输入你想修改的员工工号:");
int in_empNo = sc.nextInt();
Employee emp = findEmployee(in_empNo);
if(emp == null) System.out.println("不存在该员工");
else {
System.out.print("请输入新名称:");
String in_name = sc.next();
emp.setName(in_name);
System.out.println("修改成功!");
}
break;
}
case "4": {
//删除
System.out.print("请输入要删除的员工编号:");
int in_empNo = sc.nextInt();
Employee emp = findEmployee(in_empNo);
if(emp == null) System.out.println("不存在该员工");
else {
System.out.print("是否确认删除 true确认,false否认:");
boolean isDel = sc.nextBoolean();
if(isDel) {
boolean retValue = delEmployee(in_empNo);
if(retValue) System.out.println("删除成功!");
else System.out.println("删除失败!");
}else {
System.out.println("已取消删除");
}
}
break;
}
default:
System.out.println("无效数值,请重新选择");
break;
}
}
}
}