oop特性——封装

本文深入浅出地介绍了面向对象编程中的封装概念,解释了封装如何通过控制访问权限、使用set和get方法等方式来保护类的内部状态,以及这种方式带来的诸多优点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值