山东省城市建设管理协会网站,贵阳制作网站,网站建设报价模板下载,比百度好用的搜索软件目录 9.1 为什么需要封装#xff1f;
而“高内聚#xff0c;低耦合”的体现之一#xff1a;
9.2 何为封装性#xff1f;
9.3 Java如何实现数据封装
9.4 封装性的体现
9.4.1 成员变量/属性私有化
实现步骤#xff1a;
成员变量封装的好处#xff1a;
9.4.2 私有化…目录 9.1 为什么需要封装
而“高内聚低耦合”的体现之一
9.2 何为封装性
9.3 Java如何实现数据封装
9.4 封装性的体现
9.4.1 成员变量/属性私有化
实现步骤
成员变量封装的好处
9.4.2 私有化方法
9.5 练习
练习1
练习2 9.1 为什么需要封装
我要用洗衣机只需要按一下开关和洗涤模式就可以了。有必要了解洗衣机内部的结构吗有必要碰电动机吗我要开车我不需要懂离合、油门、制动等原理和维修也可以驾驶。
客观世界里每一个事物的内部信息都隐藏在其内部外界无法直接操作和修改只能通过指定的方式进行访问和修改。随着我们系统越来越复杂类会越来越多那么类之间的访问边界必须把握好面向对象的开发原则要遵循“高内聚、低耦合”。 高内聚、低耦合是软件工程中的概念也是UNIX 操作系统设计的经典原则。 内聚指一个模块内各个元素彼此结合的紧密程度耦合指一个软件结构内不同模块之间互连程度的度量。内聚意味着重用和独立耦合意味着多米诺效应牵一发动全身。 而“高内聚低耦合”的体现之一
高内聚类的内部数据操作细节自己完成不允许外部干涉低耦合仅暴露少量的方法给外部使用尽量方便外部调用。
9.2 何为封装性
所谓封装就是把客观事物封装成抽象概念的类并且类可以把自己的数据和方法只向可信的类或者对象开放向没必要开放的类或者对象隐藏信息。
通俗的讲把该隐藏的隐藏起来该暴露的暴露出来。这就是封装性的设计思想。
9.3 Java如何实现数据封装 实现封装就是控制类或成员的可见性范围。这就需要依赖访问控制修饰符也称为权限修饰符来控制。 权限修饰符public、protected、缺省、private。具体访问范围如下
修饰符本类内部本包内其他包的子类其他包非子类private√×××缺省√√××protected√√√×public√√√√
具体修饰的结构 外部类public、缺省成员变量、成员方法、构造器、成员内部类public、protected、缺省、private9.4 封装性的体现
9.4.1 成员变量/属性私有化
概述私有化类的成员变量提供公共的get和set方法对外暴露获取和修改属性的功能。
实现步骤
① 使用 private 修饰成员变量
private 数据类型 变量名 代码如下
public class Person {private String name;private int age;private boolean marry;
}② 提供 getXxx方法 / setXxx 方法可以访问成员变量代码如下
public class Person {private String name;private int age;private boolean marry;public void setName(String n) {name n;}public String getName() {return name;}public void setAge(int a) {age a;}public int getAge() {return age;}public void setMarry(boolean m){marry m;}public boolean isMarry(){return marry;}
}③ 测试
public class PersonTest {public static void main(String[] args) {Person p new Person();//实例变量私有化跨类是无法直接使用的/* p.name 张三;p.age 23;p.marry true;*/p.setName(张三);System.out.println(p.name p.getName());p.setAge(23);System.out.println(p.age p.getAge());p.setMarry(true);System.out.println(p.marry p.isMarry());}
}成员变量封装的好处
让使用者只能通过事先预定的方法来访问数据从而可以在该方法里面加入控制逻辑限制对成员变量的不合理访问。还可以进行数据检查从而有利于保证对象信息的完整性。便于修改提高代码的可维护性。主要说的是隐藏的部分在内部修改了如果其对外可以的访问方式不变的话外部根本感觉不到它的修改。例如Java8-Java9String从char[]转为byte[]内部实现而对外的方法不变我们使用者根本感觉不到它内部的修改。
开心一笑
A man and woman are in a computer programming lecture. The man touches the womans breasts.Hey! she says. Those are private!The man says, But were in the same class!
9.4.2 私有化方法
/*** * Description 自定义的操作数组的工具类* author 尚硅谷-宋红康 Email:shkstart126.com* version**/
public class ArrayUtil {/*** * Description 求int型数组的最大值* author 尚硅谷-宋红康* param arr* return*/public int max(int[] arr) {int maxValue arr[0];for(int i 1;i arr.length;i){if(maxValue arr[i]){maxValue arr[i];}}return maxValue;}/*** * Description 求int型数组的最小值* author 尚硅谷-宋红康* param arr* return*/public int min(int[] arr){int minValue arr[0];for(int i 1;i arr.length;i){if(minValue arr[i]){minValue arr[i];}}return minValue;}/*** * Description 求int型数组的总和* author 尚硅谷-宋红康* param arr* return*/public int sum(int[] arr) {int sum 0;for(int i 0;i arr.length;i){sum arr[i];}return sum;}/*** * Description 求int型数组的元素的平均值* author 尚硅谷-宋红康* param arr* return*/public int avg(int[] arr) {int sumValue sum(arr);return sumValue / arr.length;}// 创建一系列重载的上述方法// public double max(double[] arr){}// public float max(float[] arr){}// public byte max(byte[] arr){}/*** * Description 遍历数组* author 尚硅谷-宋红康* param arr*/public void print(int[] arr) {for(int i 0;i arr.length;i){System.out.print(arr[i] );}System.out.println();}/*** * Description 复制数组arr* author 尚硅谷-宋红康* param arr* return*/public int[] copy(int[] arr) {int[] arr1 new int[arr.length];for(int i 0;i arr.length;i){arr1[i] arr[i];}return arr1;}/*** * Description 反转数组* author 尚硅谷-宋红康* param arr*/public void reverse(int[] arr) {for(int i 0,j arr.length - 1;i j;i,j--){int temp arr[i];arr[i] arr[j];arr[j] temp;}}/*** * Description 数组的排序* author 尚硅谷-宋红康* param arr* param desc 指明排序的方式。 ascend:升序 descend:降序*/public void sort(int[] arr,String desc) {if(ascend.equals(desc)){//if(desc.equals(ascend)){for (int i 0; i arr.length - 1; i) {for (int j 0; j arr.length - 1 - i; j) {if (arr[j] arr[j 1]) {
// int temp arr[j];
// arr[j] arr[j 1];
// arr[j 1] temp;swap(arr,j,j1);}}}}else if (descend.equals(desc)){for (int i 0; i arr.length - 1; i) {for (int j 0; j arr.length - 1 - i; j) {if (arr[j] arr[j 1]) {
// int temp arr[j];
// arr[j] arr[j 1];
// arr[j 1] temp;swap(arr,j,j1);}}}}else{System.out.println(您输入的排序方式有误);}}private void swap(int[] arr,int i,int j){int temp arr[i];arr[i] arr[j];arr[j] temp;}/*** * Description 查找指定的value值在arr数组中出现的位置* author 尚硅谷-宋红康* param arr* param value* return 返回value值出现的位置 或 -1未找到*/public int getValue(int[] arr, int value) {//方法线性查找for(int i 0;i arr.length;i){if(value arr[i]){return i;}}return - 1;}
} 注意 开发中一般成员实例变量都习惯使用private修饰再提供相应的public权限的get/set方法访问。 对于final的实例变量不提供set()方法。后面final关键字的时候讲 对于static final的成员变量习惯上使用public修饰。 9.5 练习
练习1
创建程序在其中定义两个类Person和PersonTest类。定义如下
用setAge()设置人的合法年龄(0~130)用getAge()返回人的年龄。在PersonTest类中实例化Person类的对象b调用setAge()和getAge()方法体会Java的封装性。 练习2
自定义图书类。设定属性包括书名bookName作者author出版社名publisher价格price方法包括相应属性的get/set方法图书信息介绍等。