044_面向对象_17_封装
一、封装的概念
制造厂家为了方便我们使用对象(电视、车辆),把复杂的内部细节全部封装起来。只给我们暴露简单的接口,比如:电源开关、比如:油门。具体怎么内部实现的,我们不需要操心。需要让用户知道的暴露出来,不需要让用户了解的全部隐藏起来。这就是封装。
我要看电视,只需要按一下开关和换台就可以了。有必要了解电视机内部的结构吗?有必要碰碰显像管吗?
二、为什么需要封装?封装的作用和含义?
专业:我们程序设计要追求“高内聚,低耦合”。高内聚就是类的内部数据操作细节自己完成,不允许外部干涉;低耦合:仅暴露少量的方法给外部使用。
编程中封装的具体意义:便于调用者调用。
良好的封装,便于修改内部代码,提高可维护性。
良好的封装,可进行数据完整性检测,保证数据的有效性。
三、使用访问控制符(private、default、protected、public),实现封装
同一个类 |
同一个包中 |
子类 |
所有类 |
|
private |
* |
|||
default(即不加修饰符的时候) |
* |
* |
||
protected |
* |
* |
* |
|
public |
* |
* |
* |
* |
四、封装的使用细节
1.属性一般使用private.(除非本属性确定会让子类继承并且使用时)才提供相应的get/set方法来访问相关属性. 这些方法通常是public,从而提供其他类对属性的读取操作。 (注意:boolean变量的get方法是用:is开头!)
2.一些只用于本类的辅助性方法可以用private,希望其他类调用的方法用public。
五、演示示例
一、private修饰符
1.测试private修饰符所修饰的属性或方法在同一类中是否能被访问
package edu.aeon.test; /*** [说明]:测试访问控制符* @author aeon* 测试步骤:* 1、测试private修饰的方法或属性是否能在当前类(本类)中被调用?(结果:可以被调用)* 2、测试private修饰的方法或属性在非本类(同包的其它类/子类、不同包其他类/子类、)中是否能被调用?(结果:不可以被调用)*/ public class A {//比如我们将本类的一个属性a用private修饰(私有化)private int a=10;private void seeA(){//测试用private修饰的属性是否在本类中可见、System.out.println(this.a);}public static void main(String[] args) {A a=new A();//测试结果:用private修饰的属性、在本类中可以调用! System.out.println(a.a);a.seeA();} }
测试结果截图:
2、测试private修饰符所修饰的属性或方法在同一包中的子类中是否能被访问
演示示例:
package edu.aeon.test; /*** [说明]:测试访问控制符* @author aeon* 测试步骤:* 1、测试private修饰的方法或属性是否能在当前类(本类)中被调用?(结果:可以被调用)* 2、测试private修饰的方法或属性在非本类(同包的其它类/子类、不同包其他类/子类、)中是否能被调用?(结果:不可以被调用)*/ public class A {//比如我们将本类的一个属性a用private修饰(私有化)private int a=10;private void seeA(){//测试用private修饰的属性是否在本类中可见、System.out.println(this.a);}public static void main(String[] args) {A a=new A();//测试结果:用private修饰的属性、在本类中可以调用! System.out.println(a.a);a.seeA();} }
package edu.aeon.test; /*** [说明]:测试private修饰的属性或者方法在同一包中的子类中是否能被访问(测试结果:不能被访问)* @author aeon**/ public class B extends A{public static void main(String[] args) {A a=new A();System.out.println(a.a);a.seeA();/*我们测试一个在父类中根本不存在的方法或者属性:显然从测试结果可以看出来、父类中用private修饰的属性或者方法所报的错误和调用一个父类中根本不存在的属性和方法所报的错误是不一样的。*/a.seeAd();}}
运行结果截图:
3、测试private修饰符所修饰的属性或方法在不同一包中的子类中是否能被访问
测试结果:这个肯定不能被访问了,同包子类中不能访问、不同包中的子类更加就不能访问了!
测试结论:
1、用private修饰的属性或者方法只能在本类中调用、其它(同一包中[类/子类]/不同包中[类/子类])均不能访问!
2、测试结果可以看出来、父类中用private修饰的属性或者方法所报的错误和调用一个父类中根本不存在的属性和方法所报的错误是不一样的、可见编译器能识别一个private修饰的属性和方法和调用一个根本不存在的方法。
二、默认(不写)修饰符
1.测试默认(不写)修饰符的属性或方法在同一包的同一类中是否能被访问
package edu.aeon.test; /*** [说明]:测试默认(不写时)访问控制符* @author aeon* 测试步骤:* 1、测试不写访问修饰的方法或属性是否能在当前类(本类)中是否能被访问?(结果:可以被访问)* 2、测试不写访问修饰的方法或属性在同一包中的其它类中是否能被访问(结果:可以被访问)* 3、测试不写访问修饰的方法或属性在不同包中的其它类中是否能被访问(结果:不可以被访问)* 4、测试不写访问修饰的方法或属性在不同包中的其它子类中是否能被访问(结果:不可以被访问)* 结论:可见默认(不写)访问控制符修饰的属性和方法界限是同一包中、不同包中的其它类及其子类均不能被访问*/ public class A {//比如我们将本类的一个属性a用默认(不写)访问控制符修饰int a=10;void seeA(){//默认(不写)修饰符的属性是否在本类中可见、System.out.println(this.a);}public static void main(String[] args) {A a=new A();//测试结果:默认(不写)修饰的属性、在本类中可以调用! System.out.println(a.a);a.seeA();} }
测试结果截图:
2、测试不写访问(默认)修饰的方法或属性在同一包中的其它类中是否能被访问(结果:可以被访问)
package edu.aeon.test; /*** [说明]:测试默认(不写时)访问控制符* @author aeon* 测试步骤:* 1、测试不写访问修饰的方法或属性是否能在当前类(本类)中是否能被访问?(结果:可以被访问)* 2、测试不写访问修饰的方法或属性在同一包中的其它类中是否能被访问(结果:可以被访问)* 3、测试不写访问修饰的方法或属性在不同包中的其它类中是否能被访问(结果:不可以被访问)* 4、测试不写访问修饰的方法或属性在不同包中的其它子类中是否能被访问(结果:不可以被访问)* 结论:可见默认(不写)访问控制符修饰的属性和方法界限是同一包中、不同包中的其它类及其子类均不能被访问*/ public class A {//比如我们将本类的一个属性a用默认(不写)访问控制符修饰int a=10;void seeA(){//默认(不写)修饰符的属性是否在本类中可见、System.out.println(this.a);}public static void main(String[] args) {A a=new A();//测试结果:默认(不写)修饰的属性、在本类中可以调用! System.out.println(a.a);a.seeA();} }
package edu.aeon.test; /*** [说明]:测试default(不写时)修饰的属性或者方法在同一包类中是否能被访问(测试结果:能被访问)* @author aeon**/ public class B{public static void main(String[] args) {A a=new A();System.out.println(a.a);a.seeA();/*我们测试一个在父类中根本不存在的方法或者属性:显然从测试结果可以看出来、父类中用private修饰的属性或者方法所报的错误和调用一个父类中根本不存在的属性和方法所报的错误是不一样的。*/}}
测试结果:
3、测试不写访问修饰的方法或属性在不同包中的其它类中是否能被访问(结果:不可以被访问)
package edu.aeon.test1;import edu.aeon.test.A;/*** [说明]:测试不写访问修饰符的属性或者方法在不同包中的类中是否能被访问(测试结果:不能被访问)* @author aeon**/ public class C{public static void main(String[] args) {A a=new A();System.out.println(a.a);a.seeA();/*我们测试一个在父类中根本不存在的方法或者属性:显然从测试结果可以看出来、父类中用private修饰的属性或者方法所报的错误和调用一个父类中根本不存在的属性和方法所报的错误是不一样的。*/}}
测试结果:
4、测试不写访问修饰的方法或属性在不同包中的其它子类中是否能被访问(结果:不可以被访问)
package edu.aeon.test1;import edu.aeon.test.A;/*** [说明]:测试不写访问修饰符的属性或者方法在不同包中的子类中是否能被访问(测试结果:不能被访问)* @author aeon**/ public class D extends A{public static void main(String[] args) {A a=new A();System.out.println(a.a);a.seeA();/*我们测试一个在父类中根本不存在的方法或者属性:显然从测试结果可以看出来、父类中用private修饰的属性或者方法所报的错误和调用一个父类中根本不存在的属性和方法所报的错误是不一样的。*/}}
测试结果:
结论:
可见默认(不写)访问控制符修饰的属性和方法界限是同一包中、不同包中的其它类及其子类均不能访问!
五、总结
1、通过private访问控制符修饰的属性或者方法只能在同一个类中能被访问 2、通过默认(不写时)访问控制符修饰的属性或者方法只能在同一个类、同一个包中的其他类及同一个包中的子类中可以被访问。记住此处的界限是包、其它包中的类及其子类均无法访问。 3、通过protected访问控制符修饰的属性或者方法只能在同一个类、同一个包中的其他类及其同一个包中的子类中可以被访问。记住此处的界限是包、其它包中的类及其子类均无法访问。(经测试结果发现和默认访问控制符一样?) 4、通过public访问控制符修饰的属性或者方法在同一个类、同一个包中的其他类及其同一个包中的子类、不同包中的其它类、及其不同包中的子类均可以被访问。 |
转载于:https://www.cnblogs.com/aeon/p/9973483.html
044_面向对象_17_封装相关推荐
- python面向对象编程 -- 封装、继承
面向对象编程 -- 封装.继承 面向对象编程三要素:封装.继承和多态.本文主要看和封装.继承相关的概念:在python中多态的概念比较模糊,本文不做讨论. 1 封装 封装:将数据和操作组装到一起,对外 ...
- linux sdk 窗口句柄,Venus: 针对Linux平台上,对常用的系统API进行面向对象的封装SDK。...
Venus 项目介绍 Linux平台上,对常用的系统API进行面向对象的封装SDK,使用C++实现,没有使用C++11特效,支持CentOS.Ubuntu.RedHat各个发行版本和不同内核版本使用, ...
- python面向对象编程(封装与继承)
一. 面向过程编程语言 "面向过程"(Procedure Oriented)是一种以过程为中心的编程思想.分析出解决问题所需要的步 骤,然后用函数把这些步骤一步一步实现,使用的时候 ...
- python面向对象(1) —— 封装
面向对象由封装.继承和多态组成 封装:属性和方法写到类里 继承:子类继承父类方法与属性 多态:子类重写父类后再实例化为不同对象产生不同结果 类与对象 class Gun():def __init__( ...
- python 全栈开发,Day116(可迭代对象,type创建动态类,偏函数,面向对象的封装,获取外键数据,组合搜索,领域驱动设计(DDD))...
昨日内容回顾 1. 三个类 ChangeList,封装列表页面需要的所有数据.StarkConfig,生成URL和视图对应关系 + 默认配置 AdminSite,用于保存 数据库类 和 处理该类的对象 ...
- Java 面向对象:封装详解
Java 面向对象:封装详解 封装:属性私有,get/set 属性私有化 提供get/set方法操作数据 优点: 1.提高程序的安全性,保护数据 2.隐藏代码的实现细节 3.统一接口 4.系统可维护性 ...
- java程序员从笨鸟到菜鸟之_Java程序员从笨鸟到菜鸟之(二)面向对象之封装,继承,多态(上)...
Java是一种面向对象的语言,这是大家都知道的,他与那些像c语言等面向过程语言不同的是它本身所具有的面向对象的特性--封装,继承,多态,这也就是传说中的面向对象三大特性 一:从类和对象开始说起: Oo ...
- Java 面向对象和封装
目录 Java 面向对象和封装 面向对象思想的概述 类和对象的关系 什么是类 什么是对象 类和对象的关系 局部变量和成员变量的区别 this关键字 构造方法 一个标准的类 Java 面向对象和封装 面 ...
- 如何理解面向对象的封装、继承、多态
如何理解面向对象的封装.继承.多态 面向对象可以说是一种对现实是事物的抽象,将一类事物抽象成一个类,类里面包含了这类事物具有的公共部分,以及我们对这些部分的操作,也就是对应的数据和过程. 面向对象思想 ...
最新文章
- ctime库函数的使用
- rust(70)-条件表达式
- Asp.net MVC Filter解析和实例说明
- python字典顺序遍历_在Python中,如何按已排序的键顺序遍历字典?
- Leetcode 7. 整数反转
- LeetCode 819. 最常见的单词
- java 支付类的接口,Java后端支付大杂烩之core.dao,service,web(重点是接口的设计)(二)...
- Oracle FGA审计的使用
- MATLAB中的光照处理
- 大学生计算机应用基础考试,大学计算机应用基础知识试题.doc
- Kotlin是如何帮助你避免内存泄漏的?
- win11安装wsl2
- 认识计算机的桌面,电脑桌面的基础知识教程,教你认识电脑桌面
- 国网站直接SHOPPING经验之总结, 和美国代购说拜拜~~新加 如何注册PAYPAL~~~~
- MySQL8版本 Win10忘记密码
- CNCC 2018 经典计算机算法技术论坛全解读 | CNCC 2018
- ajax下拉列表模糊,JS仿百度自动下拉框模糊匹配提示
- 什么是DCDC电源电涌,来源是哪里
- 程序员跳槽,要求涨薪50%过分吗?
- Android开发百科全书①
热门文章
- bootmgr快速修复win7_win7 iso镜像下载(Win7安装版_非GHOST ISO镜像)
- 回溯法经典算法 求集合中所有的子集
- 「技术综述」人脸脸型分类研究现状
- java有参构造_java的有参构造有什么用
- android导出txt文件格式,安卓端数据导出成txt文件
- 初次BERT使用者的可视化指南
- FPGA 之 SOPC 系列(九)SOPC 补充:altera与xilinx对比
- 工信部电信投诉网站入口
- NetKeeper校园网连接不上,出现Sorry, this application cannot run under a Virtual Machin
- 台式计算机搜不到无线,电脑搜不到5g频段wifi解决方法(图文)