面向对象系列之封装

345 阅读3分钟

这是我参与更文挑战的第4天,活动详情查看: 更文挑战

封装是在抽象基础上决定信息是否公开,以及公开等级,核心问题是以什么样的方式暴露哪些信息。

抽象是要找到成员和行为的共性,成员是行为的基本生产资料,具有一定的敏感性,不能直接对外暴露。封装的主要任务是对成员、数据、部分内部敏感行为实现隐藏

对成员的访问与修改必须通过定义公共的接口来进行,另外某些敏感方法或者外部不需要感知的复杂逻辑处理,一般也会进行封装。

像智能音箱,与用户交互的唯一接口就是语音输入,封装了内部的实现细节和相关数据。

设计模式七大原则之一的迪米特法则也说明了封装的要求,A 接口使用 B 接口,对 B 知道的要尽可能少

包(package)这个名称就很明显体现了封装的含义,它能起到把一个模块封装到一起,并由几个接口开放给使用方。使用方只能看到接口信息,而看不到接口实现。另外包解决重名问题,相同类名在相同路径下是不允许的,切换包路径就可以起相同的类名。

访问权限控制

我们编写的程序要想让使用方,能看到一些信息,又不能看到另外一些信息,这就涉及到信息隐藏了。

信息隐藏是面向对象程序设计的重要特点之一,它可以防止类的使用者意外损坏数据,对任何实现细节所作的修改不会影响到使用该类的其它代码,也使类更易于使用。

那在 Java 里,实现信息隐藏的就是访问权限控制机制了。Java 的访问权限控制有 4 个访问修饰符:publicprotectedprivate 和缺省。可以使用这四个访问修饰符修饰类的成员,它们在不同位置的可访问性如下表所示。

位置\访问修饰符publicprotected缺省private
本类可以可以可以可以
本包可以可以可以不可以
子类可以可以不可以不可以
所有可以不可以不可以不可以

你会发现 public 不受任何限制,本类和非本类都可以随意访问(全局友好)。protected 本类及其子类可以访问(父子友好),同一个包中的其它类也可以访问(包内友好)。而缺省的时候,只有相同包中的类可以访问(包内友好)。private 只有本类可以访问,其余都不可以(类内友好)。

除了为类成员添加访问权限控制外,也可以在定义类的时候,为类添加访问修饰符,对类进行访问权限控制。不过对类使用的访问修饰符只有 public 和缺省两种,访问范围也分别是全局友好和包内友好。

getter 与 setter

为了让类成员不对外直接暴露,我们经常把成员变量的访问权限设置成 private,而成员值的访问与修改使用相应的 getter/setter 方法。而不是对 public 的成员进行读取和修改。

package cn.java4u.oo.packagedemo;

/**
 * getter 和 setter 演示
 * @author 蜗牛
 * @from 公众号:蜗牛互联网
 */
public class GetterSetterDemo {

    /**
     * 成员变量私有化
     */
    private String name;

    /**
     * 公开方法获取成员变量值
     *
     * @return 名称
     */
    public String getName() {
        return name;
    }

    /**
     * 公开方法设置成员变量值
     *
     * @param name 名称
     */
    public void setName(String name) {
        this.name = name;
    }
}