JAVA 封装
封装
面向对象的三大基本特征:封装,继承,多态
一、封装介绍
封装(encapsulation)就是把抽象出的数据[属性]和对数据的操作[方法]封装在一起,数据被保护在内部,程序的其他部分只有通过被授权的操作[方法],才能对数据进行操作
二、封装的理解和好处
- 隐藏实现的细节,方法(连接数据库) <-- 调用(传入参数)
- 可以对数据进行验证,保证安全合理
三、封装的实现步骤
-
将属性进行私有化private,[不能直接修改]
-
提供一个公共(public)set方法,用于对属性判断并赋值
public void setXxx(类型 参数名){//Xxx表示某个属性 //加入数据验证的业务逻辑 属性 = 参数名; }
-
提供一个公共的get方法,用于获取属性的值
public XX getXxx(){//权限判断 return xx; }
-
将构造器和set 进行结合
快速入门
题目:请大家看一个小程序(com.hspedu.encap: Encapsulation01.java),
- 不能随便查看人的年龄,工资等隐私,并对设置的年龄进行合理的验证。年龄合理就设置,否则给默认 年龄, 必须在 1-120, 年龄,
- 工资不能直接查看 , name 的长度在 2-6 字符 之间
package com.hspedu.encap;
import java.util.Scanner;
public class Encapsulation01 {
public static void main(String[] args) {
Person person = new Person();
person.setName("小杨 123456879");
person.setAge(21);
person.setSalary(6000);
System.out.println(person.info());
//如果我们直接使用构造器指定属性
System.out.println("smithi的信息");
Person smith = new Person("smith", 130, 7000);
System.out.println(smith.info());
}
}
/*
1. 不能随便查看人的年龄,工资等隐私,并对设置的年龄进行合理的验证。
年龄合理就设置,否则给默认 年龄, 必须在 1-120
2. 工资不能直接查看,name 的长度在 2-6 字符 之间
*/
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方法写在构造器中,这样仍然可以验证
setName(name);
setAge(age);
setSalary(salary);
}
//自己写setXxx getXxx 太慢,使用快捷键 -> alt + inset -> getter and setter
//然后根据要求来完善我们的代码
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; //给的一个默认年龄
}
}
public double getSalary() {
//可以对当前对象的权限判断
Scanner scanner = new Scanner(System.in);
int password = 123456;
if( password == 123456){
return salary;
}else{
System.out.println("输入的密码有误,无法查看");
return 0;
}
}
public void setSalary(double salary) {
this.salary = salary;
}
//写一个方法,返回属性信息
public String info(){
return "info name=" + name + " age=" + age + " salary=" + salary;
}
}
四、练习
题目:
创建程序,在其中定义两个类:
Account 和 AccountTest 类体会 Java 的封装性。
-
Account 类要求具有属性:姓名(长度为 2 位 3 位或 4 位)、余额(必须>20)、 密码(必须是六位), 如果不满足,则给出提示信息,并给默认值(程序员自己定) 通过 setXxx 的方法给 Account 的属性赋值。
-
在 AccountTest 中测试
Account.java
package com.hspedu.encap;
import java.util.Scanner;
public class Account {
private String name;
private double money;
private String password;
public Account() {
}
public Account(String name, double money, String password) {
setName(name);
setMoney(money);
setPassword(password);
}
public String getName() {
return name;
}
public void setName(String name) {
if (name != null && name.length() >= 2 && name.length() <= 4) {
this.name = name;
} else {
this.name = "无名";
System.out.println("用户名的长度需在 2~4 个字符之间,默认为无名");
}
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
if(money >20){
this.money = money;
}else{
System.out.println("余额必须>20,默认为0");
this.money = 0;
}
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
if (password.length()==6){
this.password = password;
}else{
this.password = "123456";
System.out.println("密码必须为6位,已设为默认密码123456");
}
}
//获取信息
public String getInfo(){
System.out.println("请输入密码:");
Scanner sc = new Scanner(System.in);
while(true){
if(sc.next().equals(password)){
return name + "信息如下:\n" + "姓名:" + name + " 余额:" + money + " 密码:" + password;
}else{
System.out.println("密码错误请重新输入");
}
}
}
}
AccountTest.java
package com.hspedu.encap;
import com.hspedu.modifier.A;
public class AccountTest {
public static void main(String[] args) {
Account at = new Account();
at.setName("小杨");
at.setMoney(2);
at.setPassword("1111111");
System.out.println(at.getInfo());
}
}