转载来源:http://blog.csdn.net/chenssy/article/details/12757911
原作者的这篇文章写得很好,通俗易懂,故转载分享。么么哒,有时候,说老实话,我把android都搞得服服帖帖了,java却还是一个初级水平,努力中,并表示,这年头,应届毕业生不好找工作呀,不是名校,可能面试机会都没有,多的尽是幌子(你们懂的)
三大特性之—封装
封装从字面上来理解就是包装的意思,专业点就是信息隐藏,是指利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联系。系统的其他对象只能通过包裹在数据外面的已经授权的操作来与这个封装的对象进行交流和交互。也就是说用户是无需知道对象内部的细节(当然也无从知道),但可以通过该对象对外的提供的接口来访问该对象。
对于封装而言,一个对象它所封装的是自己的属性和方法,所以它是不需要依赖其他对象就可以完成自己的操作。
使用封装有三大好处:
- 良好的封装能够减少耦合。
- 类内部的结构可以自由修改。
- 可以对成员进行更精确的控制。
- 隐藏信息,实现细节。
首先我们先来看两个类:Husband.java、Wife.java
public class Husband {
private String name ;
private String sex ;
private int age ;
private Wife wife;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void setWife(Wife wife) {
this.wife = wife;
}
}
public class Wife {
private String name;
private int age;
private String sex;
private Husband husband;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public void setAge(int age) {
this.age = age;
}
public void setHusband(Husband husband) {
this.husband = husband;
}
public Husband getHusband() {
return husband;
}
}
从上面两个实例我们可以看出Husband里面wife引用是没有getter()的,同时wife的age也是没有getter()方法的。至于理由我想各位都懂的,男人嘛深屋藏娇妻嘛,没有那个女人愿意别人知道她的年龄。
所以封装把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法,如果不想被外界方法,我们大可不必提供方法给外界访问。但是如果一个类没有提供给外界访问的方法,那么这个类也没有什么意义了。比如我们将一个房子看做是一个对象,里面的漂亮的装饰,如沙发、电视剧、空调、茶桌等等都是该房子的私有属性,但是如果我们没有那些墙遮挡,是不是别人就会一览无余呢?没有一点儿隐私!就是存在那个遮挡的墙,我们既能够有自己的隐私而且我们可以随意的更改里面的摆设而不会影响到其他的。但是如果没有门窗,一个包裹的严严实实的黑盒子,又有什么存在的意义呢?所以通过门窗别人也能够看到里面的风景。所以说门窗就是房子对象留给外界访问的接口。
通过这个我们还不能真正体会封装的好处。现在我们从程序的角度来分析封装带来的好处。如果我们不使用封装,那么该对象就没有setter()和getter(),那么Husband类应该这样写:
public class Husband {
public String name ;
public String sex ;
public int age ;
public Wife wife;
}
我们应该这样来使用它:
Husband husband = new Husband()
husband.age = 30
husband.name = "张三"
husband.sex = "男"
但是那天如果我们需要修改Husband,例如将age修改为String类型的呢?你只有一处使用了这个类还好,如果你有几十个甚至上百个这样地方,你是不是要改到崩溃。如果使用了封装,我们完全可以不需要做任何修改,只需要稍微改变下Husband类的setAge()方法即可。
public class Husband {
private String name ;
private String sex ;
private String age ;
private Wife wife;
public String getAge() {
return age;
}
public void setAge(int age) {
this.age = String.valueOf(age);
}
/** 省略其他属性的setter、getter **/
其他的地方依然那样引用(husband.setAge(22))保持不变。
到了这里我们确实可以看出,封装确实可以使我们容易地修改类的内部实现,而无需修改使用了该类的客户代码。
我们在看这个好处:可以对成员变量进行更精确的控制。
还是那个Husband,一般来说我们在引用这个对象的时候是不容易出错的,但是有时你迷糊了,写成了这样:
Husband husband = new Husband();
husband.age = 300;
也许你是因为粗心写成了,你发现了还好,如果没有发现那就麻烦大了,逼近谁见过300岁的老妖怪啊!
但是使用封装我们就可以避免这个问题,我们对age的访问入口做一些控制(setter)如:
public class Husband {
private String name ;
private String sex ;
private int age ;
private Wife wife;
public int getAge() {
return age;
}
public void setAge(int age) {
if(age > 120){
System.out.println("ERROR:error age input....");
}else{
this.age = age;
}
}
/** 省略其他属性的setter、getter **/
}
上面都是对setter方法的控制,其实通过使用封装我们也能够对对象的出口做出很好的控制。例如性别我们在数据库中一般都是已1、0方式来存储的,但是在前台我们又不能展示1、0,这里我们只需要在getter()方法里面做一些转换即可。
public String getSexName() {
if("0".equals(sex)){
sexName = "女";
}
else if("1".equals(sex)){
sexName = "男";
}
else{
sexName = "人妖???";
}
return sexName;
}
在使用的时候我们只需要使用sexName即可实现正确的性别显示。同理也可以用于针对不同的状态做出不同的操作。
public String getCzHTML(){
if("1".equals(zt)){
czHTML = "<a href='javascript:void(0)' onclick='qy("+id+")'>启用</a>";
}
else{
czHTML = "<a href='javascript:void(0)' onclick='jy("+id+")'>禁用</a>";
}
return czHTML;
}
鄙人才疏学浅,只能领悟这么多了,如果文中有错误之处,望指正,鄙人不胜感激!
个人体会:简单点说,就是隐藏内部细节,暴露必要接口给外部调用,打个比方,普通洗衣机和全自动洗衣机,全自动洗衣机只要放入衣物,加入洗衣粉,其它啥也不用管了,例如加水换水,甩干等,你觉得哪个好呢,封装就好比全自动洗衣机。
<script type="text/javascript">
$(function () {
$('pre.prettyprint code').each(function () {
var lines = $(this).text().split('\n').length;
var $numbering = $('<ul/>').addClass('pre-numbering').hide();
$(this).addClass('has-numbering').parent().append($numbering);
for (i = 1; i <= lines; i++) {
$numbering.append($('<li/>').text(i));
};
$numbering.fadeIn(1700);
});
});
</script>
分享到:
相关推荐
一个详细讲解JAVA_封装性的例子 希望可以帮助到你。
[第5章:面向对象基础]java_封装性笔记,每一个知识点都精讲!
Java__封装案例.mp4
Java__封装类.mp4
Java__封装上.mp4
Java__封装下.mp4
阿里云_SMS_短信_Java_SDK_封装_aliyun-sms
MLDN魔乐JAVA_04_面向对象_封装性
在Java编程语言中,封装是面向对象编程的三大特性之一,其他两个是继承和多态。封装性(Encapsulation)是将数据和方法捆绑到一个单独的单元,即类(Class),以保护数据免受外部代码的不当访问。它允许程序员创建更...
本课程以"Programmation_Orientée_Objet_Java_2020-2021_java_Java_OOP_"为主题,旨在为初学者和有一定基础的学习者提供全面而深入的Java面向对象编程知识。课程覆盖了从Java语言的基础到高级主题,尤其侧重于面向...
上期CTP接口Java封装 可以使用该封装进行期货交易,并且可以搭建自己的程序化交易平台
这个类可能封装了打开、关闭串口,以及发送和接收数据的逻辑。 `sms.html`文件可能是关于Java短信服务的教程或者参考文档,提供了一些理论背景和使用指南。HTML格式意味着它适合在线阅读,可能会包含代码示例和解释...
这份"java_Java_学习笔记_java教程_"的压缩包文件提供了一份详细的学习资料,旨在帮助初学者掌握Java编程的基础知识。以下是这份资源可能包含的一些核心知识点: 1. **Java简介**:Java是由Sun Microsystems(现为...
1. **类与对象**:Java是一种面向对象的语言,类是创建对象的蓝图,对象则是程序中的实体,封装了数据和操作这些数据的方法。 2. **封装**:封装是面向对象编程的三大特性之一,通过访问控制(public, private, ...
"java_DB的简单封装"这个主题主要涉及到如何通过Java对MySQL数据库进行基础的访问和操作封装,以便提高代码的复用性和可维护性。这对于初学者来说是一次很好的学习机会,能够理解面向对象编程在数据库操作中的应用。...
Java编程语言是面向对象的、跨平台的编程语言,由Sun Microsystems(现为Oracle Corporation的一部分)于1995年发布。它以其“一次编写,到处运行”的特性赢得了广泛的应用,因为开发者可以在任何支持Java的平台上...
echarts java 类库封装 echarts java 类库封装 echarts java 类库封装
Java是一种广泛使用的面向对象的编程语言,以其跨平台性、高效性和灵活性著称。这个名为"java_100examples.rar"的压缩包文件显然包含了100个Java编程示例,旨在帮助初学者理解并掌握Java编程的基础概念和技巧。下面...
标题中的"UDP.rar"指的是一个包含了使用UDP协议的Java程序的压缩文件,主要涉及的是UDP(User Datagram Protocol)在Java编程中的应用。UDP是一种无连接的传输层协议,相较于TCP,它提供了更低的延迟和更高的数据...
2. **数据包封装和解析**:提供数据包的封装和解封装功能,支持常见的网络协议如TCP/IP、UDP/IP、HTTP等,方便数据在网络中的传输和接收。 3. **错误处理和重试机制**:内置了错误检测和处理机制,当网络连接出现...