面向对象三大特性一(封装性)
1.什么是封装呢?
所谓封装,就是用类设计对象处理某一个事物的数据时,应该把要处理的数据,以及处理数据的方法,都设计到一个对象中去。
比如:在设计学生类时,把学生对象的姓名、语文成绩、数学成绩三个属性,以及求学生总分、平均分的方法,都封装到学生对象中来。
现在我们已经知道什么是封装了。那我们学习封装,学习个啥呢? 其实在实际开发中,在用类设计对事处理的数据,以及对数据处理的方法时,是有一些设计规范的。封装的设计规范用8个字总结,就是:合理隐藏、合理暴露
比如,设计一辆汽车时,汽车的发动机、变速箱等一些零件并不需要让每一个开车的知道,所以就把它们隐藏到了汽车的内部。
把发动机、变速箱等这些零件隐藏起来,这样做其实更加安全,因为并不是所有人都很懂发动机、变速箱,如果暴露在外面很可能会被不懂的人弄坏。
在设计汽车时,除了隐藏部分零件,但是还是得合理的暴露一些东西出来,让司机能够操纵汽车,让汽车跑起来。比如:点火按钮啊、方向盘啊、刹车啊、油门啊、档把啊… 这些就是故意暴露出来让司机操纵汽车的。
好了,到现在我们已经理解什么是封装的一些规范了。就是:合理暴露、合理隐藏
2.类和类成员的访问控制
包实际上是一种访问控制机制,通过包来限制和制约类之间的访问关系。访问修饰符
也同样可以限制和制约类之间的访问关系。
Java中的封装是通过访问修饰符实现的。访问修饰符有3个(4种),分别是public、protected、package-access(包访问修饰符)、private。
- public访问修饰符
被public修饰的成员变量和成员方法可以在所有类中访问。所谓在某类中访问某成员变量是指在该类的方法中给该成员变量赋值和取值。所谓在某类中访问成员方法是指在该类的方法中调用该成员方法。所以在所有类的方法中,可以使用被public修饰的成员变量和成员方法。
- protected访问修饰符
被protected修饰的成员变量和成员方法可以在声明它的类中访问,在该类的子类中访问,也可以在与该类位于同一个包中的类访问,但不能在位于其它包的非子类中访问。
- package-access(包访问修饰符)
缺省指不使用权限修饰符。不使用权限修饰符修饰的成员变量和成员方法可以在声明它的类中访问,也可以在与该类位于同一个包中的类访问,但不能在位于其它包的类中访问。
- private访问修饰符
private修饰的成员变量和成员方法只能在声明它们的类中访问,而不能在其它类(包括子类)中访问。
3.封装在代码中的体现
知道什么是封装之后,那封装在代码中如何体现呢?一般我们在设计一个类时,会将成员变量隐藏,然后把操作成员变量的方法对外暴露。
Java中封装的实质就是将类的状态信息(成员变量)、方法等隐藏在类的内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息(成员变量)的操作和访问。在Java中,可以使用访问修饰符来控制类中的数据和方法的访问级别,从而实现封装。
封装反映了事物相对的独立性,有效避免了外部错误对此对象的影响,并且能对对象使用者由于大意产生的错误操作起到预防作用。同样面向对象编程提倡对象之间实现松耦合关系。
封装的优点包括:
(1)防止外部直接访问类的内部数据,可以保护数据的安全性。
(2)通过限制外部访问,可以更好地控制数据的正确性和完整性。
(3)可以隐藏类的实现细节,使得类的用户不需要了解类的内部实现细节,只需要知道如何使用类提供的接口。
封装是Java中面向对象编程的重要特征之一,它能够提高代码的可维护性和可扩展性,并且可以保护类的数据安全性,使得代码更加健壮。因此,在Java中编写程序时,应该尽可能地使用封装技术来实现类的封装。
这里需要用到一个修饰符,叫private,被private修饰的变量或者方法,只能在本类中被访问。
如下图所示, private double score; 就相当于把score变量封装在了Student对象的内部,且不对外暴露,你想要在其他类中访问score这个变量就,就不能直接访问了;
设置getter/setter方法
为字段添加getter/setter方法。在Java中,getter和setter方法是用于访问和修改对象的私有字段(属性)的常用约定。它们遵循一定的命名规则和编码惯例。以下是常见的getter和setter方法的规则:
Getter方法
命名规则:使用属性名前加上"get"作为方法名前缀,属性名的首字母通常大写。
返回类型:通常与属性的类型相同。
方法体:直接返回属性的值。
Setter方法
命名规则:使用属性名前加上"set"作为方法名前缀,属性名的首字母通常大写。
参数:通常只有一个参数,参数类型与属性的类型相同。
方法体:将传入的参数值赋给属性。
布尔类型属性的Getter方法:
命名规则:使用属性名前加上"is"作为方法名前缀,属性名的首字母通常大写。
返回类型:通常是布尔类型(boolean)。
方法体:返回属性的值。
如果你想给Student对象的score属性赋值,得调用对外暴露的方法 setScore(int score) ,在这个方法中可以对调用者传递过来的数据进行一些控制,更加安全。
当你想获取socre变量的值时,就得调用对外暴露的另一个方法 getScore()