本章主要介绍一下java的三大特征之——封装
访问修饰符
访问修饰符是用来修饰对类、变量、方法和构造方法访问的权限
Java 支持 4 种不同级别的访问权限
private 、default 、protected 、public
private
在同一类内可见
使用对象:变量、方法
default
默认、在同一包内可见
使用对象:类、接口、变量、方法
注意:java保留字中没有default,如果想用此修饰符,直接缺省修饰符即可(就不用写修饰符)。
protected
同一包内的类和所有子类可见(不知道子类先别急,学完继承就知道了)
使用对象:变量、方法
public
对所有类可见
使用对象:类、接口、变量、方法
演示
例:
接下来我们借助idea来进行测试;
先创建如上,包 com.Access.a 和包 com.Access.b
在包 com.Access.a 中创建类 a01.java 和 a02.java
在包 com.Access.b 中创建类 b01.java 和 b02.java,其中 b02.java 继承 a01.java
在 a01.java 写如下代码
在 a01.java 中测试如下(n1,n2,n3,n4均可访问):
在 a02.java 中测试如下(n1不可访问):
在 b01.java 中测试如下(仅 n4 可访问):
在 b02.java 中测试如下:
直接实例化 a01(仅可访问n4)
通过父类访问(n3,n4可访问)
三大特征之——封装
封装的意义
在讲解封装之前,我们先看一下下方的cat类
public class cat { String name; int height; public cat(String name,int height){ this.name = name; this.height = height; } }
我想请问一下,上述的cat类有问题吗
肯定有,问题大了,具体有什么问题,如下
public class catTest { public static void main(String[] args) { cat cat1 = new cat("小花",30); } }
到这里一切还正常,那再往下走:
public class catTest { public static void main(String[] args) { cat cat1 = new cat("小花",30); cat1.height = 0; } }
看到了吗,经典的“扁平的猫”,恭喜你,得到了一个身高为 0 的猫。
封装的实现
那么,我们怎么样才能避免获得一个“扁平的猫”呢,话句话说,我们该如何进行封装呢。
我们以上述cat类为例,为了简介,我们在此暂时去掉“name”属性。
我们获得如下 cat 类
public class cat { int height; public cat(int height){ this.height = height; } }
接下来,我们对height进行封装,封装的目的就是防止该属性被随意的修改;因此我们对需要进行封装的类添加 private 修饰符进行修饰,修饰后结果如下:
public class cat { private int height; public cat(int height){ this.height = height; } }
但是修饰完之后,我在别的类里面该怎么获取和修改该属性呢,此时,我们就要添加 public修饰的 getxx 和 setxx 方法,修改后如下:
public class cat { private int height; public cat(int height){ this.height = height; } public int getHeight() { return height; } public void setHeight(int height) { this.height = height; } }
我们现在再对 cat 的 height 操作就不能直接 cat.height 了,但是还是有问题,如下:
public class catTest { public static void main(String[] args) { cat cat1 = new cat(30); cat1.setHeight(0); } }
我还是可以获得一个扁平的猫的,那怎样才能避免这个现象呢,如下:
public class cat { private int height; public cat(int height){ this.setHeight(height); } public int getHeight() { return height; } public void setHeight(int height) { if(height <= 5) height = 5; this.height = height; } }
我们给 setHeight 添加一个判断,并且再构造方法也调用该 setHeight 方法,这样,我们就无论如何也不可能获得到一个“扁平的猫”了。
对于 setxx 方法,我们可以通过某些方式,使其访问收到限制,例如:
public int getHeight(String status) { if(status.equals("vip")) return height; return -1; }
比如这样,除非你的身份是“vip”,否则的花,我就传给你一个 “-1”,通过这种方式来限制访问。
总结
封装就是让不能暴漏或需要权限才能访问的属性进行隐藏,封装的做法就是将需要封装的属性添加 private 修饰符,并且添加 public 修饰的 getxx 和 setxx 方法,必要时再加以合理的判断。
见此章结。