7. 封装
1. 封装的概念
1.1 概念
封装是面向对象编程的核心思想。
将对象的属性和行为封装起来。其载体就是类,类通常对客户隐藏其实现细节,这就是封装的思想。
封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。
要访问该类的代码和数据,必须通过严格的接口控制。
封装最主要的功能在于我们能修改自己的实现代码,而不用修改那些调用我们代码的程序片段。
适当的封装可以让程式码更容易理解与维护,也加强了程式码的安全性。
1.2 封装的优点
1. 良好的封装能够减少耦合。
2. 类内部的结构可以自由修改。
3. 可以对成员变量进行更精确的控制。
4. 隐藏信息,实现细节。
1.3 如何实现封装
1.3.1 访问限制符
1.3.2 包机制
包(package)机制:提供类的多层命名空间,用于解决类的命名冲突、类文件管理等问题
格式:package 包名;
import可以向某个Java文件中导入指定层次下某个类或全部类
import应出现在package之后,类定义之前
格式:import 包名.子包名.....类名/*
2. 封装的实现
-
修改属性的可见性来限制对属性的访问(一般限制为private)
例如:
public class Atm { //定义balance余额,id账号id,pwd账号密码 //并设为私有只有本类才能访问,从本类之外不能访问,这样就对信息进行了隐藏 private double balance; private int id; private int pwd; }
-
对每个值属性提供对外的公共方法访问,也就是创建一堆赋取值方法,用于对私有属性访问
例如:
public class Atm { //定义balance余额,id账号id,pwd账号密码 //并设为私有只有本类才能访问,从本类之外不能访问,这样就对信息进行了隐藏 private double balance; private int id; private int pwd; //获取id,pwd,balance方法 public void setAccount() { balance = 5000; id = 1024; pwd = 123456; } //查询余额方法,必须id和pwd正确才能查询,否则返回-1 public double getBalance(int id,int pwd) { if (this.id == id && this.pwd == pwd) { return balance; }else{ System.out.println("错误账号或密码!"); return -1; } } //存钱方法,必须id和pwd正确才能存钱 public void saveMoney(int id,int pwd,int money) { if (this.id == id && this.pwd == pwd) { balance = balance + money; }else{ System.out.println("错误账号或密码!"); } } }
this解决了实例变量id,pwd和局部变量id,pwd之间的同名冲突
3. 实践和练习
编写学生类,有姓名(name),学号(id)和三门课的成绩
setData方法来设置学生信息
有方法getResult()来获取成绩
有方法getAvgResult来获取平均成绩
有方法rename来改名
有方法editResult来改成绩