面向对象的特征一:封装与隐藏
1. 为什么要引入封装性 ?
- 我们程序设计追求“高内聚,低耦合”。
- 高内聚:类的内部数据操作细节自己完成,不允许外部干涉
- 低耦合:仅对外暴露少量的方法用于使用
- 隐藏对象内部的复杂性,只对外公开简单的接口。便于外界调用,从而提高系统的可扩展性、可维护性。通俗的说,把该隐藏的隐藏起来,该暴露的暴露出来。这就是封装性的设计思想。
2. 问题引入:
当我们创建一个类的对象以后,我们可以通过 “对象.属性” 的方式,对对象的属性进行赋值。这里,赋值操作要受到属性的数据类型和存储范围的制约。除此之外,没其他制约条件。但是,在实际问题中,我们往往需要给所熟悉赋值加入额外的限制条件。这个条件就不能在属性声明时体现,我们只能通过方法进行限制条件的添加。(比如:setLegs()同时,我们需要避免用户再使用 “对象.属性” 的方式对属性进行赋值。则需要将属性声明为私有的(private))
——》此时,针对于属性就体现了封装性
3、封装性思想具体的代码体现:
体现一:将类的属性xxx私化(private),同时,提供公共的(public)方法来获取(getXxx)和设置(setXxx)此属性的值
private double radius;
public void setRadius(double radius){
this.radius = radius;
}
public double getRadius(){
return radius;
}
体现二:不对外暴露的私有的方法
体现三:单例模式(将构造器私有化)
体现四:如果不希望类在包外被调用,可以将类设置为缺省的
4、Java规定的四种权限修饰符
- 权限从小到大顺序为:private < 缺省 < protected < public
- 具体是修饰符范围:
注:对于class的权限修饰符只可以用public和default(缺省)。
-
- public类可以在任意地方被访问
- default类只可以被同一个包内部的类访问
- 权限修饰符可用来修饰的结构说明:
4种权限都可以用来修饰类的内部结构:属性、方法构造器、内部类修饰类的话,只能使用:缺省、public
实例如下:
- package day10.atguigu.java;
- public class AnimalTest {
- public static void main(String[] args) {
- Animal a = new Animal();
- a.name = "大黄";
- a.age = 1;
- // a.legs = 4;
- a.show();
- // a.legs = -4;
- a.setLegs(6);
- a.show();
- System.out.println(a.name);
- }
- }
- class Animal{
- String name;
- int age;
- private int legs;//腿的个数
- //对属性的设置
- public void setLegs(int l){
- if (l >= 0 && 1 % 2 == 0){
- legs = l;
- }else {
- legs = 0;
- //抛出一个异常(暂时没有讲)
- }
- }
- //对属性的获取
- public int getLegs(){
- return legs;
- }
- public void eat(){
- System.out.println("动物进食");
- }
- public void show(){
- System.out.println("name = " + name + ",age = " + age + ",legs = " +legs);
- }
- //提供关于属性age的get和set方法
- public int getAge(){
- return age;
- }
- public void setAge(int a){
- age = a;
- }
- }