• Java面向对象编程之封装


    目录

    什么是封装

    封装的优点

    实现Java封装的步骤

     题目 1:要求不能随查看某个人的年龄,工资等隐私,设置年龄,并对设置的年龄进行合理的验证,年龄合理就设置,否则给默认年龄,合理的年龄必须在 1-120 ,年龄和工资不能直接查看,name 的长度在 2- 6 字符之间。

    题目2:要求具有属性:姓名 (长度为2位或3位或4位) 、 余额(必须>20)密码(必须是六位),且满足要求 如果不满足,则给出提示信息 ,并给默认值(程序员自己定)


    什么是封装

    在面向对象程式设计方法中,封装(英语:Encapsulation)是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法。

    封装最主要的功能在于我们能修改自己的实现代码,而不用修改那些调用我们代码的程序片段。

    适当的封装可以让程式码更容易理解与维护,也加强了程式码的安全性。

    封装的优点

    • 1. 良好的封装能够减少耦合。

    • 2. 类内部的结构可以自由修改。

    • 3. 可以对成员变量进行更精确的控制。

    • 4. 隐藏信息,实现细节。

    实现Java封装的步骤

    1. 修改属性的可见性来限制对属性的访问(一般限制为private),例如:

    1. public class Person {
    2. private String name;
    3. private int age;
    4. }

    这段代码中,将 name 和 age 属性设置为私有的,只能本类才能访问,其他类都访问不了,如此就对信息进行了隐藏。

    2. 对每个值属性提供对外的公共方法访问,也就是创建一对赋取值方法,用于对私有属性的访问,例如:

    1. public class Person{
    2. private String name;
    3. private int age;
    4. public int getAge(){
    5. return age;
    6. }
    7. public String getName(){
    8. return name;
    9. }
    10. public void setAge(int age){
    11. this.age = age;
    12. }
    13. public void setName(String name){
    14. this.name = name;
    15. }
    16. }

    采用 this 关键字是为了解决实例变量(private String name)和局部变量(setName(String name)中的name变量)之间发生的同名的冲突。

    封装:就是把抽象出的数据(属性)和对数据的操作(方法)封装在一起,数据被保护在内

    public class Person { private String name; private int age; }

    部,程序的其它部分只有通过被授权的操作(方法),才能对数据进行操作。

    那么在Java中如何实现这种类似的控制呢?

    下面一个快速入门案例, 加深对封装的了解


     
    题目 1:要求不能随查看某个人的年龄,工资等隐私,设置年龄,并对设置的年龄进行合理的验证,年龄合理就设置,否则给默认年龄,合理的年龄必须在 1-120 ,年龄和工资不能直接查看,name 的长度在 2- 6 字符之间。

    代码实现: 

    1. class Person {
    2. public String name;//名字分开
    3. private int age;//age 私有化
    4. private double salary;//...
    5. //构造器 alt + insert
    6. public Person() {
    7. }
    8. //有三个属性的构造器
    9. public Person(String name, int age, double salary) {
    10. // this.name = name;
    11. // this.age = age;
    12. // this.salary = salary;
    13. //将封装与构造器结合setXxx ,我们可以将 set 方法写在构造器中,这样仍然可以验证
    14. setName(name);
    15. setAge(age);
    16. setSalary(salary);
    17. }
    18. //自己写 setXXX 和 getXxx 太慢了,我们使用快捷键 Alt + insert
    19. //然后根据要求来完善我们的代码
    20. public String getName() {
    21. return name;
    22. }
    23. public void setName(String name) {
    24. //加入对数据的校验,相当于增加了业务逻辑
    25. if (name.length() >= 2 && name.length() <= 6) {
    26. this.name = name;
    27. } else {
    28. System.out.println("名字的长度不同,需要(2-6)个字符 ,默认名字");
    29. this.name = "无名人";
    30. }
    31. }
    32. public int getAge() {
    33. return age;
    34. }
    35. public void setAge(int age) {
    36. //判断
    37. if (age >= 1 && age <= 120) {//如果是合理范围
    38. this.age = age;
    39. } else {
    40. System.out.println("设置的年龄不对,需要在(1-120),给默认年龄18");
    41. // this.age = 18;//给一个默认年龄
    42. this.age = 18;
    43. }
    44. }
    45. public double getSalary() {
    46. //可以这里增加对当前对象的权限判断
    47. return salary;
    48. }
    49. public void setSalary(double salary) {
    50. this.salary = salary;
    51. }
    52. //写一个方法,返回属性
    53. public String info() {
    54. return "信息为 name= " + name + "age=" + age + "salary=" + salary;
    55. }
    56. }
    57. public class Encapsulation01 {
    58. public static void main(String[] args) {
    59. Person person = new Person();
    60. person.setName("jack");
    61. person.setAge(30);
    62. person.setSalary(30000);
    63. System.out.println(person.info());
    64. System.out.println(person.getSalary());
    65. //如果我们自己使用构造器指定属性
    66. Person swith = new Person("swith", 20, 30000);
    67. System.out.println("=======swith的信息=======");
    68. System.out.println(swith.info());
    69. }
    70. }

     运行结果:

    题目2:要求具有属性:姓名 (长度为2位或3位或4位) 、 余额(必须>20)
    密码(必须是六位),且满足要求 如果不满足,则给出提示信息 ,并给默认值(程序员自己定)

    1.创建程序,在其中定义两个类 :Account 和 AccountTest 类体会 Java 的封装性。
    Account 类要求具有属性:姓名 (长度为2位或3位或4位) 、 余额(必须>20)
    密码(必须是六位) ,如果不满足,则给出提示信息 ,并给默认值(程序员自己定)

     
    2.通过 setXxx 的方法给 Account 的属性赋值


    3.在 AccountTest 中测试

    代码实现:

    1. public class Account {
    2. //为了封装,将3 个属性设置为 private
    3. private String name;
    4. private double balance;
    5. private String pwd;
    6. //提供两个构造器
    7. public Account() {
    8. }
    9. public Account(String name, double balance, String pwd) {
    10. this.setName(name);
    11. this.setBalance(balance);
    12. this.setPwd(pwd);
    13. }
    14. public String getName() {
    15. return name;
    16. }
    17. public void setName(String name) {
    18. //姓名(长度为2位或3位或4位)
    19. if (name.length() >= 2 && name.length() <= 4) {
    20. this.name = name;
    21. } else {
    22. System.out.println("姓名(长度为2位或3位或4位),默认值无名");
    23. this.name = "无名";
    24. }
    25. }
    26. public double getBalance() {
    27. return balance;
    28. }
    29. public void setBalance(double balance) {
    30. if (balance > 20) {
    31. this.balance = balance;
    32. } else {
    33. System.out.println(" 余额(必须>20),默认值为0");
    34. }
    35. }
    36. public String getPwd() {
    37. return pwd;
    38. }
    39. public void setPwd(String pwd) {
    40. if (pwd.length() == 6) {
    41. this.pwd = pwd;
    42. } else {
    43. System.out.println("密码(必须是六位),默认密码为 000000");
    44. this.pwd = "000000";
    45. }
    46. }
    47. //显示账号信息
    48. public void showInfo() {
    49. //可以增加权限的校验
    50. System.out.println("账号信息 name=" + name + "余额=" + balance + "密码"+pwd);
    51. // if (){
    52. // System.out.println("账号信息 name=" + name + "余额=" + balance + "密码");
    53. // }else {
    54. // System.out.println("你无权查看 ……");
    55. // }
    56. }
    57. }

    运行结果:

  • 相关阅读:
    em,rem,px,rpx的区别与使用
    通用寄存器与标志位寄存器OF/DF/IF/TF/SF/ZF/AF/PF
    蚂蚁链发布全新Web3品牌ZAN,涉及RWA、合规等服务
    libfaad2 主机编译和交叉编译
    关于软考高级要不要报班学习
    链接脚本和可执行文件
    好心情平台:看精神科医生前必知的5件事!让你少花钱少受罪
    网页大作业代码自取
    盘点5个C#开发的、可用于个人博客的系统
    K8S原来如此简单(四)Service+Ingress
  • 原文地址:https://blog.csdn.net/m0_57448314/article/details/126926493