关于java的封装

关于java的封装

我们在前面的文章中,了解到了类和对象的知识,以及做了创建对象的时候对内存的分析,我们本篇文章来了解一下面向对象的三大基本特征之一,封装。

一、初识封装

封装就好比,我们把一些物品放在一个箱子里面,然后给箱子留一个缺口也可以把物品拿出来。

结合现实生活中的方式也可以理解,最常见的就是我们敲代码的电脑,我们买来一个笔记本电脑,不需要自己去组装,厂家都已经把笔记本内部的一些复杂构造都封装好了,我们买回来开机就可以使用了,这个电脑也给外部留了一些接口,比如电源,usb插口等。

  • 该漏的漏,该藏的藏!

  • 我们程序的设计,应该遵循高内聚,低耦合

  • 高内聚:类的内部数据操作由自己完成,不允许外部干涉。

比如银行的钱,只能自己去管理,不允许外部人员参与管理,拒绝外部干涉。

  • 低耦合:仅暴露少量的方法供外部使用。

比如我们去银行取钱,只能用自己的银行卡区去取钱。

  • 属性私有:get / set

二、私有(private)

属性的私有就是,在类中进行修饰,把类中的属性变为私有的属性,不可以随意调用。

我们用代码的方式来说明一下,首先我们创建一个学生类,并且创建的属性和方法用private修饰。

package oop.Demo04;
//private:私有  public:公有
public class Students
{
    //姓名
    private String name;
    //学号
    private int id;
    //性别
    private String sex;
    //学习()
    private void study()
    {

    }
}

然后我们用main方法对这个类进行实例化。

package oop.Demo02;

import oop.Demo04.Students;

public class Application {
    public static void main(String[] args) {
        Students s1 = new Students();
        s1.name="";//这里不可以直接调用,编译器会报错提示,如下图。
    }
}

关于java的封装_第1张图片

我们可以发现,如果我们的修饰符是公有的,那可以在创建完对象的时候,直接拿过来使用,但是我们定义的属性是私有属性,就没有权限拿过来使用。

我们如果想去使用,就需要提供一些可以操作这些属性的方法。

  • 提供一些 public 的 get 或者set方法。
  • get :获取这个属性。
  • set :给这个数据设置值。

三、get

package oop.Demo04;
//private:私有  public:公有
public class Students
{
    //姓名
    private String name;
    //学号
    private int id;
    //性别
    private String sex;
    //学习()
    private void study()
    {

    }
    //get方法 公有方法,可以直接调用。
    public String getName()
    {
    	return this.name;
    }
}

四、set

package oop.Demo04;
//private:私有  public:公有
public class Students
{
    //姓名
    private String name;
    //学号
    private int id;
    //性别
    private String sex;
    //学习()
    private void study()
    {

    }
    //get方法 公有方法,可以直接调用。
    public String getName()
    {
    	return this.name;
    }
    //set方法 公有方法,但是要有返回值类型
    public void setName(String name)
    {
    	this.name=name;
    }
}

五、get/set方法的调用

我们上面了解了两个方法,虽然这个类里面的属性都是私有的,但是有开放的方法,就好比是箱子的一个缺口,我们可以通过方法,来调用私有的属性,然后拿来使用。

package oop.Demo02;

import oop.Demo04.Students;

public class Application {
    public static void main(String[] args) {
        
        Students s1 = new Students();//创建对象是s1
        
        s1.setName("落满樱花的羊");//用set方法进行传参
        
        System.out.println(s1.getName());//用get方法进行获取输出
    }
}

我们执行一下代码,发现可以输出名字。

落满樱花的羊

进程结束.......
  • 我们以后在定义属性的时候,基本上都会用private私有修饰符。
  • 我们写get / set 方法的时候也可以发现,比如setName,也是遵循驼峰规则的。
  • alt + ins 快捷键!!我们前面的文章说到他可以直接生成构造器,这个快捷键同样可以生成get set 方法,非常实用!

关于java的封装_第2张图片

根据自己需要的属性去选择,就可以一键生成get和set方法。

六、get/set方法优化

我们再定义一个年龄的属性,age,但是我们知道,人的年龄是有上限和下限的,所以不能随意赋值,我们先看一下错误示范!

package oop.Demo04;
//private:私有  public:公有
public class Students
{
    //姓名
    private String name;
    //学号
    private int id;
    //性别
    private String sex;
    //年龄
    private int age;

    public String getName()
    {
        return this.name;
    }
    public void setName(String name)
    {
        this.name=name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}

我们这里定义好一个年龄的get set 方法,我们输出一个200岁。

package oop.Demo02;

import oop.Demo04.Students;

public class Application {
    public static void main(String[] args) {
        Students s1 = new Students();
        s1.setName("落满樱花的羊");
        System.out.println(s1.getName());
        s1.setAge(200);
        System.out.println(s1.getAge());
    }
}
落满樱花的羊
200

进程结束......

我们可以看到,虽然我们可以正常输出,但是人没有200岁这个年纪,方法是我们自己定义的,所以我们一样可以在封装的方法里面去优化,可以加一个判断。

    public void setAge(int age) {
        if (age>120 || age<0)
        {
            this.age=1;
        }
        else
        {
            this.age = age;
        }
    }

我们再执行刚刚传参200的代码,就会发现,输出的结果是

落满樱花的羊
1
    
进程结束......

七、封装的意义

  • 提供程序的安全性,可以保护数据。
  • 隐藏代码的细节,比如年龄设计。
  • 统一接口,所有的方法都是get set。
  • 提高了系统的可维护性,良好的封装可以便于我们更改内部代码。
  • 将数据的属性隐藏起来,禁止直接访问其中一个属性,需要通过接口去访问,也称之为信息隐藏。
  • 注意方法的重载,可以多去参考一下println方法。

你可能感兴趣的:(java,电脑,开发语言)