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()); } }
可以看到虽然在创建对象的时候就初始化好了成员变量的值,但是后续通过对象名+.的方式依旧是把对象的成员变量进行修改了.
对于这种情况,我们一般建议使用private修饰符(类私有的)修饰成员变量.
将成员变量设置成private修饰的之后,再次通过对象名+.的方法就无法对成员变量进行访问了.
但此时又会有一个问题.如果此时想修改成员变量的值该怎么办?
修改new对象的时候传入的参数,重新执行代码? 这是一种办法,但如果要在代码执行的过程中改变呢.这个时候上面的那种方法就不适用了 对于private修饰的成员变量,我们可以提供对应的getter和setter方法.
虽然private修饰的成员变量是类私有的,但是我们可以提供对应的方法帮助我们进行修改
public是公开的,任何地方都可以进行访问,在后面访问权限修饰符中会重点讲解
代码执行结果:
正确运行实例:
除了set方法,别忘了还有get方法.如果我们只想要拿到年龄,就可以去表用get方法
运行结果:
4.封装的好处
数据的隐藏:封装可以将数据隐藏在类的内部,避免了外部程序对数据的直接访问和修改,提高了程序的安全性和稳定性。
实现细节的隔离:封装可以隐藏实现细节,使得类的使用者只需要知道如何使用类的接口,而不需要关注具体的实现细节,降低了耦合度,提高了代码的可维护性和可扩展性。
接口的清晰:封装可以将类的接口与实现分离,使得类的使用者只需要关注接口的定义,而不需要了解实现细节,使得接口更加清晰和易于使用。
代码的重用:封装可以将相似的功能封装成类,使得代码更加模块化,提高了代码的重用性,减少了代码的冗余。
5.总结
通过封装,可以实现代码的可维护性、可扩展性和可重用性。封装可以隐藏类的实现细节,保护数据的安全性,提高代码的可读性和可靠性。同时,封装也可以提高代码的可扩展性,允许在不影响类的内部实现的情况下对其进行扩展和修改。