我们之前都只写了一个类,现在我们写两个类试试看:(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)有必要时加入控制语句等限制。
本人水平有限,若有错误,请指出~