【Java|基础篇】面向对象三大特性之封装

简介: 面向对象有三个特性:封装,继承和多态,本文主要讲解封装. 封装是面向对象编程的基本原则之一,它可以提高程序的安全性、稳定性、可维护性和可扩展性,减少了代码的冗余,提高了代码的重用性。因此,在进行面向对象编程时,封装是一个非常重要的概念。

1.前言

面向对象有三个特性:封装,继承和多态,本文主要讲解封装. 封装是面向对象编程的基本原则之一,它可以提高程序的安全性、稳定性、可维护性和可扩展性,减少了代码的冗余,提高了代码的重用性。因此,在进行面向对象编程时,封装是一个非常重要的概念。


2.什么是封装

封装是一种面向对象编程的概念,它指的是将数据与方法组合在一起,形成一个类,在类的内部对数据进行操作和控制,从而达到保护数据、隔离复杂性和提高安全性的目的。


封装的原则: 对象代表什么,就应该封装对应的数据,并提供对应的数据对应的行为.

简单点理解就是使用访问权限修饰符对类中的成员变量和成员方法来限制访问权限.


3.如何更好的封装

先来看以下这部分的代码:


class Student{
    String name;
    int age;
    String sex;
    public Student(String name, int age, String sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", sex='" + sex + '\'' +
                '}';
    }
}
public class Demo8 {
    public static void main(String[] args) {
        Student student = new Student("张三",18,"男");
        student.age = -15;
        System.out.println(student.toString());
    }
}


image.png

可以看到虽然在创建对象的时候就初始化好了成员变量的值,但是后续通过对象名+.的方式依旧是把对象的成员变量进行修改了.


对于这种情况,我们一般建议使用private修饰符(类私有的)修饰成员变量.

image.png

将成员变量设置成private修饰的之后,再次通过对象名+.的方法就无法对成员变量进行访问了.


但此时又会有一个问题.如果此时想修改成员变量的值该怎么办?

修改new对象的时候传入的参数,重新执行代码? 这是一种办法,但如果要在代码执行的过程中改变呢.这个时候上面的那种方法就不适用了 对于private修饰的成员变量,我们可以提供对应的getter和setter方法.


虽然private修饰的成员变量是类私有的,但是我们可以提供对应的方法帮助我们进行修改

public是公开的,任何地方都可以进行访问,在后面访问权限修饰符中会重点讲解

image.png

代码执行结果:

image.png

正确运行实例:

image.png

除了set方法,别忘了还有get方法.如果我们只想要拿到年龄,就可以去表用get方法

image.png

运行结果:

image.png


4.封装的好处

数据的隐藏:封装可以将数据隐藏在类的内部,避免了外部程序对数据的直接访问和修改,提高了程序的安全性和稳定性。


实现细节的隔离:封装可以隐藏实现细节,使得类的使用者只需要知道如何使用类的接口,而不需要关注具体的实现细节,降低了耦合度,提高了代码的可维护性和可扩展性。


接口的清晰:封装可以将类的接口与实现分离,使得类的使用者只需要关注接口的定义,而不需要了解实现细节,使得接口更加清晰和易于使用。


代码的重用:封装可以将相似的功能封装成类,使得代码更加模块化,提高了代码的重用性,减少了代码的冗余。


5.总结

通过封装,可以实现代码的可维护性、可扩展性和可重用性。封装可以隐藏类的实现细节,保护数据的安全性,提高代码的可读性和可靠性。同时,封装也可以提高代码的可扩展性,允许在不影响类的内部实现的情况下对其进行扩展和修改。

