黑马程序员——基础知识--封装
2015-10-20 17:45
375 查看
-----------android培训、java培训、java学习型技术博客、期待与您交流!------------
我们将要封装(encapsulation)对象的成员(成员包括数据成员和方法),只允许从外部调用部分的成员。利用封装,我们可以提高对象的易用性和安全性。
封装(encapsulation)是计算机常见的术语,即保留有限的外部接口(interface),隐藏具体实施细节。比如在Linux架构,就可以看到Linux操作系统封装了底层硬件的具体细节,只保留了系统调用这一套接口。用户处在封装的外部,只能通过接口,进行所需的操作。
一个Java软件产品与一个日常产品相同。一个对象内部可以有许多成员(数据成员和方法)。有一些数据成员和方法只是内部使用。这时,我们会希望有一个给对象“加壳”的机制,从而封装对象。这样,用户可以比较容易学习和使用外部的接口,而不必接触内部成员。
Java通过三个关键字来控制对象的成员的外部可见性(visibility): public, private, protected。
public: 该成员外部可见,即该成员为接口的一部分
private: 该成员外部不可见,只能用于内部使用,无法从外部访问。
(protected涉及继承的概念,放在以后说)
我们先来封装以前定义的Human类:
内部方法并不受封装的影响。Human的内部方法可以调用任意成员,即使是设置为private的height和breath()
外部方法只能调用public成员。当我们在Human外部时,比如Test中,我们只能调用Human中规定为public的成员,而不能调用规定为private的成员。
通过封装,Human类就只保留了下面几个方法作为接口:
getHeight()
growHeight()
repBreath()
如果我们从main中强行调用height:
将会有如下错误提示:
Test.java:6: height has private access in Human
System.out.println(aPerson.height);
^
1 error
Beep, 你触电了! 一个被说明为private的成员,不能被外部调用。
在Java的通常规范中,表达状态的数据成员(比如height)要设置成private。对数据成员的修改要通过接口提供的方法进行(比如getHeight()和growHeight())。这个规范起到了保护数据的作用。用户不能直接修改数据,必须通过相应的方法才能读取和写入数据。类的设计者可以在接口方法中加入数据的使用规范。
在一个.java文件中,有且只能有一个类带有public关键字,比如上面的Test类。所以,从任意其他类中,我们都可以直接调用该类。Human类没有关键字。更早之前,我们对象的成员也没有关键字。这种没有关键字的情况也代表了一种可见性,我将在包(package)的讲解中深入。
我们将要封装(encapsulation)对象的成员(成员包括数据成员和方法),只允许从外部调用部分的成员。利用封装,我们可以提高对象的易用性和安全性。
封装与接口
封装(encapsulation)是计算机常见的术语,即保留有限的外部接口(interface),隐藏具体实施细节。比如在Linux架构,就可以看到Linux操作系统封装了底层硬件的具体细节,只保留了系统调用这一套接口。用户处在封装的外部,只能通过接口,进行所需的操作。一个Java软件产品与一个日常产品相同。一个对象内部可以有许多成员(数据成员和方法)。有一些数据成员和方法只是内部使用。这时,我们会希望有一个给对象“加壳”的机制,从而封装对象。这样,用户可以比较容易学习和使用外部的接口,而不必接触内部成员。
对象成员的封装
Java通过三个关键字来控制对象的成员的外部可见性(visibility): public, private, protected。public: 该成员外部可见,即该成员为接口的一部分
private: 该成员外部不可见,只能用于内部使用,无法从外部访问。
(protected涉及继承的概念,放在以后说)
我们先来封装以前定义的Human类:
public class Test { public static void main(String[] args) { Human aPerson = new Human(160); System.out.println(aPerson.getHeight()); aPerson.growHeight(170); System.out.println(aPerson.getHeight()); aPerson.repeatBreath(100); } } class Human { /** * constructor */ public Human(int h) { this.height = h; System.out.println("I'm born"); } /** * accessor */ public c2cf int getHeight() { return this.height; } /** * mutator */ public void growHeight(int h) { this.height = this.height + h; } /** * encapsulated, for internal use */ private void breath() { System.out.println("hu...hu..."); } /** * call breath() */ public void repeatBreath(int rep) { int i; for(i = 0; i < rep; i++) { this.breath(); } } private int height; // encapsulated, for internal use }
内部方法并不受封装的影响。Human的内部方法可以调用任意成员,即使是设置为private的height和breath()
外部方法只能调用public成员。当我们在Human外部时,比如Test中,我们只能调用Human中规定为public的成员,而不能调用规定为private的成员。
通过封装,Human类就只保留了下面几个方法作为接口:
getHeight()
growHeight()
repBreath()
如果我们从main中强行调用height:
System.out.println(aPerson.height);
将会有如下错误提示:
Test.java:6: height has private access in Human
System.out.println(aPerson.height);
^
1 error
Beep, 你触电了! 一个被说明为private的成员,不能被外部调用。
在Java的通常规范中,表达状态的数据成员(比如height)要设置成private。对数据成员的修改要通过接口提供的方法进行(比如getHeight()和growHeight())。这个规范起到了保护数据的作用。用户不能直接修改数据,必须通过相应的方法才能读取和写入数据。类的设计者可以在接口方法中加入数据的使用规范。
类的封装
在一个.java文件中,有且只能有一个类带有public关键字,比如上面的Test类。所以,从任意其他类中,我们都可以直接调用该类。Human类没有关键字。更早之前,我们对象的成员也没有关键字。这种没有关键字的情况也代表了一种可见性,我将在包(package)的讲解中深入。
相关文章推荐
- 黑马程序员——基础分享--构造函数
- 再次认识mvc,面试常用(2015年10月19日)
- 面试题
- 黑马程序员——基础知识-成员方法和成员变量
- 谈面试关于web
- iOS开发笔记--超全!iOS 面试题汇总
- 软件测试常见面试题
- Mantle--国外程序员最常用的iOS模型&字典转换框架
- Mantle--国外程序员最常用的iOS模型&字典转换框架
- PHPER职业阶段能力参照(仅供参考)
- 程序员累了怎么办-兄弟连IT教育
- 过来人经验!聊聊前端工程师的职业规划
- [转]七个对我最好的职业建议(精简版)--Nicholas C. Zakas
- 创业泡沫的"军功章",高薪低能的程序员要分走一半
- 转载ios面试问题汇总
- 通向码农的道路(从头写stl map 基本实现)
- 程序员入行须知
- 程序员 = 态度 ? 码农 : 码奴;
- 面试总结
- 【面试题】连续子数组的最大和