我们在前面的文章中,了解到了类和对象的知识,以及做了创建对象的时候对内存的分析,我们本篇文章来了解一下面向对象的三大基本特征之一,封装。
封装就好比,我们把一些物品放在一个箱子里面,然后给箱子留一个缺口也可以把物品拿出来。
结合现实生活中的方式也可以理解,最常见的就是我们敲代码的电脑,我们买来一个笔记本电脑,不需要自己去组装,厂家都已经把笔记本内部的一些复杂构造都封装好了,我们买回来开机就可以使用了,这个电脑也给外部留了一些接口,比如电源,usb插口等。
该漏的漏,该藏的藏!
我们程序的设计,应该遵循高内聚,低耦合。
高内聚:类的内部数据操作由自己完成,不允许外部干涉。
比如银行的钱,只能自己去管理,不允许外部人员参与管理,拒绝外部干涉。
比如我们去银行取钱,只能用自己的银行卡区去取钱。
属性的私有就是,在类中进行修饰,把类中的属性变为私有的属性,不可以随意调用。
我们用代码的方式来说明一下,首先我们创建一个学生类,并且创建的属性和方法用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="";//这里不可以直接调用,编译器会报错提示,如下图。
}
}
我们可以发现,如果我们的修饰符是公有的,那可以在创建完对象的时候,直接拿过来使用,但是我们定义的属性是私有属性,就没有权限拿过来使用。
我们如果想去使用,就需要提供一些可以操作这些属性的方法。
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;
}
}
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;
}
}
我们上面了解了两个方法,虽然这个类里面的属性都是私有的,但是有开放的方法,就好比是箱子的一个缺口,我们可以通过方法,来调用私有的属性,然后拿来使用。
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方法进行获取输出
}
}
我们执行一下代码,发现可以输出名字。
落满樱花的羊
进程结束.......
根据自己需要的属性去选择,就可以一键生成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
进程结束......