OOP特性——封装
前言
众所周知,面向对象程序设计的三大特性:封装,继承,多态
,但是要是清晰、详细的讲一讲,很多人可能就比较迷糊了。
今天我想通过这篇笔记,把封装的概念通过具体的例子表现出来,让我以后不再讲不清楚。
本文内容:
* 前言
* 封装的概念及思想
* 封装的实现
* get、set方法
封装的概念及思想
在《Java编程思想》
中有一件有趣的小事:第七章 复用类
中讲解了“组合”和“继承”两种重要的手段;第八章 多态
中讲解了多态的各种细节。而并没有单独的将封装作为哪怕一个小章节名出现在书中。而封装思想却贯穿始终。
在《Java编程思想》第六章 访问权限控制 6.3 接口和实现
中提出
“访问权限的控制常被成为具体实现的隐藏。把数据和方法包装进类中,以及具体实现的隐藏,常共同被称作是封装”。
在我看来,封装这一特性,并不像继承和多态一样,有着具体的关键字或者代码实现,而是更趋向于一种方法或者思想。
“封装,是指一种将抽象性函式接口的实现细节部份包装、隐藏起来的方法。”
我们可以将封装看成一个对内是保护,对外是隐藏的保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。要访问该类的代码和数据,必须通过严格的接口控制。
通俗的将,我们可以想象将代码装到一个盒子里面保护起来,若要用到盒子里面的代码,只能通过盒子给出你的接口,以其所规定的方式进行操作。
这样做有两点好处:
* 我们可以防止使用者对类内部定义的属性(对象的成员变量)的直接操作所导致数据的错误、混乱或安全性问题。
* 通过封装,我们可以只修改我们自己的实现代码,而不用去管盒子里面的代码,使代码更容易理解与维护。
这样我们可以总结出封装的优点:
* 良好的封装能够减少耦合。
* 类内部的结构可以自由修改。
* 可以对成员变量进行更精确的控制。
* 隐藏信息,实现细节。
封装的实现
那么封装这种安全又方便的思想,是如何体现在代码中的呢?
首先就是要控制访问权限,众所周知,在Java中有四种访问权限:private,protected,包访问权限,public 应用于不管是域还是方法的定义之前,或是用于类class关键字之前。
关于访问权限的具体内容就不赘述了,但是控制对成员的访问权限是十分重要的。
有两个原因:
* 为了使用户不要碰那些他们不应该碰的东西,将方法或是域设为private是很有必要的。
* 可以更改类的内部工作,而不对外部代码产生影响。
那么我们将域和方法设置为私有权限,如何对其进行操作呢?
我们可以通过两种方法:
第一种即通过public方式的构造器(或称构造函数),对象一实例化就对该变量赋值。
第二种就是通过set和get方法。
这里我举一个特定的例子,我定义一个Person类,该类中有name、age这两个私有域变量,然后我定义setname()、getname()、setage()、getage()这四个方法,通过这四个方法来实现对name和age的操作。这样一来,我不用直接对Person类中的域变量操作,而是通过set和get方法间接地操作这些变量,这样就能提高域变量的安全性,同时又保证了域变量的封装型。
其中要注意的一个小细节是,为了解决实例变量(方法中传进来的参数)和局部变量(方法内的变量)之间发生的同名的冲突,要使用this关键字。
举个例子
public class EncapTest{
private String name;
private String idNum;
private int age;
public int getAge(){
return age;
}
public String getName(){
return name;
}
public String getIdNum(){
return idNum;
}
public void setAge( int newAge){
age = newAge;
}
public void setName(String newName){
name = newName;
}
public void setIdNum( String newId){
idNum = newId;
}
}
通过如下的例子说明EncapTest类的变量怎样被访问:
public class RunEncap{
public static void main(String args[]){
EncapTest encap = new EncapTest();
encap.setName("James");
encap.setAge(20);
encap.setIdNum("12343ms");
System.out.print("Name : " + encap.getName()+ " Age : "+ encap.getAge());
}
}
以上代码编译运行结果如下:
Name : James Age : 20
set方法和get方法在编程中会大量用到,所幸的是在Eclipse中已经为我们提供了如何快速生成set和get方法的功能:
步骤一:在声明的类中,单击鼠标右键,选择source;
步骤二:选择Generate Getters and Setters;
步骤三:根据需要配置,如位置,顺序等,在选择确定即可;