1、封装概述
-
封装:把抽象出的数据**【属性**】和对数据的操作【方法】封装在一起,数据被保护在内部,程序的其他部分只有通过被授权的操作【方法】,才能对数据进行操作;
-
封装实现步骤
- 1、隐藏实现细节:方法(连接数据库) <-- 调用(传入参数…)
- 2、可以对数据进行验证,保证安全合理(类似check约束)
// 第一步、将属性进行私有化private;【不能直接修改属性】;
// 第二步、提供一个公共的public set方法,用于对属性进行判断并赋值;
public void setXxx(类型 参数名){ //Xxx表示某个属性
//加入数据验证的业务逻辑
属性 = 参数名
}
//第三步、提供一个公共的(public) get方法,用于获取属性的值;
public 数据类型 getXxx(){// 权限判断
return xx;
}
- 范例:业务场景描述如下
- 查看下程序(com.zrsj.fz:Person.java):
- 不能随便查看人的年龄,工资等隐私,并对设置的年龄进行合理的验证。年龄合理就设置,否则就默认;
- 年龄必须在1-120,年龄,工资不能直接查看,name的长度在2-6字符之间
(1)编写Person类
public 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;
//将set方法写在构造器中,这样仍然可以验证
setSalary(salary);
setName(name);
setAge(age);
}
public String getName() {
return name;
}
public void setName(String name) {
//1、加入对数据的校验,相当于增加了默认逻辑
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() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
//写一个方法,返回属性信息
public String info(){
return "信息为 name =" + name + "age = " + age + "薪水为 =" + salary;
}
}
(2)实例化Person类
public class hello {
public static void main(String[] args) {
Person person = new Person("赵谦孙李周吴郑王",1000,1000);
String output= person.info();
System.out.println(output);
}
}
- 运行结果
2、封装与构造器
2.1、有参构造器:会破解封装机制
//main方法
public class FzMain {
public static void main(String[] args) {
Person person = new Person("赵谦孙李周吴郑王",1000,1000);
String output= person.info();
System.out.println(output);
}
}
//Person类的封装
public 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;
//将防护机制写入到set里面
}
public String getName() {
return name;
}
public void setName(String name) {
//1、加入对数据的校验,相当于增加了默认逻辑
if(name.length() >=2 && name.length()<=6) {
this.name = name;
} else {
System.out.println("名字的长度不对,需要2到6字符,默认名字");
}
}
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() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
//写一个方法,返回属性信息
public String info(){
return "信息为 name =" + name + "age = " + age + "薪水为 =" + salary;
}
}
- 运行结果:
2.2、优化:将set方法写在构造器中
//main方法
package com.zrsj.fz;
public class FzMain {
public static void main(String[] args) {
Person person = new Person("赵谦孙李周吴郑王",1000,1000);
String output= person.info();
System.out.println(output);
}
}
//优化后的构造器 - 将set方法写在构造器中
package com.zrsj.fz;
public 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;
//将set方法写在构造器中,这样仍然可以验证
setSalary(salary);
setName(name);
setAge(age);
}
public String getName() {
return name;
}
public void setName(String name) {
//1、加入对数据的校验,相当于增加了默认逻辑
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() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
//写一个方法,返回属性信息
public String info(){
return "信息为 name =" + name + "age = " + age + "薪水为 =" + salary;
}
}
- 运行结果: