1.5 封装的定义
封装是对对象内部部分信息的隐藏,不允许直接对这些信息进行访问,要操作这些信息必须通过预留的接口。
为什么需要对对象信息进行封装
(1)严格控制访问权限,保护属性不被污染,减少了模块间的相互干扰;
(2)更精准的操作属性,能够让使用者清晰的知道实在进行都还是写操作;
(3)方便维护和实现。
封装的关键概念
1.5.1 public 允许项目内任意对象对其进行访问;
在test包内定义Company对象,在该对象内部使用public创建product方法
在pack包内创建主类,来调用Company类的product方法。
通过结果我们可以看出,在调用product方法时几乎没有受到限制。
1.5.2 default
默认允许当前包范围的访问,同样在test包下的Company中定义一个方法,不使用关键字。
在pack包下的主类中进行调用,我们可以发现被拒绝访问了。
将Company移动到pack包下,我们就可以发现允许访问,且能正常执行了。
1.5.3 private
仅允许本对象内部访问,private广泛应用于定义实体,比较直白,就是只允许类内部访问,其他对象不允许直接调用;首先在Company中定义一个私有的属性。
在同包的主类中直接进行调用,会发现我们没有权限进行访问。
但是在本类中不管时直接实例化一个对象,还是通过this直接进行调用都是可以的。
1.5.4 protected
允许同包内和子类访问,同包内好理解,就和默认的差不多,但是子类这里说的就比较模糊,个人感觉说子类也不太准确,准确的应该是子类只可以调用自己继承部分的protected方法,其子类包不可以访问子类继承的该方法,这里主要介绍父子类跨包的使用。首先在pack中定义一个User类,其中定义一个使用protected修饰的类。
在test包下新建Company类,继承User类。
然后在Company中直接使用this和实例化一个Company来调用父类的work方法,发现是能够成功调用的;
但是我们试图通过实例化父类来调用work方法就发现被拒绝访问了,所以我们可以得出,子类调用父类protected修饰的方法时是失败了,子类调用的仅仅是子类继承的部分。
并且当我们试图使用在子类的包内其他对象中调用子类继承的work方法时,发现也被拒绝访问了。
1.5.5 封装的实现步骤
主要介绍平时开发中最常见的一种封装的体现,使用private限制对属性的访问,这种方法俨然已经成为了一种开发规范,比如定义一个User类,将用户的信息属性私有化,隐藏了属性细节:
当需要访问这些属性的时候,会提供一组对外开放的方法(getter和setter方法),分别可以对属性进行读和写:
当要使用这些属性的时候我们就可以通过getter和setter方法来处理:
允许结果如下: