day07_面向对象_封装

面向对象_day02

学习目标:

1. 熟练掌握封装、javaBean的概念
2. 熟练掌握关键字package,Import关键字概念
3. 完成项目客户管理系统

视频教程:https://www.bilibili.com/video/BV1NG411W7Lo?spm_id_from=333.999.0.0&vd_source=c674caf7b33c72dc23df379819432644

一、封装

1.1 封装的意义

为什么需要封装?封装的作用和含义?

我要用洗衣机,只需要按一下开关和洗涤模式就可以了,有必要了解洗衣机内部的结构吗?有必要碰电动机吗? 我要开车,只要会打方向盘,会踩刹车、油门就可以了,有必要了解汽车的构造吗?有必要了解汽车的每个零件吗?…

我们程序设计追求“高内聚,低耦合”。

  • 高内聚 :类的内部数据操作细节自己完成,不允许外部干涉;
  • 低耦合 :仅对外暴露少量的方法用于使用。

隐藏对象内部的复杂性,只对外公开简单的接口。便于外界调用,从而提 高系统的可扩展性、可维护性。通俗的说,把该隐藏的隐藏起来,该暴露 的暴露出来。这就是封装性的设计思想。

1.2 访问权限修饰符

java的访问权限修饰符可以控制类、属性、方法的访问权限。能够完成java类的封装设计;常见访问权限修饰符如下:

private默认publicprotected
不支持只能在本包中访问在任意包中的任意类访问不支持
方法、属性、构造方法只能在本类中访问只能在本包中访问在任意包中的任意类访问暂时不研究

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的标准如下:

  1. javaBean类必须是一个公共类 ,如: public class User{…}
  2. javaBean 类必须有一个空的构造函数
  3. 私有属性,且有对应的公有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 小结

  1. 访问权限修饰符
  2. 封装的含义
  3. javaBean规范
  4. 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 注意事项:

  1. 在源文件中使用import显式的导入指定包下的类或接口

  2. 声明在包的声明和类的声明之间。

  3. 如果需要导入多个类或接口,那么就并列显式多个import语句即可

  4. 举例:可以使用java.util.*的方式,一次性导入util包下所有的类或接口。

  5. 如果导入的类或接口是java.lang包下的,或者是当前包下的,则可以省略此import语句。

  6. 如果在代码中使用不同包下的同名的类。那么就需要使用类的全类名的方式指明调用的是哪个类。

  7. 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 小结

  1. package声明当前类所在位置
  2. 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();
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值