目录
题目2:要求具有属性:姓名 (长度为2位或3位或4位) 、 余额(必须>20)密码(必须是六位),且满足要求 如果不满足,则给出提示信息 ,并给默认值(程序员自己定)
在面向对象程式设计方法中,封装(英语:Encapsulation)是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法。
封装最主要的功能在于我们能修改自己的实现代码,而不用修改那些调用我们代码的程序片段。
适当的封装可以让程式码更容易理解与维护,也加强了程式码的安全性。
1. 良好的封装能够减少耦合。
2. 类内部的结构可以自由修改。
3. 可以对成员变量进行更精确的控制。
4. 隐藏信息,实现细节。
1. 修改属性的可见性来限制对属性的访问(一般限制为private),例如:
- public class Person {
- private String name;
- private int age;
- }
这段代码中,将 name 和 age 属性设置为私有的,只能本类才能访问,其他类都访问不了,如此就对信息进行了隐藏。
2. 对每个值属性提供对外的公共方法访问,也就是创建一对赋取值方法,用于对私有属性的访问,例如:
- public class Person{
- private String name;
- private int age;
-
- public int getAge(){
- return age;
- }
-
- public String getName(){
- return name;
- }
-
- public void setAge(int age){
- this.age = age;
- }
-
- public void setName(String name){
- this.name = name;
- }
- }
采用 this 关键字是为了解决实例变量(private String name)和局部变量(setName(String name)中的name变量)之间发生的同名的冲突。
封装:就是把抽象出的数据(属性)和对数据的操作(方法)封装在一起,数据被保护在内
public class Person { private String name; private int age; }
部,程序的其它部分只有通过被授权的操作(方法),才能对数据进行操作。
那么在Java中如何实现这种类似的控制呢?
下面一个快速入门案例, 加深对封装的了解
代码实现:
- class Person {
- public String name;//名字分开
- private int age;//age 私有化
- private double salary;//...
-
- //构造器 alt + insert
- public Person() {
- }
-
- //有三个属性的构造器
- public Person(String name, int age, double salary) {
- // this.name = name;
- // this.age = age;
- // this.salary = salary;
- //将封装与构造器结合setXxx ,我们可以将 set 方法写在构造器中,这样仍然可以验证
- setName(name);
- setAge(age);
- setSalary(salary);
- }
-
- //自己写 setXXX 和 getXxx 太慢了,我们使用快捷键 Alt + insert
- //然后根据要求来完善我们的代码
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- //加入对数据的校验,相当于增加了业务逻辑
- if (name.length() >= 2 && name.length() <= 6) {
- this.name = name;
- } else {
- System.out.println("名字的长度不同,需要(2-6)个字符 ,默认名字");
- this.name = "无名人";
- }
- }
-
- public int getAge() {
- return age;
- }
-
- public void setAge(int age) {
- //判断
- if (age >= 1 && age <= 120) {//如果是合理范围
- this.age = age;
- } else {
- System.out.println("设置的年龄不对,需要在(1-120),给默认年龄18");
- // this.age = 18;//给一个默认年龄
- this.age = 18;
-
- }
- }
-
- public double getSalary() {
- //可以这里增加对当前对象的权限判断
- return salary;
- }
-
- public void setSalary(double salary) {
- this.salary = salary;
- }
-
- //写一个方法,返回属性
- public String info() {
- return "信息为 name= " + name + "age=" + age + "salary=" + salary;
- }
- }
- public class Encapsulation01 {
- public static void main(String[] args) {
- Person person = new Person();
- person.setName("jack");
- person.setAge(30);
- person.setSalary(30000);
- System.out.println(person.info());
- System.out.println(person.getSalary());
-
- //如果我们自己使用构造器指定属性
- Person swith = new Person("swith", 20, 30000);
- System.out.println("=======swith的信息=======");
- System.out.println(swith.info());
- }
- }
运行结果:

1.创建程序,在其中定义两个类 :Account 和 AccountTest 类体会 Java 的封装性。
Account 类要求具有属性:姓名 (长度为2位或3位或4位) 、 余额(必须>20)
密码(必须是六位) ,如果不满足,则给出提示信息 ,并给默认值(程序员自己定)
2.通过 setXxx 的方法给 Account 的属性赋值
3.在 AccountTest 中测试
代码实现:
- public class Account {
- //为了封装,将3 个属性设置为 private
- private String name;
- private double balance;
- private String pwd;
-
- //提供两个构造器
- public Account() {
-
- }
-
- public Account(String name, double balance, String pwd) {
- this.setName(name);
- this.setBalance(balance);
- this.setPwd(pwd);
- }
-
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- //姓名(长度为2位或3位或4位)
- if (name.length() >= 2 && name.length() <= 4) {
- this.name = name;
-
- } else {
- System.out.println("姓名(长度为2位或3位或4位),默认值无名");
- this.name = "无名";
- }
- }
-
- public double getBalance() {
- return balance;
- }
-
- public void setBalance(double balance) {
- if (balance > 20) {
- this.balance = balance;
- } else {
- System.out.println(" 余额(必须>20),默认值为0");
- }
- }
-
- public String getPwd() {
- return pwd;
- }
-
- public void setPwd(String pwd) {
- if (pwd.length() == 6) {
- this.pwd = pwd;
- } else {
- System.out.println("密码(必须是六位),默认密码为 000000");
- this.pwd = "000000";
- }
- }
-
- //显示账号信息
- public void showInfo() {
- //可以增加权限的校验
- System.out.println("账号信息 name=" + name + "余额=" + balance + "密码"+pwd);
-
- // if (){
- // System.out.println("账号信息 name=" + name + "余额=" + balance + "密码");
- // }else {
- // System.out.println("你无权查看 ……");
- // }
- }
- }
运行结果:
