Java学习-类的隐藏机制(封装性)

  • 1、封装的含义
  • 2、类的setXXX 和 getXXX
  • 3、this关键字
  • 4、总结

1、封装的含义

封装(encapsulation)是面向对象的三要素之一(其它两个是继承多态),它有两成含义:
1、将数据(属性)和函数(行为)放在一个独立的类中,使类成为一个独立的单元。
2、通过访问限定符(private等)实现对信息的隐藏或公开,隐藏类的内部实现。而留下一些接口(public的成员函数)与外界进行信息交换(外界要想访问某个成员只能通过接口实现)当类的设计者改变了类的内部实现时,但只要接口不变,对于类的使用者而言,没有任何影响。这就是所谓的“接口和实现的分离
那么什么是封装? 简单地说,封装就是将数据和函数放在一起,将不想让外界看到的内容(通常是数据)声明为private的,不允许外界存取。外界要想访问的话,就只能通过类留给外部的接口。
为了更好的理解为什么要对对象进行封装,下面举个例子进行说明
先写两个类 :

  • Person类
package day01
public class Person{public int age;public void printAge(){ System.out.println("年龄是:"+age);}
}
  • Test测试类
package day01
public class Test{public static void main(String[] args){Person p = new Person();p.age = -100;p.printAge();}
}

运行后打印结果为:年龄是:-100
分析一下代码:
程序是没问题的也能正常运行,但是年龄为-100显然不符合正常逻辑。从代码可以看出在new完一个person对象后用户可以对它的age属性随便赋值。像这种情况是把类的属性开放出来,让调用者随意使用,这样就会出现问题,它们很容易被一些粗心的或不知情的客户端程序员所毁坏。
所以我们需要对这样不能让调用者随意使用的属性做封装和隐藏以减少程序的bug。这意味着类的创建者可以任意修改被隐藏的部分,而不用担心对其他调用者造成影响。
代码修改后如下:

package day01
public class Person{private int age;public void setAge(int a){if(a <=150 && a>=0){this.age = a;    }else{System.out.println("输入的年龄:"+a+"不在0到150之间");}}public int getAge(){ return this.age;}public void showAge(){System.out.println("年龄是:"+this.getAge());}}
package day01
public class Test{public static void main(String[] args){Person p1 = new Person();Person p2 = new Person();p1.setAge(55);p1.showAge();p2.setAge(60);p2.showAge();}
}

可以看到修改过后的对象不能直接通过p.age进行赋值操作,因为此时的age属性已经是被private限制,只能由类内部的成员函数调用并进行传参。

2、类的setXXX 和 getXXX

封装的一个原则是:“信息的最小化公开”,所以在理想状态下,通常将所有的数据都声明为private(因为随便对类的内部数据进行更改是很危险的),如果想改变和得到某个数据的话,那么使用相应的接口进行访问

  • 通常设置数据的接口命名为setXXX(如public void setAge() )
  • 将得到数据的接口命名为getXXX(如public int getAge() )
    ?考虑这样两个问题:
    问题一: 使用Person类来定义的两个对象p1和p2,那么p1和p2两个对象在内存中的存储状态是怎么样的呢?即数据成员和成员函数是否都存放在对象中呢?
    问题二: p1和p2调用相同的成员函数,为什么显示结果不一样?它们调用的是同一段代码吗?
    其实对象空间中仅存储数据成员,而类的成员函数代码不会存储在对象中,用一个类的不同的对象调用成员函数时,调用的是同一段函数代码。
    成员函数和普通函数的区别:
    在编译器的角度来看,成员函数和普通函数是没有本质区别的,成员函数只不过是为了封装的需要,而在形式上放在类中。最主要的区别是:
    成员函数暗自具备了一个从编译器传过来的指向类对象的this(当前对象的引用),通过它成员函数就可以操作当前对象的数据成员。
     Person p1 = new Person();Person p2 = new Person();p1.setAge(55);//在这里this指向p1p2.setAge(60);//在这里this指向p2

3、this关键字

  • 在类的方法定义中使用的this关键字表示使用该方法对象的引用。
  • 当必须指出当前使用方法对象是谁时要使用this
  • this可以看作是一个变量,它的值是当前对象的引用
  • 当处理方法中成员变量和局部变量重名时要用this

4、总结

java中类的封装和隐藏就是:
通过将类的成员数据声明为私有的(private),再提供公共的(public)方法:getXXX()和setXXX()实现对该属性的操作。以实现以下目的。

  • 隐藏一个类中不需要对外提供的实现细节
  • 使用者只能通过事先定制好的方法来访问数据,可以方便地加入控制逻辑,限制对属性的不合理操作;
  • 便于修改,增强代码的可维护性

