如何理解封装(必看,关于Java类的三大特征之一)

概述:关于Java语言中,类主要三大特征,包括封装、继承和多态,同时,这也对我们在理解Java的类和面向对象概念上非常关键。


1. 化零为整

        化零为整是一种面向对象的思维,将对象理解为一个完整的个体,对象有一定的特征(属性)和行为(方法),将这个整体进行封装,通过某个对象去访问某个对选哪个对象的属性特征,而不是访问零散某个变量,这也是整体性思维。

        如:下列中对学生的特征(属性)进行了封装。

public class Student{

    String id; // 学号

    String name; // 姓名

    int age; // 年龄

    double grade; // 成绩

}

2. 成员变量私有化(private)

        考虑一个问题:为什么要对成员变量进行私有化(private)?

        原因:保护数据的安全性和有效性。

        如:下列中关于年龄的值是不允许为负值的,但是程序中由于“public int age;”表明这个age成员变量是公开的,对于“student.age = -1;”赋值语句是可以完成的,这也就导致了年龄为负值的情况,但这是不符合实际情况的。

public class Student{

    public String id; // 学号

    public String name; // 姓名

    public int age; // 年龄

    public double grade; // 成绩

}

public class Test{

    public static void main(String[] args) {

        Student student = new Student(); // 创建Student类的对象student

        student.age = -1

    }

}

解决方案:将成员变量进行私有化(private)

public class Student{

    private String id; // 学号

    private String name; // 姓名

    private int age; // 年龄

    private double grade; // 成绩

}

public class Test{

    public static void main(String[] args) {

        Student student = new Student(); // 创建Student类的对象student
  
        student.age = -1 // 报错,无法进行属性age进行修改

    }

}

3. 在类中提供Setter和Getter方法(public)

        新产生的问题:在上一个问题中,我们想到用“将成员变量进行私有化”的方法来保护数据的安全性和有效性,但是这也给我们带来了一个新的问题,将类的成员变量私有化(private)了,如果我们想要或者必须对成员变量进行访问了,我们又将如何来访问已经私有化(private)的成员变量呢?

        解决方案:对外(不是在本类访问该方法的情况)提供一个相应的Setter和Getter方法(访问权限为:public)。即在本类之外,如果要对该属性进行访问,可通过该属性相应的Setter和Getter方法(public)对该属性完成访问。

如:

public class Student{

    private String id; // 学号

    private String name; // 姓名

    private int age; // 年龄

    private double grade; // 成绩



    // 属性age的setter方法

    public void setAge(int age) {

        if(age > 0 ) { // 控制数据的有效性

        this.age = age;

        }

    }

    // 属性age的getter方法
    
    public int getAge() {

    return this.age;

    }

}

public class Test{

    public static void main(String[] args) {

        Student student = new Student(); // 创建Student类的对象student

        student.setAge(-1);

        studetn.getAge(); // 一定不是负数

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值