面向对象_day02
学习目标:
1. 熟练掌握封装、javaBean的概念
2. 熟练掌握关键字package,Import关键字概念
3. 完成项目客户管理系统
一、封装
1.1 封装的意义
为什么需要封装?封装的作用和含义?
我要用洗衣机,只需要按一下开关和洗涤模式就可以了,有必要了解洗衣机内部的结构吗?有必要碰电动机吗? 我要开车,只要会打方向盘,会踩刹车、油门就可以了,有必要了解汽车的构造吗?有必要了解汽车的每个零件吗?…
我们程序设计追求“高内聚,低耦合”。
- 高内聚 :类的内部数据操作细节自己完成,不允许外部干涉;
- 低耦合 :仅对外暴露少量的方法用于使用。
隐藏对象内部的复杂性,只对外公开简单的接口。便于外界调用,从而提 高系统的可扩展性、可维护性。通俗的说,把该隐藏的隐藏起来,该暴露 的暴露出来。这就是封装性的设计思想。
1.2 访问权限修饰符
java的访问权限修饰符可以控制类、属性、方法的访问权限。能够完成java类的封装设计;常见访问权限修饰符如下:
private | 默认 | public | protected | |
---|---|---|---|---|
类 | 不支持 | 只能在本包中访问 | 在任意包中的任意类访问 | 不支持 |
方法、属性、构造方法 | 只能在本类中访问 | 只能在本包中访问 | 在任意包中的任意类访问 | 暂时不研究 |
1.3 类该如何封装和隐藏
Java中通过将数据声明为私有的(private),再提供公共的(public)方法:getXxx()和setXxx()实现对该属性的操作,以实现下述目的:
- 隐藏一个类中不需要对外提供的实现细节;
- 使用者只能通过事先定制好的方法来访问数据,可以方便地加入控制逻辑,
- 限制对属性的不合理操作;
- 便于修改,增强代码的可维护性;
示例1:
public class User {
//1.私有属性
private String name;
private int age;
//2.公有方法
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
if(age>0&& age<300) {
this.age = age;
} else {
System.out.println("年龄设置错误,年龄设置失败");
}
}
public String getName() {
return this.name;
}
public int getAge() {
return this.age;
}
}
/**
*
* @Description 测试User类
* @author mark Email:2481621747@qq.com
* @version
* @Date 2020年2月28日下午4:23:46
*
*/
public class UserTest {
public static void main(String[] args) {
User user = new User();
user.setAge(600);
user.setName("小黑");
System.out.println(user.getAge());
System.out.println(user.getName());
}
}
1.4 如何编写javaBean
javaBean是一种java语言写成的可重用组件;所谓javaBean,是指符合如下标准的java类,javaBean的标准如下:
- javaBean类必须是一个公共类 ,如: public class User{…}
- javaBean 类必须有一个空的构造函数
- 私有属性,且有对应的公有get、set方法
示例1:
/**
* javaBean
*/
public class User {
//1.私有属性
private int id;
private String name;
private int age;
//2.公有无参数构造方法,如果没有定义其他构造方法,
// 也可以使用系统默认的无参数构造方法
public User(){
}
//3.公有setter和getter方法与属性对应
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;
}
}
思考:为什么说javaBean是java语言的可重用组件?
1.5 小结
- 访问权限修饰符
- 封装的含义
- javaBean规范
- javaBean含义
二、关键字 package、import
2.1 package关键字
2.1.1 package 使用说明
package语句作为Java源文件的第一条语句,指明当前文件中定义的类所在 的包。(若缺省该语句,则指定为无名包)。它的格式为:
2.1.2 包的作用
包帮助管理大型软件系统:将功能相近的类划分到同一个包中。比如:MVC的设计模式
-
包可以包含类和子包,划分项目层次,便于管理
-
解决类命名冲突的问题
-
控制访问权限
如下所示:
2.1.3 MVC设计模式
MVC是常用的设计模式之一,将整个程序分为三个层次:视图展现成,业务控制层,与数据模型层。这种将程序输入输出、数据处理,以及数据的展示分离开来的设计模式 使程序结构变的灵活而且清晰,同时也描述了程序各个对象间的通信方式,降低了程序的耦合性。
2.1.4 jdk中主要包介绍
-
java.lang----包含一些Java语言的核心类,如String、Math、Integer、 System和 Thread,提供常用功能(该包下的类不用导包)
-
java.net----包含执行与网络相关的操作的类和接口。
-
java.io ----包含能提供多种输入/输出功能的类。
-
java.util----包含一些实用工具类,如定义系统特性、接口的集合框架类、使用与日期日历相关的函数。
-
java.text----包含了一些java格式化相关的类
-
java.sql----包含了java进行JDBC数据库编程的相关类/接口
-
java.awt----包含了构成抽象窗口工具集(abstract window toolkits)的多个类,这些类被用来构建和管理应用程序的图形用户界面(GUI)
2.2 import 关键字
2.2.1 import 关键字使用说明
为使用定义在不同包中的Java类,需用import语句来引入指定包层次下所需要的类或全部类(.*)。import语句告诉编译器到哪里去寻找类
语法
import 包名. 类名;
示例1:UserTest 类使用其它包的User类
package top.psjj.demo2;
// top.psjj.demo2.下的UserTest类使用其他包top.psjj.demo1下的User类;
// 同包下的类使用不需要导入
import top.psjj.demo1.User;
public class UserTest {
public static void main(String[] args) {
User user = new User();
}
}
2.2.2 import 注意事项:
-
在源文件中使用import显式的导入指定包下的类或接口
-
声明在包的声明和类的声明之间。
-
如果需要导入多个类或接口,那么就并列显式多个import语句即可
-
举例:可以使用java.util.*的方式,一次性导入util包下所有的类或接口。
-
如果导入的类或接口是java.lang包下的,或者是当前包下的,则可以省略此import语句。
-
如果在代码中使用不同包下的同名的类。那么就需要使用类的全类名的方式指明调用的是哪个类。
-
import static组合的使用:调用指定类或接口下的静态的属性或方法
示例1:
package top.psjj.demo2;
//果需要导入多个类或接口,那么就并列显式多个import语句即可
//import java.util.ArrayList;
//import java.util.Arrays;
//import java.util.List;
//例:可以使用java.util.*的方式,一次性导入util包下所有的类或接口。
import java.util.*;
/**
* import关键字演示
* 1. 在源文件中使用import显式的导入指定包下的类或接口
* 2. 声明在包的声明和类的声明之间。
* 3. 如果需要导入多个类或接口,那么就并列显式多个import语句即可
* 4. 举例:可以使用java.util.*的方式,一次性导入util包下所有的类或接口。
* 5. 如果导入的类或接口是java.lang包下的,或者是当前包下的,则可以省略此import语句。
* 6. 如果在代码中使用不同包下的同名的类。那么就需要使用类的全类名的方式指明调用的是哪个类。
*/
public class ImportTest {
public static void main(String[] args) {
int[] arr = {1,9,7,3,5};
//对数组排序类
Arrays.sort(arr);
//定义集合
List list = new ArrayList();
}
}
示例2:
package top.psjj.demo2;
import java.util.Arrays;
import static java.util.Arrays.sort;
/**
* @Auther: 胖叔讲java
* @Date: 2022/4/13 - 04 - 13 - 11:48
* @Decsription: top.psjj.demo2
* @version: 1.0
*/
public class ImportTest2 {
public static void main(String[] args) {
int [] arr = {1,3,7,4};
//静态导入sort方法后可以直接用
sort(arr);
//没有静态导入toString方法,必须类名.静态方法
System.out.println(Arrays.toString(arr));
}
}
2.3 小结
- package声明当前类所在位置
- import导入使用的类所在位置
三、项目客户管理系统
客户管理系统,通过面向对象思想管理客户信息;可实现添加客户、删除客户、修改客户、查看客户信息功能。
3.1 项目演示
3.1.1 系统主界面演示
【1】主界面展示
【2】主程序退出流程
【3】如果输入的不是1- 5 提示输入有误
【4】如果输入5 提示是否退出
1.如果输入不是y或者n 会一直让客户输入
2. 输入n 回到主界面
3.输入y退出程序
3.1.2 查看客户列表演示
【1】当系统没有客户数据客户列表展示
【2】当系统拥有客户数据客户列表展示
3.1.3 添加客户演示
【1】选择1添加数据
3.1.4 修改客户演示
【1】输入2 进入 修改界面 输入-1 返回主界面
【2】选择2 进入 修改界面 输入修改的编号 如果编号不存在提示无法找到指定客户 ,如果客户存在显示客户原来信息并让用户接着修改客户信息。
3.1.5 删除客户演示
【1】用户输入3进入删除界面 输入-1退出删除机界回到主界面
【2】输入不存在的客户编号,提示无法找到指定客户
【3】输入存在的客户编号提示是否确认删除 输入y和n以外的其他字母重复提示,输入n跳转主界面取消删除
输入y提示删除成功信息 跳转主界面。
3.2 客户信息管理系统编码实现
3.2.1 客户数据model层编写
package top.psjj.customer.model;
/**
* 客户数据模型:客户javaBean
*/
public class Customer {
//姓名
private String name;
//性别
private String sex;
//年龄
private int age;
//手机号
private String phone;
//邮箱
private String email;
public Customer(String name, String sex, int age, String phone, String email) {
this.name = name;
this.sex = sex;
this.age = age;
this.phone = phone;
this.email = email;
}
public Customer() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
3.2.2 客户数据业务层编写
package top.psjj.customer.controller;
import top.psjj.customer.model.Customer;
/**
* 控制层:控制客户的增删改查业务
*/
public class CustomerContainer {
//定义客户容器 10 null null null
private Customer[] customerContainer;
//定义客户的实际个数
private int total;
//给属性初始化:构造方法,setter方法
public CustomerContainer(int length){
//给容器初始化
customerContainer = new Customer[length];
}
//添加客户
public boolean addCustomer(Customer customer){
//如果客户不为null并且 长度小于容器长度添加成功,否则添加失败
if(customer!=null && this.total<this.customerContainer.length){
customerContainer[total++] = customer;
return true;
} else {
return false;
}
}
//根据下标查找客户
public Customer queryCustomerByIndex(int index){
if(index>=this.total){
return null;
}else {
return customerContainer[index];
}
}
//修改客户
public boolean updateCustomerByIndex(int index,Customer customer){
if(index>=this.total){
return false;
} else {
customerContainer[index] = customer;
return true;
}
}
//删除客户
public boolean delCustomerByIndex(int index){
if(index>=this.total){
return false;
} else {
for (int i = index; i <total-1 ; i++) {
customerContainer[i] = customerContainer[i+1];
}
customerContainer[--total] = null;
return true;
}
}
//查看所有客户信息
public Customer[] queryCustomerAll(){
//创建客户数组
Customer[] result = new Customer[this.total];
for (int i = 0; i <this.total ; i++) {
result[i] = customerContainer[i];
}
return result;
}
}
3.2.3 客户数据显示层编写
package top.psjj.customer.view;
import top.psjj.customer.controller.CustomerContainer;
import top.psjj.customer.model.Customer;
import java.util.Scanner;
/**
* 客户系统展现成
*/
public class CustomerUI {
//创建扫描仪对象
private Scanner input = new Scanner(System.in);
//创建容器
private CustomerContainer customerContainer = new CustomerContainer(10);
//展示系统菜单
public void menu(){
menu:while (true) {
//菜单显示
System.out.println("-------------------客户信息管理系统---------------------\r\n");
System.out.println(" 1.添加客户");
System.out.println(" 2.修改客户");
System.out.println(" 3.删除客户");
System.out.println(" 4.查看客户");
System.out.println(" 5.退出");
System.out.println("请输入【1-5】");
//接收命令
int code = input.nextInt();
//输入有误
if(!(code>=1 && code<=5)){
System.out.println("输入有误,请重新输入");
continue;
} else {
//输入正确
switch (code){
case 1 :
//System.out.println("添加客户");
addCustomer();
break;
case 2 :
//System.out.println("修改客户");
updateCustomer();
break;
case 3 :
//System.out.println("删除客户");
delCustomer();
break;
case 4 :
//System.out.println("查看客户");
//查看所有客户
showCustomers();
break;
case 5 :
while (true){
System.out.println("确认是否退出y/n");
//接收退出指令
String str = input.next();
//equalsIgnoreCase 忽略大小写比较
if(str.equalsIgnoreCase("y")){
//退出系统,结束方法
return;
}else if(str.equalsIgnoreCase("n")){
//不退出系统,继续执行下一次目录
continue menu;
}
}
}
}
}
}
//删除客户
private void delCustomer() {
System.out.println("------------------------删除客户-----------------------------");
while (true){
System.out.println("输入要删除的客户编号【-1退出】");
//接收修改的客户编号
int number = input.nextInt();
if(number==-1){
return;
}
//计算下标
int index = number-1;
//查找客户
Customer customer = customerContainer.queryCustomerByIndex(index);
if(customer!=null){
while(true){
System.out.println("请确认删除y/n");
//接收指令
String code = input.next();
if(code.equalsIgnoreCase("y")){
boolean tag = customerContainer.delCustomerByIndex(index);
if(tag){
System.out.println("删除成功");
}else {
System.out.println("删除失败");
}
return;
}else if(code.equalsIgnoreCase("n")){
return;
}
}
}else {
System.out.println("要删除的客户不存在");
}
}
}
//修改客户
private void updateCustomer() {
System.out.println("------------------------修改客户-----------------------------");
while (true){
System.out.println("输入要修改的客户编号【-1退出】");
//接收修改的客户编号
int number = input.nextInt();
if(number==-1){
return;
}
//计算下标
int index = number-1;
//查找对应客户
Customer customer = customerContainer.queryCustomerByIndex(index);
if(customer==null){
System.out.println("无法找到指定客户");
}else {
//根据原有客户信息进行修改
System.out.println("姓名("+customer.getName()+")");
customer.setName(input.next());
System.out.println("性别("+customer.getSex()+")");
customer.setSex(input.next());
System.out.println("年龄("+customer.getAge()+")");
customer.setAge(input.nextInt());
System.out.println("手机号("+customer.getPhone()+")");
customer.setPhone(input.next());
System.out.println("邮箱("+customer.getEmail()+")");
customer.setEmail(input.next());
boolean tag = customerContainer.updateCustomerByIndex(index, customer);
if(tag){
System.out.println("修改成功");
}else {
System.out.println("修改失败");
}
return;
}
}
}
//查看所有客户
private void showCustomers() {
System.out.println("-------------------------客户列表------------------------");
//获得客户的真实数据
Customer[] customers = customerContainer.queryCustomerAll();
if(customers!=null && customers.length>0){
System.out.println("编号\t姓名\t性别\t年龄\t手机号\t邮箱");
for (int i = 0; i < customers.length; i++) {
System.out.println((i+1)+"\t"+customers[i].getName()+"\t"+customers[i].getSex()+"\t"+customers[i].getPhone()+"\t"+customers[i].getEmail());
}
}else {
System.out.println("没有客户信息");
}
}
//添加客户
private void addCustomer() {
//根据提示接收输入的客户信息
System.out.println("-------------------添加客户----------------------");
System.out.println("姓名");
String name = input.next();
System.out.println("性别");
String sex = input.next();
System.out.println("年龄");
int age = input.nextInt();
System.out.println("手机号");
String phone = input.next();
System.out.println("邮箱");
String email = input.next();
//创建客户
Customer customer = new Customer(name,sex,age,phone,email);
//添加客户
boolean tag = customerContainer.addCustomer(customer);
if(tag){
System.out.println("添加成功");
}else {
System.out.println("添加失败");
}
}
public static void main(String[] args) {
//创建UI对象
CustomerUI customerUI = new CustomerUI();
//展现菜单
customerUI.menu();
}
}