面向对象编程(十三)——面向对象三大特性之封装

面向对象第二大特征:封装/隐藏

一、隐藏/封装(encapsulation)

  • 为什么需要封装?封装的作用和含义?
    • 比如:①我要看电视,只需要按一下开关和换台就可以了。有必要了解电视机内部的结构吗?有必要碰碰显像管吗?②我要开车,……
    • 隐藏对象内部的复杂性,只对外公开简单的接口,便于外界调用,从而提高系统的可拓展性、可维护性。
  • 我们程序设计要追求“高内聚、低耦合
    • 高内聚就是类的内部数据操作细节自己完成,不允许外部干涉;
    • 低耦合:仅暴露少量的方法给外部使用

  封装从字面上来理解就是包装的意思,专业点就是信息隐藏,是指利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联系。系统的其他对象只能通过包裹在数据外面的已经授权的操作来与这个封装的对象进行交流和交互。也就是说用户是无需知道对象内部的细节(当然也无从知道),但可以通过该对象对外的提供的接口来访问该对象。

二、使用访问控制符,实现封装

Java中的控制符,用来控制其他类能否访问Java中的某一方法、变量,即控制java类、方法、变量的可见性、可访问性,从而实现数据封装。

Java中有两个级别的访问控制符。

  • 类级别:控制其他类能否使用该类。有2中类型: public  和 package-private(default)
  • 成员级别:控制某一方法、变量的访问权限。有4种类型: public , protected, package-private(default), private。

类级别:

一个类可以被声明为public,在这种情况下,这个类可以被任何其他类导入使用(但是具体到某个方法或者变量时,需考虑第二层成员级别控制)。
如果类没有控制访问描述符,则表示默认,也就是包私有(package-private),这时该类除了能在本类中使用外,还能被同一个包中的其他类使用。注意包的概念,不包括子包。
备注:如果是内部类,可以使用private修饰符。下面的讨论都针对一般类.

成员级别:

成员级别可以使用类级别中的public,  package-private,其意义与类级别完全一样。除此之外还可以使用private和protected。但是要注意,默认方式不能用于接口变量和方法。
private :如果某个成员被private修饰,则它只能在它所在的类中被使用( The private modifier specifies that the member can only be accessed in its own class.)。
protected: 如果用protected修饰,除了能被同一个包中的其他类(无论是否继承自该类)使用之外,还能被其他包中的子类使用。(The protected modifier specifies that the member can only be accessed within its own package (as with package-private) and,in addition, by asubclass of its class inanother package.)注意接口中的变量和方法一样不能使用protected修饰符。
 
总结如下表:

(一) 封装的要点:

(类里面主要是属性和方法)

Java提供了访问权限控制: private->default->protected->public(权限依次扩大)来封装内部属性和提供外部接口(对字段采用private或protected等修饰符来限制,采用getter和setter来进行有效控制)。

  • 类的属性的处理:
    1. 一般使用private(除非本属性确定让子类继承);静态变量、常量可以public
    2. 针对private的属性,提供相应的get/set方法来访问相关属性,这些方法通常是public,从而提供对属性的读取操作。(一般get/set方法的写法:getXX(); setXX(); 注意:boolean变量的get方法是用:is开头!如isXX(),set方法还是setXX())
  • 一些只用于本类的辅助性方法可以用private。
  • 希望其他类调用的方法用public。

【示例1】private测试:

同在一个包内的test01和test02

test01类:

test02类:

不可以在同一包其他类中调用私有成员或方法。但是可以在同一类中调用。

【示例2】default(默认,什么都不加)测试:

同一个包内:(test01和test02在一个包内)

 把test01类的print()方法前面的控制符private去掉,则在test02类中就可以调用

不同包内:(test01和test02在一个包内,test03在另外的包)

【示例3】protected测试:其他包的子类可以访问。

示例代码的位置图:

在同一个包内,而且是test01的子类,可以访问。

但是在其他包,不是子类,就不可见。

在其他包是test01的子类,可以访问print()

【访问控制符总结】

private修饰的成员,在同一类中可见;

default(默认,成员前面没有加控制符),则是同一类和同一包下面的类可见。

protected修饰的成员,在同一个类、同一个包下面的类可见,并且在不同包的子类也可见。

public修饰的成员在所有类都可见。

 

posted @ 2016-02-04 14:15  萌小Q  阅读(1277)  评论(0编辑  收藏  举报