查看原文
其他

一文搞懂Java面向对象编程中的封装机制

学研妹 Java学研大本营 2024-01-02

本文详细阐述Java面向对象编程的关键特性:封装。

长按关注《Java学研大本营》

Java是一种面向对象的编程语言,即它是围绕对象的概念设计的。上篇文章介绍了Java面向对象编程的关键特性“继承”,本文介绍另一个关键特性:封装。

1 封装

封装是面向对象编程(OOP)的一个基本概念,也是Java编程语言的核心特性。它是OOP的四个基本原则之一,另外三个是继承、多态和抽象。

封装本质上是将类的实现细节隐藏起来,提供一个公共接口与类进行交互。这意味着类的内部工作原理被保持为私有,只能通过一组明确定义的公共方法来访问。

2 访问修饰符

在Java中,封装是通过使用访问修饰符来实现的。访问修饰符是用于指定特定方法或变量的访问级别的关键字。Java中有四种访问修饰符:private、protected、public和默认的。

私有访问修饰符用于限制对方法或变量的访问范围,使用私有访问修饰符,只有在定义该成员的类内部才能访问该成员,其他类无法直接访问。受保护的访问修饰符用于将方法或变量的访问限制在定义它的类及其子类中,其他类无法直接访问。公共访问修饰符允许任何类访问方法或变量。默认的访问修饰符(也称为包私有访问修饰符)仅允许同一包中的类访问方法或变量。

通过使用访问修饰符来限制对类的内部工作原理的访问,封装有助于防止对类状态的意外更改,并能其更容易维护和扩展代码。例如,如果一个类有一个私有变量,只能通过公共setter方法访问,那么向setter方法添加验证逻辑会更容易,不必担心其他类直接访问变量。

封装还有助于促进模块化和代码重用,因为它允许将类用作更大、更复杂系统的构建块。通过在公共接口后面隐藏类的实现细节,其他开发人员可以使用该类而无需了解其工作细节,从而简化了代码的复杂度。这使开发和维护复杂系统变得更加容易,因为对系统的一部分进行更改不太可能对系统的其他部分产生意外后果。此外,封装还可以帮助开发人员更容易地理解和调试代码,因为它使代码更易于阅读和理解。

总之,封装是OOP的一个基本概念,也是Java编程语言的一个核心特性。它通过隐藏类的实现细节在公共接口后面,有助于促进模块化、代码重用和可维护性。通过使用访问修饰符来限制对类的内部工作原理的访问,封装有助于防止对类状态的意外更改,并使其更易维护和扩展代码。

3 示例

以下是Java中如何使用封装的示例:

public class Employee {
    private String name;
    private int age;
    private double salary;

    public Employee(String name, int age, double salary) {
        this.name = name;
        this.age = age;
        this.salary = salary;
    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }
}

在这个例子中,我们有一个Employee类,它有三个私有实例变量:name、age和salary。这些变量仅在Employee类本身内部可访问,其他类无法访问。

为了提供一个与这些变量进行交互的公共接口,我们定义了三个公共方法:getName()、getAge()和getSalary()。这些方法返回私有实例变量的值。

我们还定义了三个公共的setter方法:setName()、setAge()和setSalary()。这些方法允许其他类以受控的方式修改私有实例变量的值。例如,我们可以在setSalary()方法中添加验证逻辑,以确保新工资大于或等于员工的当前工资:

public void setSalary(double salary) {
    if (salary >= this.salary) {
        this.salary = salary;
    } else {
        System.out.println("Error: new salary cannot be lower than current salary");
    }
}

通过使用私有实例变量和公共getter和setter方法,我们封装了Employee类的实现细节,并提供了一个受控的接口来与之交互。这样,其他类可以创建Employee实例并使用其公共方法来获取和设置其私有实例变量的值,而无需了解如何实现这些变量。这有助于促进模块化、代码重用和可维护性,同时有助于防止对Employee类状态的意外更改,提高代码的可靠性和安全性。

推荐书单

《项目驱动零起点学Java》

《项目驱动零起点学Java》贯穿6个完整项目,经过作者多年教学经验提炼而得,项目从小到大、从短到长,可以让读者在练习项目的过程中,快速掌握一系列知识点。

作者是国内知名Java教学者和传播者,一路披荆斩棘,兢兢业业20余年。积累了丰富的“培”“训”经验,也产出了很多优质的教学理论。

Java语言经过数十年的发展,体系逐渐变得庞大而复杂,本书芟繁就简,提炼出了最为重要的知识点,可以让读者轻松上手。本书配套有专栏课程,课程中提供了扩展内容。

购买链接:https://item.jd.com/13607758.html

精彩回顾

一文搞懂Java面向对象编程中的继承机制

4步实现Android中的Websocket

用好这4个设计模式,完成Java中的大部分任务

5个Java开发者不可不知的编程库

FPGA具有什么强大的功能,竟然可以代替CPU和GPU?

长按关注《Java学研大本营》
长按访问【IT今日热榜】,发现每日技术热点


继续滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存