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

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

相关推荐
Asmalin3 小时前
【代码随想录day 22】 力扣 40.组合总和II
java·算法·leetcode
FrankYoou3 小时前
Spring MVC + JSP 项目的配置流程,适合传统 Java Web 项目开发
java·spring·springmvc
七夜zippoe3 小时前
AI 赋能 Java 开发效率:全流程痛点解决与实践案例(一)
java·开发语言·人工智能
翻斗花园刘大胆3 小时前
JavaSE之String 与 StringBuilder 全面解析(附实例代码)
java·开发语言·jvm·git·java-ee·intellij-idea·html5
Poppy .^0^3 小时前
Tomcat 全面指南:从目录结构到应用部署与高级配置
java·tomcat
一 乐3 小时前
在线宠物用品|基于vue的在线宠物用品交易网站(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·|在线宠物用品交易网站
shepherd1113 小时前
深入解析Flowable工作流引擎:从原理到实践
java·后端·工作流引擎
l5657583 小时前
第五十天(SpringBoot栈&Actuator&Swagger&HeapDump&提取自动化)
java·spring boot·spring
荣淘淘4 小时前
互联网大厂Java面试三大回合全解析:从语言特性到性能安全
java·安全·面试·性能优化·互联网·多线程·语言特性