Day32--封装

Day32--封装

封装通过将类的内部状态(属性)和行为(方法)隐藏起来,仅对外提供公共接口来访问和操作这些状态,从而提高代码的安全性、可维护性和复用性

记住这句话就够了:属性私有,get/set。

封装主要是针对属性,很少针对方法

封装的实现方法

  • 使用访问修饰符:Java提供了四种访问修饰符:public、protected、default(无修饰符)和private。通过合理使用这些修饰符,可以控制类、方法、属性的访问权限。
  • 提供公共接口:通过公共方法(getter和setter)来访问和修改私有属性,确保数据的合法性和一致性。

举例:

​ 打开oop.demo04里面的Student类和Application类

​ 在Student类里面,创建私有属性:name、id、sex、age

package com.liu.oop.demo04;

//private   私有
public class Student {

    private String name;   //    名字

    private int id;        //    学号

    private char sex;      //    性别
    
    private int age;       //    年龄
}

此时,属性的修饰符是private

在Application里面,创建Student的对象,访问name属性

package com.liu.oop;

import com.liu.oop.demo04.Student;

public class Application {
    public static void main(String[] args) {
        Student s1 = new Student();
        s1.name
    }
}

此时,想要访问s1的name属性,但是会报错

image-20241117210403215

由于属性私有,所以即使在其他的类对对象初始化,也无法操作属性

所以这个时候,就要在私有属性旁,提供一些可以操作这个属性的方法

在Student类里,生成public的get、set方法

​ 快捷键快速生成get、set方法:

​ Alt+Insert---->Getter\Setter

​ 快捷键 s1.getName().sout

在Student类里,生成public的get、set方法。

package com.liu.oop.demo04;

//private   私有
public class Student {
    //属性私有

    private String name;   //    名字

    private int id;  //    学号

    private char sex;  //    性别

    //提供一些可以操作这个属性的方法
    //提供一些public的get、set方法

    //get  获取数据
    public String getName(){
        return this.name;
    }

    //set  为数据设置值
    public void setName(String name){
        this.name=name;
    }
}

此时,在Application里面,设置name为刘(setName),输出name(getName)

package com.liu.oop;

import com.liu.oop.demo04.Student;

public class Application {
    public static void main(String[] args) {
        Student s1 = new Student();
        s1.setName("刘");
        System.out.println(s1.getName());//刘
    }
}

这里。没有直接操作属性,但是通过一些外部的方法操作属性

​ 有时候,要对方法进行限制

​ 年龄要进行限制

在setAge里面,输入的age范围在0~130之间有效,否则输出结果为0

 public void setAge(int age) {
        if (age <=130 && age > 0) {
            this.age = age;
        }else {
            this.age = 0;
        }
    }

此时

s1.setAge(1300);
        System.out.println(s1.getAge());  //0

很有意思的现象:

当我把上面的代码修改为:

package com.liu.oop.demo04;

public class Student {
    private String name;
    private int id;
    private int age;
    private char sex;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public char getSex() {
        return sex;
    }

    public void setSex(char sex) {
        this.sex = sex;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        if(age<=130&&age>0){
            this.age=age;
        }else {
            this.age=00000000000000000;
        }
    }
}

我希望在Application里面输出00000000000000000,但是,输出的结果为:

liu
0

这是咋回事?

这就涉及到前导零的概念了。前导零(Leading Zeros)指的是一个数字字符串中,数字前面的零。这些零在数值上没有实际意义

前导零的限制

  • 整数类型:在Java中,整数类型(如intlong等)不支持前导零。当你将一个带有前导零的字符串转换为整数时,前导零将被忽略,只保留实际的数值部分。
  • 字符串类型:在字符串类型中,前导零可以被保留,但它们不会影响字符串所表示的数值。

封装的意义

/*
封装的意义
1. 提高程序的安全性,保护数据。
2. 隐藏代码的实现细节。 						用户只用输入年龄,不用知道具体的代码实现细节
3. 统一接口。   get/set
4. 系统可维护性增加了。
 */
posted @ 2024-11-17 21:33  1hahahahahahahaha  阅读(15)  评论(0)    收藏  举报