目录

  • 1、面向对象的基本概述
  • 2、三大基本特征之【封装】
  • 3、对象授权的方式—访问控制符
  • 4、实践看封装


1、面向对象的基本概述

JAVA是一门面向对象的高级编程语言,在JAVA语言中,除8个基本数据类型值以外一切都是对象,对象是JAVA程序的核心。
在JAVA程序中任意一个对象都可以都说成是一个类,类是JAVA程序的基本组成单位,所有的JAVA程序都可以说是由一个个类组成的。 JAVA作为一个面向对象的编程语言,完全支持面向对象的三大基本特征:【封装】、【继承】、【多态】。

2、三大基本特征之【封装】

JAVA的基本组成单位是类,因此封装也是基于面向类对象进行操作的,封装这两个字从字面意思上不难理解,就是将对象的信息隐藏在对象的内部,实现对对象信息的隐藏和保护,其它对象或者外部程序想要操作或者访问该对象内的信息,只能通过该对象所"授权"的方法来对该对象进行访问或者操作。
因此封装有两个方面的含义

  • 就是把该隐藏的隐藏——实现对对象内部信息的隐藏和保护。
  • 把该暴露的暴露——实现与其它对象和外部程序的交互。

作为面向对象的三大基本特征之一,封装也有着自己的优点

  • 隐藏对象内部信息和实现细节,提高了代码的安全性。
  • 可以保证对象的完整性,实现对对象更精确的操作。
  • “高内聚”:封装对象详细信息, 从而便于修改对象的信息,提高对象的可维护性。
  • “低耦合”:良好的封装可以将一个个对象封装一个个独立而又完整的个体,便于修改和扩展,从而降低耦合。

3、对象授权的方式—访问控制符

JAVA访问控制符共有4个,分别为private,default,protected和public,其访问控制级由小到大分别为:

java是三大特征还是四大特征 java三大基本特征_java是三大特征还是四大特征



访问控制符所控制的范围如下:

java是三大特征还是四大特征 java三大基本特征_java_02

  • private:只能被被当前对象(类)所访问。
  • default:能被当前包下的其它对象(类)访问。
  • protected:能被当前包下的其它对象(类)访问,也能被不同包下的子类所访问。
  • public:可以被任意对象访问。

4、实践看封装

首先看下面一个Girl类:

/**
 * 性别、年龄、姓名是一个女孩的属性
 * Girl类对她的属性进行了封装
 */
public class Girl {
    /**
     * 性别
     */
    private String gender;
    /**
     * 年龄
     */
    private int age;
    /**
     * 姓名
     */
    private String name;
    
    /**
     * 获取性别
     *
     * @return 返回性别结果
     */
    public String getGender() {
        return "女";
    }

    /**
     * 获取年龄
     *
     * @return 返回年龄结果
     */
    public String getName() {
       if (this.age < 18) {
            return "小可耐";
        } else if (this.age > 18 && this.age < 30) {
            return "真名";
        } else {
            return "假名";
        }
    }

    /**
     * 设置年龄
     *
     * @param age 年龄
     */
    public void setAge(int age) {
         if (age == 18) {
            this.age = age;
        } else {
            System.out.println("只接受18岁!");
        }
    }
}

本文前面提到了,封装有两个方面的含义,就是将该隐藏的信息隐藏起来,将该暴露的暴露出去:对于Girl这个对象,她将自己的性别、年龄、姓名这些属性进行隐藏,实现了对自己信息的保护。但是这个对象也需要和对象进行交互,因此也需要暴露出一些自己的属性,让其他对象对其有一定的了解,因此Girl这个对象通过getGender()方法、getName()方法和setAge()方法将自己的性别属性、姓名属性和年龄暴露出来了。
下面通过Girl这个对象看一下封装的优点。

  • 隐藏对象内部信息和实现细节,提高了代码的安全性。以getGender()方法为例,其它对象看不到这个方法的具体实现,而且因为本身是Girl对象,所以对调用这个方法的对象只返回结果性别“女”,而且不允许其它对象修改Girl对象的gender属性,保证了gender属性的安全。这就是封装的强大,对于特定的属性,可以进行隐藏,且可以不允许其它对象对其操作以保证这个属性的安全。
  • 可以保证对象的完整性,实现对对象更精确的操作。以setAge()方法为例。setAge个()方法可以让其他对象对age这个属性进行赋值,但是这个方法对年龄赋值进行了约束,只接受18岁,不允许赋值其它年龄,不然你赋值一个女孩500岁,那不成老妖怪了。所以封装可以实现对对象内部的某个属性进行更精确的操作。
  • “高内聚和低耦合” 。
    内聚性:又称块内联系。指模块的功能强度的度量,即一个模块内部各个元素彼此结合的紧密程度的度量。若一个模块内各元素(语名之间、程序段之间)联系的越紧密,则它的内聚性就越高。反之内聚性越低。
    耦合性:也称块间联系。指软件系统结构中各模块间相互联系紧密程度的一种度量。模块之间联系越紧密,其耦合性就越强,模块的独立性则越差。反之则耦合性越低,独立性越好。
    以getName()方法为例,通过封装的手段,让getName()方法根据Girl对象的age属性的大小返回相应的名称,因此封装可以实现高内聚。
    假设Girl这个对象与其他对象相互独立,在Girl对象内部,通过封装的方法,新增某一个私有属性,比如boyFriend这个属性,那么这个属性也不会对其它调用Girl对象的其它对象造成影响。所以封装可以实现低耦合。
    最后看一下Girl这个类用到的访问控制符:priave和public
    对于Girl对象的成员的私有属性(gender、age、name)都是private访问控制符进行修饰的,因此只有在Girl这个对象内部才可以对这些成员变量进行访问。
    对于暴露出去的getGender()方法、getName()方法和setAge()方法都是通过public访问控制符进行修饰的,这代表着其它任一对象都可以通过Gilr对象对这些方法进行操作。