[JAVA] 1.3 面向对象编程中级 两个案例秒懂封装思想 别忘了打开IDE动手敲一下嗷 -

6051 3
黑夜隐士 2021-7-3 12:35:08 | 显示全部楼层 |阅读模式

大佬给推荐的韩顺平老师的课程 2021年刚刚录的船新版本!
【零基础 快速学Java】韩顺平 零基础30天学会Java
硬把从另一个讲师那里看了300多集的我拽过来 几十节课一下子爱上这个节奏了!安利!!

具有其他语言基础的盆友只需要把前几章的章节总结简单看一下 然后再去着重看需要学习的章节就可以了!
知识点分的非常清晰! 每章还有总结 这…真的是我理想中的学习资料呐!

学习笔记整理过后放到这里

  • 一方面是让自己再二次记忆一下
  • 一方面是希望可以帮到有这方面知识需要的朋友 给他们一个新的切入点来重新了解这一个知识

本专题包括以下几个主要知识点~

在这里插入图片描述
本次笔记主要记录 封装的内容
别看封装思想很简单
但是如果这里的基础没有打好 之后的学习会很困难!
毕竟基础不牢 地动山摇嘛~
在这里插入图片描述

所以要多动手练一下 强化自己的面向对象思想!
再强调下 要敲一遍例子呐~
在这里插入图片描述

文章目录如下 跳转到感兴趣的内容看下吧~

案例尽量打开IDE动手敲一下吧!
韩老师给的例子真的很棒!

封装

【1】封装简介

先温习一下基本知识——

封装是个啥?

封装(encapsulation)就是把抽象出的数据 —— 属性 和对数据的操作 —— 方法 封装在一起

数据被保护在内部 程序的其他部分只有通过被授权的操作 方法 才能对数据进行操作

封装的理解和好处

这个很重要嗷~
我们为啥要封装啊
在这里插入图片描述

理由如下~

1.封装可以隐藏实现某个功能的细节
拿来就能用!

比如某种方法是用来连接数据库的

但是我们不用在乎这玩儿是咋写的 直接调用(传入参数)即可!

2.封装可以对数据进行验证 保证安全合理
输入数据不符合常理?不行!

控制属性值的合理性也很重要!

【2】封装实现的步骤

  • 属性私有化private

    让外界不能直接修改属性

  • 提供一个公共的(public)set方法

    用于对属性判断并赋值

在这里插入图片描述

  • 提供一个公共的(public)get方法

    用于获取属性的值

在这里插入图片描述

之后通过案例进行加深理解!

【3】使用案例快速入门封装

在这里插入图片描述

接下来动手敲一下吧!!

再温习下 封装都有哪些功能和特性呢——

  • 年龄、薪水是private的 无法直接改这些数据
  • 设置setName getName函数用于获取属性的值 对属性判断并赋值

达到目的

  • 不可以查看封装在内部的数据——保证数据的安全与私密

  • 可以对数据进行验证 如果验证不通过 设置默认值

public class Encapsulation01 {
    public static void main(String[] args) {
        Person person = new Person();
        person.setName("sfzlovehy");
        person.setAge(10000);
        person.setSalary(200000);
        System.out.println(person.info());
    }
}
class Person {
    public String name;//名字公开
    private int age;//年龄私有化
    private double salary;


//    手写setXXX和getXXX太慢 使用快捷键—— Alt + Insert
//    然后根据要求完善代码

    //    提供一个公共的(public)get方法 用于获取属性的值
    public String getName() {
        return name;
    }
    //    提供一个公共的(public)set方法 用于对属性判断并赋值
    public void setName(String name) {
        //加入对字符串数据的校验
        if (name.length() >= 2 && name.length() <= 6){
            this.name = name;
        }
        else{
            System.out.println("名字字儿不太行 多于2个少于6个字符吧 看着舒服点 暂时叫它无名氏了哦");
            this.name = "无名氏";
        }
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        if(age >= 1 && age <= 120){//如果是合理范围就返回合适的年龄
            this.age = age;
        }
        else{
            System.out.println("输入的年龄需要在1-120之间哦!再输一次吧!给你个默认年龄18");
            this.age = 18;
        }

    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }
//    写一个方法 返回属性信息
    public String info(){
        return "信息为姓名:" + name + " 年龄:" + age + " 薪水" + salary;
    }
}

[/code] 

跑完了的结果如下——

在这里插入图片描述

可以自己拿过去跑一跑~

【4】封装与构造器

复习下前一章(第八小节那部分)刚刚讲过的构造器

在这里插入图片描述

那么将用于初始化对象的构造器和setXXX相结合

就可以简单快捷地将数据输入进去啦

省得一个个输入 (相当于使用无参构造器) 怪麻烦的~

