oop特性——封装

xiaoxiao2021-02-27  158

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; 步骤三:根据需要配置,如位置,顺序等,在选择确定即可;

转载请注明原文地址: https://www.6miu.com/read-17146.html

最新回复(0)