封装( Encapsulation) 是面向对象的三大特征之一(另外两个是继承和多态) ,从字面意思上看,顾名思义就是将具体的实现细节装到一个容器中,并封闭起来,防止容器外部直接访问容器内部的实现细节,仅公开暴露指定的访问路径;面向对象封装实际上指的是将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是通过该类所提供的方法来实现对内部信息的操作和访问。
一、面向对象封装主要是为了实现以下目的:
1.隐藏类的实现细节
2.让使用者只能通过事先预定 的方法来访问数据,从而可以在该方法里加入控制逻辑,限制对成员变量的不合理访问
3.可进行数据检查,从而有利于保证对象信息的完整性。
4.便于修改,提高代码的可维护性
二、面向对象的封装一般封装为以下几个几个类型:
1.封装成常量/变量:
如:计算圆周长度,未封装前的代码如下:
//封装前:
decimal result = 2 * 3.141592653M * 10.8M;
Console.WriteLine("圆周长度是:{0}", result);
封装后的代码如下:
//封装后:
const decimal PI = 3.141592653M;
decimal radius = 10.8M;
decimal circumference = 2 * PI * radius;
Console.WriteLine("圆周长度是:{0}", circumference);
你觉得哪种可读性更高一些呢?从我看来,很显然封装后的代码更易被他人所理解,因为圆周长的计算公式就是:C=2πr;从circumference就知道是圆周长的结果,而等号右边刚好符合圆周长计算公式,所以非常的直观,可读性由此体现出来;
2.封装成方法/函数/属性:
//计算圆周长
static decimal ComputeCircumference(decimal radius)
{
const decimal PI = 3.141592653M;
return 2 * PI * radius;
}
//用法:
Console.WriteLine("圆周长度是:{0}", ComputeCircumference(10.8M));
通过封装成方法后,我们看到ComputeCircumference方法,就知道是计算圆周长,同时我可以用此方法来计算所有的不同半径的圆的周长,可读性、复用性由此体现出来;
3.封装成类:
///
/// 圆类 ///
class Circle
{
//原点X坐标
public int OriginX
{ get; set; }
//原点Y坐标
public int OriginY
{ get; set; }
//半径
public decimal Radius
{ get; set; }
public Circle(int originX, int originY, decimal radius)
{
this.OriginX = originX;
this.OriginY = OriginY;
this.Radius = radius;
}
///
/// 获取圆周长度 ///
///
public decimal GetCircumference()
{
const decimal PI = 3.141592653M;
return 2 * PI * this.Radius;
}
}
//用法:
Circle circle = new Circle(10,10,10.8M);
Console.WriteLine("圆周长度是:{0}", circle.GetCircumference());
从上述示例代码可以看出,我定义(封装)了一个圆类,圆类有原点及半径,同时有一个获取圆周长度的方法,该圆类可以用来表示多个不周大小不同位置的圆,而且都能获得圆的圆周长,至于圆周长是如何计算的,PI的精度是多少,我们无需知道也无法直接更改,故隔离性、可读性、复用性都体现出来了;
4.封装成层/包/程序集:
有的时候因系统架构的需要,我们可能需要将描述各种图形类信息的代码单独封装成一个程序集、包、命名空间,以便于代码的管理,于是我们可以将上述Circle类放到一个单独的程序集中,同时程序集及命名空间名称定为:Math.Shape,意为数学.图形,从名字就知道这个程序集或命名空间下都是用来处理数学与图形相关的。
示例代码如下:
namespace Math.Shape
{
public class Circle
{
//省略,同上
}
}
//用法:
Math.Shape.Circle circle = new Math.Shape.Circle(10, 10, 10.8M);
Console.WriteLine("圆周长度是:{0}", circle.GetCircumference());
以上就是对面向对象封装的一些浅薄之见,也是看了本站的Java SE教程中关于Java面向对象部分的讲解自己总结出的一些内容,希望能够对大家学习面向对象略尽绵薄之力。当然,你也可以直接去观看本站的Java SE教程,说不定能总结出更好的面向对象知识点。
你适合学Java吗?4大专业测评方法
代码逻辑 吸收能力 技术学习能力 综合素质
先测评确定适合在学习