欢迎持续关注!
个人博客站:jQueryZK Blog

Java学习-类的隐藏机制(封装性)相关推荐

  1. java学习--类与对象

    文章目录 java学习--类与对象 类的定义与对象的使用 类的私有成员的使用 java学习–类与对象 类的定义与对象的使用 类的定义与对象的使用 类的定义步骤: public 类名: //定义成员变量 ...

  2. java学习笔记13--反射机制与动态代理

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note13.html,转载请注明源地址. Java的反射机制 在Java运行时环境中,对于任意 ...

  3. Java:java学习笔记之锁机制的简单理解和使用

    锁机制的简单理解和使用 锁机制 1.背景 2.定义 3.锁的种类 4.乐观锁 VS 悲观锁 4.1.悲观锁 4.2.乐观锁 4.3.举例说明 4.4.CAS算法 4.4.1.CAS使用 4.4.2.C ...

  4. java学习---类与对象

    java学习心得3 文章目录 java学习心得3 类 对象 关键字this 总结与反思 类 一 定义一个Java的类 属性 : 将数据存储在变量中 1成员变量 使用成员变量:对象名.变量名 使用成员方 ...

  5. 【java学习】系统错误处理机制:异常(Exception)、断言(assert)和日志(log)

    java语言中,给出了3种处理系统错误的机制:抛出一个异常.日志.使用断言. 1,异常 1)概念 当JAVA程序违反了JAVA的语义规则时,JAVA虚拟机就会将发生的错误表示为一个异常. 处理异常的一 ...

  6. Java学习——类和对象(上)

    目录 一.类和对象 1.类的特点 2.类和对象的关系 3.总结 二.类的定义 1.类的定义步骤 2.代码示例 三.对象的使用 1.创建对象 2.使用对象 3.单个对象(代码) 4.多个对象(代码) 四 ...

  7. 【Java】5.4 隐藏和封装

    目录 一.封装 二.封装的目的 三.控制符的使用原则 四.局部变量 五.Java源程序的定义规则 六.Java的常用包 三大特征:封装.继承.多态 ========================== ...

  8. 慕课JAVA重温---类、对象、封装、继承、多态

    类和对象 声明对象:在内存的栈空间中执行.ImoocStudent student; 实例化对象:在内存的堆空间执行.new ImoocStudent(); 栈空间.堆空间.方法区空间 栈空间:存储的 ...

  9. Bluej学习和Java学习(3):封装,构造函数,JavaDOC,字符串,数组

    封装(encapsulation):将功能实现细节封在系统内部,对外部只留出功能接口如:Application Programmable Interface (API) 实现封装的方式:将类中的实例变 ...

最新文章

  1. 洛谷P3953 逛公园(dp 拓扑排序)
  2. Problem 63 何时该用glDrawTexiOES?
  3. arm-linux-gcc armv4,ubuntu11.10 下 arm-linux-gcc4.4.3
  4. Mathemmatica 新函数
  5. ​数据分析最重要的 3 种特征编码,你真的能分清楚?
  6. IIS中“使用 XSL 样式表无法查看 XML 输入”问题的解决
  7. 浅谈MAXIMO项目实施(转)
  8. Python的WSGI
  9. java manualbuffer_FlatBuffer Java Bean自由转换
  10. linux select 与 阻塞( blocking ) 及非阻塞 (non blocking)实现io多路复用的示例
  11. 苹果平板有Linux终端吗,Apple:如何在iphone、ipad上安装一些常用命令行命令
  12. C#中的InputBox
  13. C#项目获取当前时间的农历时间
  14. class6--tensorflow:滑动平均
  15. 消防应急疏散指示系统在某生物制药工厂项目的应用
  16. 比较两组数据的差异用什么图更直观_用Excel制作旋风图
  17. 记一次腾讯面试:进程之间究竟有哪些通信方式?如何通信? ---- 告别死记硬背
  18. Oracl中PL/SQL编程(10级学员 张帅鹏课堂总结)
  19. HEVC代码学习18:运动估计和运动补偿总结
  20. Android jetpack之Navigation

热门文章

  1. 解决因电脑自身问题导致EasyConnect无法连接或频繁更新闪退的问题(自用)
  2. vue2 vue-rout
  3. 解决板料五金冲压回弹的工艺措施做法
  4. 【工具使用系列】Windows 10 平台下的TTS工具 Balabolka
  5. 测试管理的绩效管理启示
  6. 今日天气预报软件测试,天气预报
  7. WIFI P2P架构
  8. 计算机绘图综合训练铣刀头实训报告,典型零件测量与计算机绘图
  9. How to Choose a Bluetooth Smart / Low Energy Development Kit
  10. 计算机组装安装系统流程,电脑安装系统步骤图