在说Java 三个特性之前,我们先了解一下什么是面向对象,以及为什么Java是面向对象的语言。

面向对象是区别于面向过程的一种编程的思想。我们可以通过这个例子冰箱装大象的例子来了解一下面向对象与面向过程的区别。

想必通过这个例子,应该清楚了面向对象与面向过程的区别。 面向过程是指我们主要注重于每一阶段的过程,而面向对象是指我们主要注重每一个动作的执行者。Java就是注重于动作的执行者,注重于编写类,注重于代码和功能复用的语言。

封装

上面我们已经说到了Java是注重于类的编写,那么封装自然也是对类的封装。对类封装有很多好处。

  1. 可以彻底隐藏方法的内部实现,仅仅提供一个调用的方法给其他人,让其他使用这个类的人不需要关心是如何实现的,只要知道该如何调用就行。
  2. 隐藏方法的内部实现的好处,可以让保留调用方法不变的同时,随意修改类的结构,而不影响其他人运行结果。
  3. 封装还会分开类的属性,将类的属性分成私有属性和公共属性。私有属性仅供类自身调用,和公共属性也仅提供一个供外部调用的方法。
  4. 按照软件的术语,良好的封装是能够减少耦合。

如何对一个类进行封装,则需要根据这个类本身的客观属性与实际的需要。

比如一个MyTime类

public class MyTime{
public String date;
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
date= df.format(new Date());
public String getDate() {
return date;
} //
// public void setDate(String date) {
// this.date = date;
// }
}

显然这个类是只提供了显示系统的时间,不提供外部去修改系统时间的方法。这个也是根据类本身的客观属性而言,时间是固有不会人为改变的属性,当然诸如此类的例子,还有很多。我们只是简单举例来表明我们该如何设计类的外部访问方法。

访问权限

在上面的代码中,我们已经看到可以调用getData()方法对date进行访问,但是date的修饰符是public ,换句话说,我们完全可以new 一个MyTime对象对date属性进行修改和读值,这就违背了我们封装的初衷。所以,Java引入了不同的访问权限来限定这件事情。在《Java编程思想》中讲解了下述的访问权限

public:接口访问权限。也就是说public修饰的成员方法,属性都是可以在任何地方所访问的。

private: 你无法访问 。也就说private修饰的成员方法,属性 都是只能在这个类中被访问,出了这个类以外的地方,你是无法访问到这个类里面的内容,这十分的有用,我们上面的例子代码,因为是public修饰,所以会出现封装不彻底的问题,如果我们的成员变量date用private修饰,那么就会不出现上述的问题。

protected: 继承访问权限。在说到继承访问权限之前,我们思考这样一个问题,我们有一个基类,是需要被继承的。基类中的成员属性,我们是希望能被继承的类所访问,那么我们是可以把他设定成public,但是一旦这样的话,除了这个继承的类,其他类也会访问到。这个显然不是我们所期望的事情,所以Java引入protected修饰符,来表示所修饰的部分是能被派生的类所访问的,同时他也能被同一包里面的其他类所访问。

所以,总结一下,如果我们是希望类中的方法和属性能被所有类所访问,就用public,如果只是能被继承的类和同一包内的类所访问就用protected,如果只是希望在当前类中所访问,不能被其他任何类访问就要用private。

总结

在了解了封装的具体含义和好处之后,我们就可以利用上面的访问权限来对我们要向封装的东西进行封装,通过访问权限来隐藏具体的实现,和提供外部访问的接口。

public class Student {
private String name;
private String age; private String handleName(String name){
return "I'm " + name;
} private String handleAge(String age) {
return age + " 岁";
} public String getName() {
return name;
} public void setName(String name) {
this.name = handleName(name);
} public String getAge() {
return age;
} public void setAge(String age) {
this.age = handleAge(age);
}
}

在上面的例子中,我们对Student类进行了简单的封装,首先我们切断了外部直接调用到name,age的可能,通过set和get方法来提供访问到name,age的方法,同时,上面的例子中也体现出来了,在外部访问方法不变的情况下,自己随意修改内部的实现,我们首先编写了只供类内部调用的Handle的方法,用Handle方法来修改name,age的显示结果。这样确保了修改显示结果的方法只能自己调用,而且在外部访问不变的情况下,根据需求修改内部的实现。这也是一个简单的封装例子。其调用的例子如下:student对象只能调用如下的内容,其他我们自己编写的内容是无法调用的。

public class Test {
public static void main(String[] args) {
Student student = new Student();
student.setName("byhieg");
student.setAge("23");
System.out.println(student.getName() + " " + student.getAge());
}
}

