首页 > 技术文章 > 面向对象之封装

syhyfh 2020-03-13 13:41 原文

封装是什么?

首先我们思考一个问题:如何设计一个Person类?

  • 分析:先抽象出这个类的一些属性和方法,Person类都具有姓名和年龄,都可以说话。

class Person
{
    int age;

    void speak()
    {
        System.out.println("age=" + age);
    }
}

  • 上面这段代码咋眼一看没有什么问题,但是当我们在创建对象给age属性赋值时就有问题了:

class  PersonDemo
{
    public static void main(String[] args)
    {
        Person p = new Person();
        p.age = -20;
        p.speak();
    }
}

比如上面代码中的数据明显就是不符合实际的,那么这个时候我们可能会想在赋值之前能不能先进行判断呢?于是:


class Person
{
    int age;

    public void speak(int a)
    {
        if(a > 0 && a < 130)
        {
            age = a;
            speakAge();
        }
        else
            System.out.println("错误的数据");
    }

    void speakAge()
    {
        System.out.println("age=" + age);
    }
}

class  PersonDemo
{
    public static void main(String[] args)
    {
        Person p = new Person();
	p.speak(-20);
    }
}

这样做确实能够避免数据被随意赋值的情况,但这种做法有点复杂并且在实体类中进行判断的情况很少见。那么有没有更简单的方法呢?我们可以使用private关键字来修饰age。private是一个权限修饰符,被它修饰的成员只能在本类中访问。但随之而来的问题就是既然age只能在本类中被访问,那么外界如何操作这个变量呢?我们可以在Person类中提供一个公共的方法,通过这个公共的方法来操作age,于是我们就可以这样来定义Person类:


class Person {
    private int age;

    public void setAge(int a)
    {
        age = a;
    }

    public int getAge() {
        return age;
    }
}

如上所述,这种将数据保护在类的内部,只保留一些公共的方法来与外界进行联系的思想就是封装。这样做可以尽可能地隐藏类内部的细节,使数据更加安全。修改类结构时也很方便。

在Java中如何体现封装思想?

  • 我们首先应该注意:封装的概念其实很广,而private只是其中的一种体现形式而已。

  • 为了更好地理解封装,这里就再举个例子:比如笔者在刷算法题的时候(关于算法题,可以参考笔者该目录下的文章),有时候会发现字符串反转的方法会被调用很多次,所以这时我们就可以把这个方法单独提出来并用private修饰,因为这个方法只服务于本类。


import java.util.Scanner;

public class Main {
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        int n = sc.nextInt();
        for(int i = 10001; i <= 999999; i++) {
            int a = i % 10;
            int b = i / 10 % 10;
            int c = i / 100 % 10;
            int d = i / 1000 % 10;
            int e = i / 10000 % 10;
            int f = i / 100000;
            int sum = a + b + c + d + e + f;
            if(reverse(i) && (sum == n)) {
                System.out.println(i);
            }
        }
    }

    private static boolean reverse(int x) {
        String s1 = String.valueOf(x);
        String s2 = new StringBuffer(s1).reverse().toString();

        if(s1.equals(s2)) {
            return true;
        }
        else
            return false;
    }

}

推荐阅读