java系列:访问修饰符和封装

222 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第7天,点击查看活动详情

访问修饰符

基本介绍

java提供四种访问控制符号,用于控制方法和属性(成员变量)的访问权限(范围)

  1. 公开级别:用public修饰,对同类,同包,子类,不同包公开
  2. 受保护级别:用protected修饰,对同类,同包,子类公开
  3. 默认级别:没有修饰符号,对同类,同包公开
  4. 私有级别:用private修饰,只有类本身可以访问,不对外公开

注意事项

  1. 修饰符可以用来修饰类中的属性,成员方法以及类
  2. 只有默认的和public才能修饰类!!!并且遵循上述访问权限的特点
  3. 关于子类中的访问权限,等后面学习继承再详解
  4. 成员方法的访问规则和属性完全一样

image-20221130224333754.png 可以看到,在同一包中,我们可以访问public,protected和默认,但是访问不到n4,也就是使用private修饰的属性

有兴趣的同学也可以自行尝试以下其他的修饰符范围

封装

基本介绍

面向对象有三大特征:封装,继承和多态

封装(encapsulation):就是把抽象出的数据【属性】和对数据的操作【方法】封装在一起,数据被保护在内部,程序的其他部分只有通过被授权的操作【方法】才能对数据进行操作

封装的理解和好处

  1. 隐藏实现细节
  2. 可以对数据进行验证,保证安全合理
  3. Person(name,age)

封装实现步骤

  1. 将属性进行私有化private【不能直接修改属性】

  2. 提供一个公共的(public)set方法,用于对属性判断并赋值

    public void setXxx(类型 参数名){
        //加入数据验证的业务逻辑
        属性 = 参数名;
    }
    
  3. 提供一个公共的(public)get方法,用于获取属性的值

    public 数据类型 getXxx(){
        //权限判断
        return xx;
    }
    

快速入门

看一个案例

Encapsulation01.java

package com.gaogao.encap;
​
public class Encapsulation01 {
    public static void main(String[] args) {
        Person person = new Person();
        person.setName("gaogao");
        person.setAge(30);
        person.setSalary(999999);
        Person baibai = new Person("baibai", 15, 6000);
        System.out.println(baibai.info());
​
        System.out.println(person.info());
​
    }
​
}
/*
    不能随便查看人的年龄,工资等隐私,
    并对设置的年龄进行合理的验证,年龄合理就设置,
    否则就给默认,年龄必须在1-120之间,工资不能直接查看,
    name的长度在2-6之间
     */
//自己写setXxx和getXxx太慢,我们使用快捷键alt + ins
//然后根据要求来完善代码
​
​
class Person{
​
    public String name;
    private int age;
    private double salary;
​
    //先创建一个无参构造器
​
    public Person() {
    }
​
    //创建一个带有三个参数的构造器,调用一下试试
    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() <= 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("您的输入有误,给一个默认年龄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;
    }
​
​
}

不能随便查看人的年龄,工资等隐私,并对设置的年龄进行合理的验证,年龄合理就设置,否则就给默认,年龄必须在1-120之间,工资不能直接查看,name的长度在2-6之间

public class Person{
    public String name;
    private int age;
    private double salary;
    private String job;
    //自己写setXxx和getXxx太慢,我们使用快捷键alt + ins
    //然后根据要求来完善代码
}

image-20221201001547149.png

封装与构造器

将构造器与setXxx结合

看一个代码

public Person(String name, int age, double salary) {
    this.name = name;
    this.age = age;
    this.salary = salary;
}

使用构造器就把原本的权限破坏掉了

解决方法:我们可以在构造器中使用set方法