相关文章
|
29天前
|
存储 安全 Java
Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
【10月更文挑战第17天】Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
57 2
|
30天前
|
存储 Java
深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。
【10月更文挑战第16天】本文深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。HashSet基于哈希表实现,添加元素时根据哈希值分布,遍历时顺序不可预测;而TreeSet利用红黑树结构,按自然顺序或自定义顺序存储元素,确保遍历时有序输出。文章还提供了示例代码,帮助读者更好地理解这两种集合类型的使用场景和内部机制。
38 3
|
30天前
|
存储 Java 数据处理
Java Set接口凭借其独特的“不重复”特性,在集合框架中占据重要地位
【10月更文挑战第16天】Java Set接口凭借其独特的“不重复”特性,在集合框架中占据重要地位。本文通过快速去重和高效查找两个案例,展示了Set如何简化数据处理流程,提升代码效率。使用HashSet可轻松实现数据去重,而contains方法则提供了快速查找的功能,彰显了Set在处理大量数据时的优势。
33 2
|
1月前
|
存储 算法 Java
Java Set因其“无重复”特性在集合框架中独树一帜
【10月更文挑战第14天】Java Set因其“无重复”特性在集合框架中独树一帜。本文深入解析Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定的数据结构(哈希表、红黑树)确保元素唯一性,并提供最佳实践建议,包括选择合适的Set实现类和正确实现自定义对象的`hashCode()`与`equals()`方法。
30 3
|
12天前
|
分布式计算 Java API
Java 8引入了流处理和函数式编程两大新特性
Java 8引入了流处理和函数式编程两大新特性。流处理提供了一种声明式的数据处理方式,使代码更简洁易读;函数式编程通过Lambda表达式和函数式接口,简化了代码书写,提高了灵活性。此外,Java 8还引入了Optional类、新的日期时间API等,进一步增强了编程能力。这些新特性使开发者能够编写更高效、更清晰的代码。
26 4
|
21天前
|
Java 关系型数据库 数据库
面向对象设计原则在Java中的实现与案例分析
【10月更文挑战第25天】本文通过Java语言的具体实现和案例分析,详细介绍了面向对象设计的五大核心原则:单一职责原则、开闭原则、里氏替换原则、接口隔离原则和依赖倒置原则。这些原则帮助开发者构建更加灵活、可维护和可扩展的系统,不仅适用于Java,也适用于其他面向对象编程语言。
14 2
|
27天前
|
存储 Java API
优雅地使用Java Map,通过掌握其高级特性和技巧,让代码更简洁。
【10月更文挑战第19天】本文介绍了如何优雅地使用Java Map,通过掌握其高级特性和技巧,让代码更简洁。内容包括Map的初始化、使用Stream API处理Map、利用merge方法、使用ComputeIfAbsent和ComputeIfPresent,以及Map的默认方法。这些技巧不仅提高了代码的可读性和维护性,还提升了开发效率。
52 3
|
27天前
|
存储 安全 Java
Java Map新玩法:深入探讨HashMap和TreeMap的高级特性
【10月更文挑战第19天】Java Map新玩法:深入探讨HashMap和TreeMap的高级特性,包括初始容量与加载因子的优化、高效的遍历方法、线程安全性处理以及TreeMap的自然排序、自定义排序、范围查询等功能,助你提升代码性能与灵活性。
24 2
|
30天前
|
Java 开发者
在Java集合世界中,Set以其独特的特性脱颖而出,专门应对重复元素
在Java集合世界中,Set以其独特的特性脱颖而出,专门应对重复元素。通过哈希表和红黑树两种模式,Set能够高效地识别并拒绝重复元素的入侵,确保集合的纯净。无论是HashSet还是TreeSet,都能在不同的场景下发挥出色的表现,成为开发者手中的利器。
27 2
|
30天前
|
Java
Java Set以其“不重复”的特性,为我们提供了一个高效、简洁的处理唯一性约束数据的方式。
【10月更文挑战第16天】在Java编程中,Set接口确保集合中没有重复元素,每个元素都是独一无二的。HashSet基于哈希表实现,提供高效的添加、删除和查找操作;TreeSet则基于红黑树实现,不仅去重还能自动排序。通过这两个实现类,我们可以轻松处理需要唯一性约束的数据,提升代码质量和效率。
35 2