封装

我们之前都只写了一个类,现在我们写两个类试试看:(Java中一个项目支持书写任意个类)

书写一个Teacher类,在该类中定义属性和方法,并且书写一个Application类,在该类中书写main方法进行测试。

Teacher:

package com.dh.oop;

public class Teacher {

    public String name;
    public char sex;
    public int age;
    public String subject;

    public void teacher(String name, String subject){
        System.out.println(name+"老师教"+subject);
    }
}

Application

package com.dh.oop;

public class Application {

    public static void main(String[] args) {
        Teacher teacher = new Teacher();
        teacher.name = "Tom";
        teacher.sex = '男';
        teacher.age = 30;
        teacher.subject = "数学";
        teacher.teacher(teacher.name,teacher.subject);
    }
}

封装

此时是没有什么问题的,但是在当前情况下,类的属性是可以任意赋值的,age无论是什么值,都是可以正常运行的,虽然代码没有错误,但是肯定是不符合现实逻辑的,所以我们引入了封装。

1.什么是封装?

封装就是将类的某些属性在类的内部隐藏起来,不能被随意访问和赋值,必须通过特定的方式规范的去使用。就像你不想让别人知道你有多少钱,你就把它放在一个盒子里面放起来,但是你肯定要给自己留一个拿钱的方式对吧,所以这个盒子是可以打开的,但是又不是谁都能打开,所以你就加了把锁,再去数钱和拿钱只能通过钥匙开锁,其它方式打开盒子都是非法的。而我们的封装就是那个盒子。

2.如何实现封装?

第一步需要解决,怎么才能不被访问到呢?这是不是涉及到了访问的权限了!

之前我们有了解过权限修饰符的访问权限,现在我们再来回顾一下:

封装

目前我们是属于同一个包下的无关类,所以想不可见的话,就必须使用private修饰符;

那第一步就解决了,使用private修饰属性

 //1.属性私有化
private String name;
private char sex;
private int age;
private String subject;

封装

(小tip:右击java文件,选择Spilt Vertically就能在页面中同时打开两个java文件了,该操作有时候对于书写代码和观察结果很方便)

但是现在的话,相当于盒子只能你一个人打开,钱只能你一个人用,你老婆肯定是不乐意的(鸡毛掸子准备居然藏私房钱哈哈,所以你肯定得给你老婆也提供一个用钱的方式吧!

这就是我们的第二步,我们知道属性一般是在方法中使用的,反过来就是在方法中可以使用属性,既然你把属性私有化了,那我就写一个公有化方法,把属性写在该类的公有的方法中,我通过访问公有的方法不就可以访问属性了吗?正解!

但是你不知道你是要访问哪个属性,是给属性赋值还是直接使用属性;

所以,我们要为每一个属性分别书写一个set和get方法

//get方法用于返回值,所以不需要参数,但是需要返回值
public String getName() {
    return name;
}

//set方法用于赋值,所以需要参数,不需要返回值
public void setName(String name) {
    this.name = name;
}

public char getSex() {
    return sex;
}

public void setSex(char sex) {
    this.sex = sex;
}

public int getAge() {
    return age;
}

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

public String getSubject() {
    return subject;
}

此时我们就可以通过get方法和set方法操作属性了:

 Teacher2 teacher2 = new Teacher2();
//赋值
teacher2.setName("tom");
//获得值
System.out.println(teacher2.getName());

封装

此时你可能觉得,还不是一样可以对属性进行操作,这个还这么麻烦,要写这么多的方法;

没错,但是我们既然写了那么多的方法就不能浪费了,我们可以在方法中加点东西啊。

(再一个快捷键小tip:alt+ins可以一键帮你生成构造方法、getter/setter方法等。。。点击对应的,再选择你需要的参数)

封装

在Java世界中,你就是神,你想让一个人一千岁就可以一千岁,但是现实生活中,我们的年龄是有限制的。

比如一个略带恐怖的游戏,成年人不能玩,老爷爷老奶奶也不适合玩,只针对年轻人设计的,那你此时对年龄就肯定有限制吧,那你现在的setter方法肯定是不符合要求的吧,我们就得往set方法中填限制条件了。

//在set方法中添加控制语句
public void setAge(int age) {
    if (age<18 || age>40){
        this.age = -1;
    }else{
        this.age = age;
    }
}
Teacher2 teacher2 = new Teacher2();
teacher2.setAge(11);
if(teacher2.getAge()==-1){
    System.out.println("抱歉哦,该游戏略带恐怖,不适合玩!");
}

封装

3.封装总结

封装的作用就是将类的某些属性隐藏在类的内部,隐藏类的实现细节,只给外部提供特定的方式访问。(该藏的藏,该露的露)

封装三步走:

(1)属性私有化;

(2)setter/getter方法;

(3)有必要时加入控制语句等限制。


本人水平有限,若有错误,请指出~

上一篇:谷粒 | 09 | 前端增删改查


下一篇:MyBatis知识汇总(第八篇)ResultMap结果集映射+复杂属性映射【多对一的情况】【一对多的情况】