面向对象三大特征:封装、继承、多态
封装(encapsulation)
类里有属性和方法 封装
隐藏实现细节,实现对数据的验证,保证数据安全合理
封装实现步骤
- 将属性进行私有化【不能直接修改属性】
- 提供一个公共的(public)set方法,用于对属性判断并赋值
- 提供一个公共的get方法,用于获取属性的值。
public void setXXX(类型 参数名){
//数据验证的数据逻辑
属性 = 参数名;
}
public 数据类型 getXXX(){
//权限判断
return xx;
}
具体案例
package com.two.encap;
public class Encapsulation01 {
/*
不能随便查看年龄、工资,并对年龄进行合理验证。
年龄合理就设置,否则就默认年龄,必须在1-120,name长度在2-6字符之间
*/
public static void main(String[] args) {
Person person = new Person();
person.setName("Jackrrr");
person.setAge(180);
person.setSalary(10000);
System.out.println(person.info());
System.out.println(person.getSalary());
Person smith = new Person("smith", 2000, 50000);
System.out.println("===========smith 的信息 ======");
System.out.println(smith.info());
}
}
class Person {
public String name;
private int age; //私有化
private double salary;
//构造器
public Person() {
}
//三个属性的构造器
public Person(String name, int age, double salary) {
// this.name = name;
// this.age = age;
// this.salary = salary;
//如果用默认的,无法有防控机制。
// 将set方法写在构造器中,就依然能够验证数据
setSalary(salary);
setName(name);
setAge(age);
}
//根据要求完善代码
public void setName(String name) {
// 增加业务逻辑
if (name.length() >= 2 && name.length() <= 6){
this.name = name;
}else{
this.name = "Noname";
System.out.println("请输入合法名字长度,长度为2-6个字符");
}
}
public String getName() {
return 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内,给默认年龄0");
this.age = 0;
}
}
public double getSalary() {
// 增加对当前对象的权限判断
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
//写一个方法返回属性信息
public String info() {
return "信息为 name = " + name + " age = " + age + " salary = " + salary;
}
}
practice 创建程序,其中定义两个类 Account和AccountTest类
- Account 类要求具有属性:姓名(长度为2-4),余额(>20),密码(必须6位),如果条件不满足,给出提示信息,并给默认值
- 通过setXxx方法给Account属性赋值
- 在AccountTest类中测试
package com.two.encap;
public class AccountTest {
public static void main(String[] args) {
Account account = new Account();
account.setName("sjjjdsa");
account.setPasswd("1234567");
account.setSalary(19);
System.out.println(account.info());
}
}
class Account {
public String name;
private double salary;
private String passwd;
public String getName() {
return name;
}
public void setName(String name) {
if (name.length() >= 2 && name.length() <= 4) {
this.name = name;
} else {
this.name = "no";
System.out.println("姓名有误,输入长度应为2-4");
}
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
if (salary > 20) {
this.salary = salary;
} else {
System.out.println("薪水有误,应大于20");
this.salary = -1;
}
}
public String getPasswd() {
return passwd;
}
public void setPasswd(String passwd) {
if (passwd.length() == 6) {
this.passwd = passwd;
}else{
this.passwd = "000000";
System.out.println("密码设置错误,应为六位");
}
}
// 输出信息
public String info() {
return "信息为 name = " + name + " salary = " + salary + " passwd = " + passwd;
}
}
老师把三个属性都设置成了private属性==、