2022-07-19 第五小组 顾祥全 学习笔记 day12-JavaSE-面向对象-封装

本文详细介绍了面向对象编程中的封装概念,通过现实生活中的手机和电脑举例说明封装的作用,即保护内部结构安全和简化外部使用。在代码中,封装体现在类的属性私有化和提供公共的setter/getter方法,以及在员工管理系统中的应用,如数据验证和CRUD操作。通过封装,可以提高代码的安全性和可维护性。
摘要由CSDN通过智能技术生成

面向对象-封装

现实生活中的封装

在现实生活中有很多封装的案例,例如:手机、电脑等等都是属于封装。
对于手机的封装:

  1. 首先是对手机部件的封装,给他们一个坚硬的外壳,保证内部部件的安全;
  2. 还有的就是对他们功能的封装,对于手机的某个功能例如计算器,我们并不需要直到这个计算器的计算功能是如何实现的,只需要知道怎么去使用这个计算功能即可。

封装有什么作用

  • 保证内部结构安全
  • 屏蔽复杂,暴露简单(对功能的封装)

在代码中封装的作用

在一个类体中的数据,假设对代码进行封装后,对于代码的调用者来说是方便的,调用者不需要考虑这个代码的具体实现,只需要有一个简单的操作入口便能使用这个代码的功能(例如:java.util.Arrays这个工具类中有一个sort方法,可以对数组进行排序,这里我们并不需要考虑排序功能是如何实现的,只需要会使用这个sort方法便能使用数组排序的功能);对于类体中安全级别较高的数据,可以使用封装使外部人员不能访问,保证数据安全。

对属性进行封装

  1. 将类中的属性私有化(每个属性都使用private修饰)
  2. 对外提供简单的操作入口(为每一个属性都定义一对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;
						
			}
		}

	}
}	

知识点:了解

掌握情况:了解

思维导图

在这里插入图片描述

面向对象编程是一种编程范式,它将程序的构建和设计思路以面向对象的方式进行组织和实现。在Java中,面向对象编程是基于Java SE(Standard Edition)的一种编程方式。第07讲主要介绍了面向对象编程中的一些基本概念和关键术语。 在面向对象编程中,我们将程序中的数据和对数据的操作(方法)封装在一起,形成一个对象。对象由两部分构成:属性和方法。属性是用来描述对象的特征,而方法则是对象可以执行的操作。对象之间通过消息(方法调用)进行通信和交互。面向对象的核心思想是通过封装、继承和多态实现程序的复用和扩展。 封装面向对象编程中的一个重要概念,它指的是将类的属性和方法进行封装,使得外部无法直接访问和修改对象的内部状态,只能通过公共的方法来操作属性和执行方法。封装提供了一种将数据和行为组合在一起的方式,可以保护数据的完整性和安全性。 继承是面向对象编程中的另一个重要概念,它指的是通过定义一个新的类来继承现有类的属性和方法。通过继承,子类可以继承父类的属性和方法,并可以在此基础上进行扩展和修改。继承提供了一种代码复用的机制,可以减少重复编码的工作量。 多态是面向对象编程的又一个重要概念,它指的是同一类型的对象在不同的情况下可以有不同的表现形式。多态通过方法的重写和方法的重载实现。方法的重写指的是在子类中重新定义和实现父类的方法,方法的重载指的是在同一个类中可以定义多个同名但参数列表不同的方法。 总结来说,面向对象编程是一种将程序组织和设计思路以对象为中心的编程方式。在JavaSE中,我们可以通过封装、继承和多态来实现面向对象编程的目标。封装可以提高程序的可维护性和可复用性,继承可以减少重复编码的工作量,多态可以灵活地操作对象。掌握这些基本概念和关键术语,可以帮助我们更好地理解和应用面向对象编程的思想。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值