封装性
一、封装的本质
-
该露的露,该藏的藏
程序设计要追求 “ 高内聚,低耦合 ”。
高内聚:就是类的内部数据操作细节自己完成, 不允许外部干涉;
低耦合:仅暴露少量的方法给外部使用。 -
封装(数据的隐藏)
当创建一个类的对象以后,我们可以同通过“对象 . 属性” 的方式,给属性进行赋值。这时,赋值操作只是受属性的数据类型和存储范围的制约。
但是,在实际问题中,我们往往需要给属性赋值加入额外的限制条件,避免用户再使用“对象 . 属性” 的方式对属性进行赋值,则需要将属性声明为私有的(private)。
-
封装性的体现
将类的属性私有化(private)后,同时会提供公共(public)方法来获取(getXxx())和设置(setXxx())此属性的值。
① get:有返回值,无形参
public int getAge(){ return age; }
② set:有形参,无返回值
public void setAge(int a){ age = a ; }
-
其它封装性的体现:
① 不对外暴露的私有方法
② 单例模式 -
封装性的体现,需要权限修饰符来配合
private、缺省(default,什么都不需要写,写了default反而报错)、protected、public
修饰符 类内部 同一个包 不同包的子类 同一个工程 private √ 缺省 √ √ protected √ √ √ / X public √ √ √ √ -
protected:
① 在同一个包内,protected与public的使用权限一样
② protected方法:父类和子类不同包
- 在子类中,子类的实例化对象可调用不同包的父类的protected属性和未被重写的protected方法
- 在子类中,父类的实例化对象不可调用自身任何protected方法或protected属性
- 在父类中,子类的实例化对象可调用不同包的父类的protected属性和未被重写的protected方法,但不可以调用自身的任何protected结构。
③ 总结:在不同包的子父类的方法内,只可子类对象调用父类的保护型结构,自身对象都不可以调自身的protected结构
二、封装的意义
- 提高程序的安全性,保护数据
- 隐藏代码的实现细节
- 统一接口
- 提高系统的可维护性
三、JavaBean(在web中使用)
- 是一种用Java语言写成的可重用组件
- 其实是符合如下标准的Java类
① 类是公共的
② 有一个无参的公共构造器
③ 有属性,且有对应的get、set方法 - 用户可以使用JavaBean将功能、处理、值、数据库访问和其他任何可以用Java代码创造的对象进行打包,并且其他的开发者可以通过内部的JSP页面、Servlet、其它JavaBean、apple程序或者应用来使用这些对象。用户可以认为JavaBean提供了一种随时随地的复制和黏贴的功能,而不用担心任何改变
四、代码汇总
-
测试程序
package com.oop.Encapsulation; public class Application { public static void main(String[] args) { Create en = new Create(); // 通过setXxx()方法给私有属性赋值 en.setName("秦疆"); // 秦疆 System.out.println(en.getName()); } }
-
创建封装程序
package com.oop.Encapsulation; public class Create { // private 私有属性,即使是类被实例化,也不能被直接调用!!! private String name; private int id; private char sex; // getXxx()方法:用于获取私有属性 public String getName(){ return this.name; } // setXxx()方法:用于给私有属性赋值 public void setName(String name){ this.name = name; } // 在IDEA中,通过 Alt + Insert快捷键,可自动生成某私有属性的get/set方法。 public char getSex() { return sex; } public void setSex(char sex) { this.sex = sex; } public int getId() { return id; } public void setId(int id) { this.id = id; } }