信息的隐藏与封装

阅读量: 1006 编辑

类的属性和方法有时候我们不希望其他的类或子类使用,该怎么办呢?可以通过信息的隐藏与封装实现,在Java中就是通过 <modifiers>来实现;

[<modifiers>] class <class_name>

1、<modifiers> 有四种形式:publicprotecteddefaultprivate 来实现的;

2、default 表示不写,比如 class Person也是可以的;

3、这四种形式,有自己的隐藏和封装范围(参考下方图标);

一、信息隐藏介绍

1、隐藏:指的是对象的一种保护机制,使得它的属性或方法不被外部的程序直接访问;因为,使用者对类内部定义的数据(属性)的直接操作,可能会导致数据的错误、混乱或安全性问题;

2、就像一个人的名字是可以公开(public)的,但是身份证信息就需要保密(private);

二、信息封装介绍

1、封装指的是将对象的状态信息(属性)和行为(函数)捆绑为一个逻辑单元的机制;

2、Java 中通过将数据封装、声明为私有的(private),再提供一个或多个公开的(public)方法实现对该属性的操作,以实现下述目的:

  • 隐藏一个类的实现细节;

  • 防止对封装数据的未经授权的访问;

  • 有利于保证数据的完整性,增强代码的可维护性;

三、如何实现封装和隐藏

1、通过修饰符<modifiers>控制隐藏范围:publicprotecteddefaultprivate

2、可以通过自定义 setter 和 getter 方法来控制我们想(公开)暴露的数据;

四、修饰符的权限

参考下方图表,选择<modifiers>控制隐藏范围即可;表示可以访问,×表示不可以访问;

作用域 当前类 同一包内 不同包子孙类 不同包其他类
public
protected ×
default × ×
private × × ×

1、可以看到,public的访问范围最大;private的访问范围最小;

2、在编程中,一般属性用private居多,方法用public居多;

五、编程实战

代码的详细解读,可以参考视频教程

Person.java

/**
 * User: 祁大聪
 */
public class Person {

    public String name;                      // public(公共的)
    int age;                                 // default(默认的)
    private int money=1000000; 			 // protected(私有的)
    protected int grades;                      // protected (保护的)

    public void printPersonInfo(){
        this.name = "三妮";
        this.age = 100;
    }

    //封装money对应的开放函数,通过密码才能访问
    protected int getPersonMoney(String password){
        if(password == "111"){
            return this.money;
        }else{
            return 0;
        }
    }

    public static void main(String[] args) {
        Person p = new Person();
        p.name = "三妮";
        p.age = 100;
        p.money = 10000;//同一个函数内可以使用money
        p.grades = 100;
    }


    //通过自定属性的setter & getter方法,来控制属性的访问
    public String getName() {
        return name;
    }

    public void setName(String name) {
        //逻辑控制
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getMoney() {
        return money;
    }

    public void setMoney(int money) {
        this.money = money;
    }

    public int getGrades() {
        return grades;
    }

    public void setGrades(int grades) {
        this.grades = grades;
    }
}

测试类,调用 Person.java 中的成员

PersonTest.java

// 和 Person.java 在同一个package(包)中

/**
 * User: 祁大聪,通过PersonTest理解访问权限
 */
public class PersonTest {

    public static void main(String[] args) {
        Person p = new Person();
        
        //age是default,但是在同一包内,可以访问
        p.age = 28;	
        
//        p.money = 1000;    				  //这个是不可以直接访问,因为是私有的

        int money = p.getPersonMoney("112");  //可以通过开放函数访问私有数据
        System.out.println("money = " + money);
    }
}

爱码岛编程公众号
试卷资料
爱码岛编程小程序
在线刷题
苏ICP备13052010号
©2023 南京匠成信息科技有限公司