博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
面向对象编程(十三)——面向对象三大特性之封装
阅读量:5116 次
发布时间:2019-06-13

本文共 2330 字,大约阅读时间需要 7 分钟。

面向对象第二大特征:封装/隐藏

一、隐藏/封装(encapsulation)

  • 为什么需要封装?封装的作用和含义?
    • 比如:①我要看电视,只需要按一下开关和换台就可以了。有必要了解电视机内部的结构吗?有必要碰碰显像管吗?②我要开车,……
    • 隐藏对象内部的复杂性,只对外公开简单的接口,便于外界调用,从而提高系统的可拓展性、可维护性。
  • 我们程序设计要追求“高内聚、低耦合
    • 高内聚就是类的内部数据操作细节自己完成,不允许外部干涉;
    • 低耦合:仅暴露少量的方法给外部使用

  封装从字面上来理解就是包装的意思,专业点就是信息隐藏,是指利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联系。系统的其他对象只能通过包裹在数据外面的已经授权的操作来与这个封装的对象进行交流和交互。也就是说用户是无需知道对象内部的细节(当然也无从知道),但可以通过该对象对外的提供的接口来访问该对象。

二、使用访问控制符,实现封装

Java中的控制符,用来控制其他类能否访问Java中的某一方法、变量,即控制java类、方法、变量的可见性、可访问性,从而实现数据封装。

Java中有两个级别的访问控制符。

  • 类级别:控制其他类能否使用该类。有2中类型: public  和 package-private(default)
  • 成员级别:控制某一方法、变量的访问权限。有4种类型: public , protected, package-private(default), private。

类级别:

一个类可以被声明为public,在这种情况下,这个类可以被任何其他类导入使用(但是具体到某个方法或者变量时,需考虑第二层成员级别控制)。
如果类没有控制访问描述符,则表示默认,也就是包私有(package-private),这时该类除了能在本类中使用外,还能被同一个包中的其他类使用。注意包的概念,不包括子包。
备注:如果是内部类,可以使用private修饰符。下面的讨论都针对一般类.

成员级别:

成员级别可以使用类级别中的public,  package-private,其意义与类级别完全一样。除此之外还可以使用private和protected。但是要注意,默认方式不能用于接口变量和方法。
private :如果某个成员被private修饰,则它只能在它所在的类中被使用( The private modifier specifies that the member can only be accessed in its own class.)。
protected: 如果用protected修饰,除了能被同一个包中的其他类(无论是否继承自该类)使用之外,还能被其他包中的子类使用。(The protected modifier specifies that the member can only be accessed within its own package (as with package-private) and,in addition, by asubclass of its class inanother package.)注意接口中的变量和方法一样不能使用protected修饰符。
 
总结如下表:

(一) 封装的要点:

(类里面主要是属性和方法)

Java提供了访问权限控制: private->default->protected->public(权限依次扩大)来封装内部属性和提供外部接口(对字段采用private或protected等修饰符来限制,采用getter和setter来进行有效控制)。

  • 类的属性的处理:
    1. 一般使用private(除非本属性确定让子类继承);静态变量、常量可以public
    2. 针对private的属性,提供相应的get/set方法来访问相关属性,这些方法通常是public,从而提供对属性的读取操作。(一般get/set方法的写法:getXX(); setXX(); 注意:boolean变量的get方法是用:is开头!如isXX(),set方法还是setXX())
  • 一些只用于本类的辅助性方法可以用private。
  • 希望其他类调用的方法用public。

【示例1】private测试:

同在一个包内的test01和test02

test01类:

test02类:

不可以在同一包其他类中调用私有成员或方法。但是可以在同一类中调用。

【示例2】default(默认,什么都不加)测试:

同一个包内:(test01和test02在一个包内)

 把test01类的print()方法前面的控制符private去掉,则在test02类中就可以调用

不同包内:(test01和test02在一个包内,test03在另外的包)

【示例3】protected测试:其他包的子类可以访问。

示例代码的位置图:

在同一个包内,而且是test01的子类,可以访问。

但是在其他包,不是子类,就不可见。

在其他包是test01的子类,可以访问print()

【访问控制符总结】

private修饰的成员,在同一类中可见;

default(默认,成员前面没有加控制符),则是同一类和同一包下面的类可见。

protected修饰的成员,在同一个类、同一个包下面的类可见,并且在不同包的子类也可见。

public修饰的成员在所有类都可见。

 

转载于:https://www.cnblogs.com/Qian123/p/5178473.html

你可能感兴趣的文章
好玩的-记最近玩的几个经典ipad ios游戏
查看>>
PyQt5--EventSender
查看>>
Sql Server 中由数字转换为指定长度的字符串
查看>>
Java 多态 虚方法
查看>>
万能的SQLHelper帮助类
查看>>
tmux的简单快捷键
查看>>
[Swift]LeetCode922.按奇偶排序数组 II | Sort Array By Parity II
查看>>
Html5 离线页面缓存
查看>>
《绿色·精简·性感·迷你版》易语言,小到不可想象
查看>>
Android打包key密码丢失找回
查看>>
VC6.0调试技巧(一)(转)
查看>>
类库与框架,强类型与弱类型的闲聊
查看>>
webView添加头视图
查看>>
php match_model的简单使用
查看>>
在NT中直接访问物理内存
查看>>
Intel HEX 文件格式
查看>>
SIP服务器性能测试工具SIPp使用指导(转)
查看>>
回调没用,加上iframe提交表单
查看>>
(安卓)一般安卓开始界面 Loding 跳转 实例 ---亲测!
查看>>
Mysql 索引优化 - 1
查看>>