面向对象三大巨头知识点----封装
在日常生活中,会使用到的电视机就是封装的典型案例。
用户使用的工具为 遥控器,开关机键,声音调节键,换台键。这些操作步骤,用户轻轻点下遥控器上的按键即可实现。但是实际上这些功能背后的操作远远不止这些。还需要电视机内部的信号接收器与其他元件配合,才能完成。那么将这些电视机内部的操作隐藏起来,只给用户提供一个遥控器作为操作。这就是一种封装。
在java中就是将抽象的数据(属性)和对数据的操作(方法)封装在一起,数据被保护在内部,只有通过对外提供的被授权的操作(方法)才可以对数据进行操作。
将数据封装起来,就相当于把重要的东西放进保险柜里。
一般使用保鲜柜存钱有以下步骤:
打开保险柜 钱放进去 设置密码 关上保险柜
那么再想使用这笔钱的时候就不能直接拿了,得输入密码验证。同理在java中也有一系列的步骤
要求写出以下调节的封装,以便理解
1.在Person类中封装了 隐私信息(年龄,薪水)
2.要求别的类要设置隐私信息时,必须符合一定的合理性(年龄不能超过120小于1,名字不能超过4个字符串小于2个字符)
public class EncTest01 {
public static void main(String[] args) {
Person p1 = new Person();
p1.setName("古海");
p1.setAge(25);
p1.setSalary(58000);
System.out.println("p1的信息为:名字"+p1.getName()+"年龄"+p1.getAge()+"薪水"+p1.getSalary()+"/月");
}
}
class Person{
public String name;//名字公开
private int age;
private double salary;
public String getName() {
return name;
}
public void setName(String name) {
if (name.length() >= 2 &&name.length() <= 4) {
this.name = name;
}else{
System.out.println("请输入正确的名字");
this.name = "erro";
}
}
public int getAge() {
return age;
}
public void setAge(int age) {
if (age >= 1 && age <= 120) {
this.age = age;
}else{
System.out.println("请输入正常的年龄");
}
}
public double getSalary() {
//如果想别人不是那么简单就获取到薪水金额,可以在这里设置类似密码的关卡
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
}
理解:封装在代码的操作中就是 通过private修饰符和public修饰符的合作搭配来保护数据,提供可操作的方法。
原理:private修饰的数据虽然只能在本类中调用,但是如果再在本类写一个用public修饰符的方法,然后在这个方法里调用private修饰的数据。这样就可以在别的类甚至不同包的类都可以通过这个public的方法获取和设置受保护的数据了
封装关键字释义:private 私有数据修饰符
set方法:设置私有数据的方法,一般都会在里面设置一些符合条件才能设置的代码
get方法:获取到私有数据的方法,同理也会写符合权限才能获取的代码
在上面的入门案例中成功的将隐私数据保护起来了,但是如果在构造器中也写了接收隐私数据且修改的代码,就会绕过之前在set方法中写的合理性约束。
public Person(String name,int age,double salary){
this,name = name;
this,age= age;
this,salary = salary;
}
这样写的话,就算在set方法写了制约条件,也会直接跳过进行修改。
那么为了维持保护数据依旧安全,可以在构造器中的赋值代码变成调用set方法进行赋值。
public class EncTest01 {
public static void main(String[] args) {
Person p1 = new Person("古海",250,50000);
System.out.println("p1的信息为:名字"+p1.getName()+"年龄"+p1.getAge()+"薪水"+p1.getSalary()+"/月");
}
}
class Person{
public String name;//名字公开
private int age;
private double salary;
//构造器也使用set方法进行赋值
public Person(String name,int age,double salary) {
setName(name);
setAge(age);
setSalary(salary);
}
public String getName() {
return name;
}
public void setName(String name) {
if (name.length() >= 2 &&name.length() <= 4) {
this.name = name;
}else{
System.out.println("请输入正确的名字");
this.name = "erro";
}
}
public int getAge() {
return age;
}
public void setAge(int age) {
if (age >= 1 && age <= 120) {
this.age = age;
}else{
System.out.println("请输入正常的年龄");
}
}
public double getSalary() {
//如果想别人不是那么简单就获取到薪水金额,可以在这里设置类似密码的关卡
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
}
这样就维持了安全性,同理也可以写根据传入的不同参数重载不同参数的构造器,只要内部还是使用set方法就可以
public class AccountTest {
public static void main(String[] args) {
Account a1 = new Account();
a1.setName("大老二");
a1.setBalance(6000000);
a1.setPass("ui123442");
System.out.println("a1的信息为:"+a1.getName()+"密码:"+a1.getPass()+"账户余额:"+a1.getBalance());
}
}
class Account{
private String name;
private double balance;
private String pass;
public String getName() {
return name;
}
public void setName(String name) {
if (name.length() <= 4 && name.length() >= 2) {
this.name = name;
}else{
System.out.println("名字长度需要在2~4之间,请重新输入");
}
}
public double getBalance() {
return balance;
}
public void setBalance(double balance) {
if (balance >= 20) {
this.balance = balance;
}else{
System.out.println("这点钱就算了");
}
}
public String getPass() {
return pass;
}
public void setPass(String pass) {
if (pass.length() >= 6 && pass.length()<= 16) {
this.pass = pass;
}else{
System.out.println("密码长度需要在6~16之间");
}
}
}