面向对象——封装

举报
荞慧子 发表于 2022/12/31 23:31:27 2022/12/31
【摘要】  一、访问修饰符(1)基本介绍        java提供四种访问控制修饰符号,用于控制方法和属性(成员变量)的访问权限(范围)。1)公开级别:用public修饰,对外公开。2)受保护级别:用protected修饰,对子类和同一个包中的类公开。3)默认级别:没有修饰符号,对同一个包中的类公开。4)私有级别:用private修饰,只有类本身可以访问,不对外公开。(2)四种访问修饰符的访问范围访...

 一、访问修饰符

(1)基本介绍

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

1)公开级别:用public修饰,对外公开。

2)受保护级别:用protected修饰,对子类和同一个包中的类公开。

3)默认级别:没有修饰符号,对同一个包中的类公开。

4)私有级别:用private修饰,只有类本身可以访问,不对外公开。

(2)四种访问修饰符的访问范围

访问修饰符 同类 同包 子类 不同包
public
protected ×
默认 × ×
private × × ×

(3)注意事项

1)修饰符可以用来修饰类中的属性,成员方法以及类

2)只有默认修饰符和public修饰符才可以修饰类,并且遵循上述访问权限的特点

3)成员方法的访问规则和属性完全一致

二、封装

(1)介绍

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

(2)实现步骤

1)将属性进行私有化private,也就是不可以直接修改属性

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

public void setXXX(类型 参数名) {//XXX表示某个属性
    //加入数据验证的业务逻辑
    属性 = 参数名
}

3)提供一个公有的(public)get方法,用于获取属性的值

public 数据类型 getXXX() {//权限判断,XXX表示某个属性
    return xx;
}

(3)入门案例

编写一个程序,要求如下:

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

package com.hspedu.encap;

// encapsulation 封装

// set方法用于对属性判断并赋值
// get方法用于获取属性的值
public class Encapsulation01 {

    public static void main(String[] args) {

        Person person = new Person();
        person.setName("zwy");
        person.setAge(18);
        person.setSalary(30000);
        System.out.println("=====zwy的基本信息=====");
        System.out.println(person.Info());

        // 构造器的指定属性
        Person ttkx = new Person("ttkx", 110, 50000);
        System.out.println("=====ttkx的基本信息=====");
        System.out.println(ttkx.Info());
    }
}

// 不能随便查看人的年龄,工资等隐私,并对设置的年龄进行合理的验证。
// 年龄合理就设置,否则给默认年龄,必须在 1 - 100 之间,
// 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;

        // 调方法
        setName(name); // 因为setName指的就是本类的,所以等价于this.srtName
        setAge(age);
        setSalary(salary);
    }

    //快捷键Alt + Insert 调用
    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 = "ttkx";
        }

    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        if(age >= 1 && age <= 100) {
            this.age = age;
        } else {
            System.out.println("年龄必须在 1 - 100 之间");
            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=" + salary;
    }
}

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。