java基础之面向对象的四大核心特性之封装---超详细

​

大家好,今天想聊一聊java最基本的知识,这期我们来了解封装特性,我会用我自己最通俗的理解方式呈现给大家,如果觉得文章内容还行的话,大家多多支持哈,如果有不足的地方希望大家批评指正,我们共同进步~~~

封装

封装从字面意思就能略知一二,比如一个集装箱,当工人装货的时候我们可以看到集装箱里装的是什么货(木材、橡胶、工业产品),但工人装完货把集装箱门关上,我们就很难从外观上知道内部装的是什么,那么这是我们就需要使用方法来知道内部是什么了,那么这个方法可以是(装货工人口头表达箱子里的货物或者是发货方所列出的各种货物清单)

下面就是一个简单的封装代码

arduino 复制代码
class Person {
   String name;
   int age;
   public void getNameAndAge(String name,int age) {

      System.out.println("姓名:"+name + "及"+"年龄:" +age);
   }
}

将代码中的属性和方法封装到类中这样有很多优势

①封装后提高了代码的维护性和可读性。

②降低项目中代码的耦合性,提高了代码的独立性,可提高项目中的相关问题排查效率。

③提高代码的可重用性。

封装中使用四种修饰符:

​

arduino 复制代码
class Person {
    public String name;//姓名
    public String address;//地址
    public String phoneNumber;//电话
    public int sex;//性别
    public int age;//年龄
}

上边代码是可以直接访问Person类中的所有属性的,下面我们直接访问一下,看一下效果。

ini 复制代码
public class StartDemo {
    public static void main(String[] args) {
        Person man = new Person();
        man.name = "xz";
        man.phoneNumber = "12345678";
        System.out.println("姓名:" + man.name + "电话:" +man.phoneNumber);
    }
}

上边代码运行后结果如下:

​

从上边代码可以看出我们可以在方法中直接以对象"."属性的形式直接访问对象并给对象赋值,但是这样直接对内部属性赋值有几点弊端:

①破坏封装性:将类内部属性直接暴露给外部使用

②失去数据有效性控制:比如电话号码的验证必须是11位有效数字,年龄不能超过150

③失去灵活性:数据难以维护,修改属性时需要在所有项目使用的属性的地方进行修改添加额外逻辑,增大维护工作量

那么我们在不破坏封装条件下使用private进行私有化改进,再来看一下效果。

typescript 复制代码
public class Person {
    private String name;       // 姓名
    private String address;    // 地址
    private String phoneNumber;// 电话
    private int sex;           // 性别 (0=男性, 1=女性)
    private int age;           // 年龄

   
    public String getName() {
        return name;
    }

    public void setName(String name) {
        if (name == null || name.trim().isEmpty()) {
            throw new IllegalArgumentException("姓名不能为空");
        }
        this.name = name;
    }

   
    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    
    public String getPhoneNumber() {
        return phoneNumber;
    }

    public void setPhoneNumber(String phoneNumber) {
        // 简单的电话号码格式验证
        if (phoneNumber != null && !phoneNumber.matches("\d{3,4}-\d{7,8}")) {
            throw new IllegalArgumentException("电话号码格式应为: XXX-XXXXXXXX");
        }
        this.phoneNumber = phoneNumber;
    }

   
    public int getSex() {
        return sex;
    }

    public void setSex(int sex) {
        if (sex < 0 || sex > 1) {
            throw new IllegalArgumentException("性别值无效 (0=男性, 1=女性)");
        }
        this.sex = sex;
    }

    
    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        if (age < 0 || age > 150) {
            throw new IllegalArgumentException("年龄必须在0-150之间");
        }
        this.age = age;
    }
}

运行一下调用代码看一下效果:

typescript 复制代码
public class StartDemo {
    public static void main(String[] args) {
        Person man = new Person();
        man.setName("张三");
        man.setAge(200);
        System.out.println("姓名:" +man.getName()  + "年龄:" +man.getAge());
    }
}

效果如下:

​

很明显增加校验逻辑后,代码更规范,更容易维护,可读性提升,根据实际情况增加符合实际业务场景的修饰符在项目中是不可忽略的关键,封装可以扩展一下,无疑就是实现对象内部复杂结构隐藏,通过相关接口如seter\getter方法暴露,完成外部对内部细节的逻辑实现。

最后,码字不易,如果大家有所收获,请点亮我的小红心,谢谢支持哈,大家共同进步,加油!

​

相关推荐
sunshine22 girl16 分钟前
Java学习六 Java常见API-1-Radom随机数
java·开发语言·学习
wangbing11251 小时前
使用jps jstack排查系统问题
java
于指尖飞舞1 小时前
java面试题总结
java·开发语言
ZealSinger2 小时前
LangChain4j用AiServices拼Tool
java·rag·ai智能体·langchain4j
vx_Biye_Design2 小时前
springboot高校选课系统82776-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·spring·课程设计·express
Sweet锦3 小时前
不调 Python,不装向量库:我用纯 Java 写了一套以图搜图引擎
java·人工智能·开源·图搜索
如意猴3 小时前
【C++】007 C/C++ 内存管理机制、malloc与new的区别及模板初阶
java·c++·算法
可乐鸡翅yeah_4 小时前
HLS 分片过期清理,直播旧 TS 分片磁盘爆满问题处理
java·后端·spring·m3u8·m3u8在线·音视频在线播放
专业程序开发源4 小时前
SSM校园拍摄交流服务平台36936-计算机课程设计、毕业设计
java·spring boot·后端·python·elasticsearch·php·课程设计
用户094248568034 小时前
第23章:OpenJDK逃逸分析、标量替换与锁优化
java·jvm