Java 浅析三大特性之一封装的更多相关文章

  1. Java 浅析三大特性之一继承

    上文Java 浅析三大特性之一封装我们说到Java是一个注重编写类,注重于代码和功能复用的语言.Java实现代码复用的方式有很多,这里介绍一个重要的复用方式--继承. 在介绍继承之前,我们要明确一点, ...

  2. java基础(一)-----java的三大特性之封装

    面向对象编程有三大特性:封装.继承.多态.本文将介绍java的三大特性之封装 封装 封装从字面上来理解就是包装的意思,专业点就是信息隐藏,是指利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成 ...

  3. Java的三大特性之封装

    java提高篇(一)-----理解java的三大特性之封装 三大特性之---封装 封装从字面上来理解就是包装的意思,专业点就是信息隐藏,是指利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一 ...

  4. java提高篇-----理解java的三大特性之封装

    在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句 ...

  5. java提高篇(一)-----理解java的三大特性之封装

    从大二接触java开始,到现在也差不多三个年头了.从最基础的HTML.CSS到最后的SSH自己都是一步一个脚印走出来的,其中开心过.失落过.寂寞过.虽然是半道出家但是经过自己的努力也算是完成了“学业” ...

  6. (转)java提高篇(一)-----理解java的三大特性之封装

    从大二接触java开始,到现在也差不多三个年头了.从最基础的HTML.CSS到最后的SSH自己都是一步一个脚印走出来的,其中开心过.失落过.寂寞过.虽然是半道出家但是经过自己的努力也算是完成了“学业” ...

  7. Java 浅析三大特性之一多态

    Java 浅析三大特性之一多态 之前我们的文章讲了Java的封装和继承,封装讲的时候,并没有体现出来封装的强大之处,反而还要慎用封装.因为这时的封装还没有和多态联系到一起,还无法看出向上转型的厉害之处 ...

  8. java的三大特性,封装,继承,多态

    封装 /** * 所谓封装,就是将对象具有的成员变量和成员函数包装和隐藏起来,让外界无法直接使用, * 被封装的成员只能通过某些特定的方式才能访问. * 实现封装有两个步骤: *   1.将不能暴露的 ...

  9. java面向对象三大特性:封装、继承、多态

    一.封装 封装也称信息隐藏,是指利用抽象数据类型把数据和基于数据的操作封装起来,使其成为一个不可分割的整体,数据隐藏在抽象数据内部,尽可能的隐藏数据细节,只保留一些接口使其与外界发生联系.也就是说用户 ...

随机推荐

  1. mysql5.7绿色版安装与配置

    1,找到zip archive包下载,官方地址如下: http://dev.mysql.com/downloads/mysql/ http://dev.mysql.com/downloads/file ...

  2. 任务栏显示进度条 CreateComObject(CLSID_TaskbarList) as ITaskbarList4

    http://www.cnblogs.com/jxsoft/archive/2011/06/02/2067712.html //在任务栏显示 进度条 unit Unit9; interface use ...

  3. 《转》 浅谈C# 多态的魅力(虚方法,抽象,接口实现)

    前言:我们都知道面向对象的三大特性:封装,继承,多态.封装和继承对于初学者而言比较好理解,但要理解多态,尤其是深入理解,初学者往往存在有很多困惑,为什么这样就可以?有时候感觉很不可思议,由此,面向对象 ...

  4. Apache Permission denied (httpd.conf配置和目录权限无问题)解决办法

    今天在CentOS5.9中配置zabbix时出现错误:Apache 403 error, (13)Permission denied: access to / denied 检查了一圈httpd.co ...

  5. jsoup获取文档类示例

    import java.io.IOException; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsou ...

  6. BestCoder Round 70

    惨败,不能再嘲笑别人了,否则自己也会像别人那样倒霉 HDU 5615:http://acm.hdu.edu.cn/showproblem.php?pid=5615 求ax^2+bx+c能否拆成(px+ ...

  7. 基础3.Jquery操作Dom

                  1 内部插入节点 <body> <ul id="city"> <li id="bj" name=&qu ...

  8. Struts 2的数据校验

    既然说到了Struts 2的数据校验,我们该怎么去实现呢?又是通过什么来实现呢? 就让我带着大家一起来走进Struts 2的数据校验吧. 首先我们会想到在Stuts 2的登录案例中我们定义了一个Act ...

  9. MySQL查询和删除重复数据

    删除表中重复记录,只保留一条: delete from 表名 where 字段ID in (select * from (select max(字段ID) from 表名 group by 重复的字段 ...

  10. 一鼓作气 博客--第一篇 note1

    1. 语言的类型 ,编译型(c,c++),解释型(python,php,ruby,java),编译型可移植性差,优点是运行速度快,解释型语言特点:边执行边翻译,速度慢. 2.翻译官就是机器的解释器,跟 ...