在这里插入图片描述

	//无参构造器
	public Person() {
      
    }
    //有三个属性的含参构造器
    public Person(String name, int age, double salary) {
        //在构造器中也要设置校验的set方法 不然没有校验功能了 那可不行~
        this.setName(name);
        this.setAge(age);
        this.setSalary(salary);
    }
[/code] 

测试一下

在这里插入图片描述

看~直接这样子输入多舒服

		Person person1 = new Person("Bill6666", 21, 20000);
        System.out.println("==Bill的信息==");
        System.out.println("我们需要把set方法写在构造器中 不然会使用构造器将set方法给绕过去的");
        System.out.println(person1.info());
[/code] 

输出结果

在这里插入图片描述
正如上面代码中注释说的 如果不使用 this.setName(name) 而是使用 this.name = name 就无法校验数据了

【5】再来一道封装的练习题

再练一道 巩固一下~
这道题真的是所有知识点都练到了!
你说啥 还没打开IDE?!
再来一遍
在这里插入图片描述

题目如下
在这里插入图片描述

分四步写这道题哈

相信偶 手敲一遍 收获大大滴!

1.Account类代码拆分理解

这道题一下子练习了四个点

快来吸收一下知识点吧~

00 数据的封装 让外界不能直接修改这些数据

在这里插入图片描述

01 使用构造器

在这里插入图片描述

02 getter 和 setter方法

分别起到两个作用——返回结果 和 校验数据是否符合要求

【1】姓名

在这里插入图片描述

【2】余额

在这里插入图片描述

【3】密码

在这里插入图片描述

03 最后别忘了写一个打印信息的函数

在这里插入图片描述

之后写下测试代码就好了 结果如下:

2.代码总览

  • Account.java
public class Account {
    //00 数据的封装 都是private的~
    private String name;
    private double balance;//balance是余额的意思哦~
    private String pwd;

    //01 提供两个构造器
    public Account() {
    }

    public Account(String name, String pwd, double balance) {
        this.setName(name);
        this.setPwd(pwd);
        this.setBalance(balance);

    }

    //02 getter与setter方法 分别起到——
    //[1]返回结果的作用
    public String getName() {
        return name;
    }
    //[2]校验数据的作用
    //校验名字长度是否符合要求
    public void setName(String name) {
        if(name.length() >= 2 && name.length() <= 4){
            this.name = name;
        }
        else{
            System.out.println("喂!朋友!姓名要求2/3/4位 你名字太长了 所以你还是叫无名氏吧!");
            this.name = "无名氏";
        }

    }

    public double getBalance() {
        return balance;
    }
    //    校验余额数量是否符合要求
    public void setBalance(double balance) {
        if(balance > 20){
            this.balance = balance;
        }
        else{
            System.out.println("你余额太少了 跟0也差不多 就算0吧 :)");
            this.balance = 0;
        }
    }

    public String getPwd() {
        return pwd;
    }
    //    校验密码长度是否符合要求
    public void setPwd(String pwd) {
        if(pwd.length() == 6){
            this.pwd = pwd;
        }
        else {
            System.out.println("对8起 我们对密码长度有很严格的要求 必须是6位 给你个默认密码000000吧 不用谢");
            this.pwd = "000000";
        }
    }
    //04 打印出来信息
    public void showInfo(){
        //可以增加权限的校验~
        //这里先不加了哈
        System.out.println("账号信息 姓名:" + name + " 密码" + pwd + " 余额" + balance);
    }
}

[/code] 
  • TestAccount.java
//方法一 使用无参构造器
public class TestAccount {
    public static void main(String[] args) {
        //创建Account
        Account account = new Account();
        account.setName("Bill");
        account.setPwd("666666");
        account.setBalance(100000);
        account.showInfo();
    }
}
[/code] 

结果:
虽然输入符合要求 但是使用了费劲的无参构造器

在这里插入图片描述

  • TestAccount02.java
//方法二 使用含参构造器
public class TestAccount02 {
    public static void main(String[] args) {
        Account account = new Account("pangying", "16161616", 6);
        account.showInfo();
    }
}
[/code] 

虽然使用了快捷的含参构造器 但是输入全不符合要求呢

在这里插入图片描述

【6】封装小结

封装学习到此为止
敲完代码 回头再看看 封装的好处

1.封装可以隐藏实现某个功能的细节
拿来就能用!

2.封装可以对数据进行验证 保证安全合理
输入数据不符合常理?不行!

是不是可以理解更多了呢?
之后继续努力吧 嘿嘿


来源:https://blog.csdn.net/qq_45704942/article/details/117932680
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

中国红客联盟公众号

联系站长QQ:5520533

admin@chnhonker.com
Copyright © 2001-2025 Discuz Team. Powered by Discuz! X3.5 ( 粤ICP备13060014号 )|天天打卡 本站已运行