在说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. Python 学习第十七天 jQuery

    一,jQuery 知识详解 利用jquery 查找元素,操作元素 1,jquery 引入 <!DOCTYPE html> <html lang="en"> ...

  2. JavaScript(四) Window窗体操作

    window: 属性(值或者子对象):opener:打开当前窗口的源窗口,如果当前窗口是首次启动浏览器打开的,则opener是null,可以利用这个属性来关闭源窗口. 方法(函数):事件(事先设置好的 ...

  3. Redis——学习之路一(初识redis)

    在接下来的一段时间里面我要将自己学习的redis整理一遍,下面是我整理的一些资料: Redis是一款依据BSD开源协议发行的高性能Key-Value存储系统(cache and store),所以re ...

  4. Jaunt登陆索尼PSVR,为其提供大量VR视频

    索尼PS VR自从推出就广受用户青睐,当然不仅仅是其低于高端VR头显的价格,还在于PS VR提供的丰富游戏内容.近日,国外视频网站Jaunt还专门为PSVR推出了专版APP,为其提供超过 150 个沉 ...

  5. UVALive-4839 HDU-3686 Traffic Real Time Query System 题解

    题目大意: 有一张无向连通图,问从一条边走到另一条边必定要经过的点有几个. 思路: 先用tarjan将双连通分量都并起来,剩下的再将割点独立出来,建成一棵树,之后记录每个点到根有几个割点,再用RMQ求 ...

  6. monodroid 调用 JNI Native 的一些问题

    在Android版本开发的过程中,需要使用一些用JNI开发的NDK的native库.这里谈一谈踩到的坑,给大家参考. 虽然java的程序我还算熟悉,但是没有了解过 JNI Native 的开发,一般是 ...

  7. js前端模块化之加载器原理解析(一)

    先来说一下前端模块化的价值:引用模块此处有详细的介绍,可以自行前往观看. 一.总结如下优点: (1)解决命名冲突(2)烦琐的文件依赖(3)模块的版本管理(4)提高可维护性(5)前端性能优化(6)跨环境 ...

  8. eclipse tomcat add and remove工程异常

    1  eclipse导入工程后,右击server add and remove工程时,there are no resource: 解决方案:右击工程->单击property->选择pro ...

  9. CentOS7 SWAP 设置 (实测 笔记)

    首先查看当前的内存及swap情况(参数 -h,-m ) [root@centos ~]# free -h 查看swap信息,包括文件和分区的详细信息 [root@centos ~]# swapon - ...

  10. <十六>JDBC_使用 DBUtils 编写通用的DAO

    接口 : DAO<T>.java import java.sql.Connection;import java.sql.SQLException;import java.util.List ...