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方法暴露,完成外部对内部细节的逻辑实现。

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

相关推荐
夜不会漫长13 分钟前
C++:类和对象(2)
java·javascript·c++
IT毕设实战小研17 分钟前
基于大数据的国内主要农作物产量趋势分析与可视化
android·java·大数据·django·课程设计
星辞秋19 分钟前
Java 入门实战:从零搭建环境到写出第一个可用的命令行工具
java
ch.ju22 分钟前
Java—idea知识:如何创建新项目
java·开发语言·intellij-idea
土司大王24 分钟前
LeetCode hot100——74.搜索二维矩阵:Java 二分模板
java·算法·leetcode
2302_1111 小时前
java依赖小结
java·运维·数据库
sunshine22 girl1 小时前
Java学习三 高级语法3, 方法
java·学习
captain3761 小时前
网络原理(3)-TCP核心机制连接管理▲▲▲
java·服务器·网络·ide·网络协议·tcp/ip·java-ee
企业数字化笔记2 小时前
固定资产历史数据怎么导入系统?Excel模板、字段映射和数据校验
android·java·数据库·后端
troy1282 小时前
Python 基础语法(一):变量、数据类型与运算符
java·服务器·python