封装
封装的具体优点:
- 提高代码的安全性
- 提高代码的复用性
- “高内聚”:封装细节,便于修改内部代码,提高可维护性
- “低耦合”:简化外部使用,便于调用者使用,便于扩展和协作
封装的实现——访问控制符
用访问控制符来控制哪些细节需要封装,哪些细节需要暴露
修饰属性和方法以及类
修饰符 | 同一个类 | 同一个包 | 子类 | 所有类 |
---|---|---|---|---|
private | √ | |||
default | √ | √ | ||
protected | √ | √ | √ | |
public | √ | √ | √ | √ |
- private表示私有,只有自己类可以访问
- default表示没有修饰符修饰,只有同一个包的类可以访问
- protected表示可以被同一个包的类以及其他包中的子类访问
- public表示可以被该项目的所有包中的所有类访问
package text;
public class text01 {
public static void main(String[] args) {
Human h = new Human();
}
}
class Human{
//私有的,被封装了——只能自己可见
private int age;
//什么都不加,相当于default——同一个包可以用
String name;
//同一个包的类以及不同包的子类
protected int height;
//所有的类都能用它
public int some;
void sayAge() {
System.out.println(age);
}
}
class Boy extends Human {
public void sayHello(){
//子类无法使用父类的私有属性和方法
//System.out.println(age);
}
}
封装的使用细节
类的属性的处理:
- 一般使用private访问权限
- 提供相应的get/set方法来访问相关属性,这些方法通常是public修饰的,提供对属性的赋值与读取操作
其中:boolean变量的get方法是is开头 - 一些只用于本类的辅助性方法可以用private修饰,帮助其他类调用的方法用public修饰
package text;
public class text01 {
private int id;
private String name;
private int age;
private boolean man;
//对于属性,提供相应的set/get方法来访问私有变量
public void setName(String name){//设置name的值
this.name = name;
}
public String getName(){//获取name的值
return this.name;
}
//不光是可以设置age的值,也可以对age进行相应的处理
public void setAge(int age) {
if(age>=1&&age<=130){
this.age = age;
}else{
System.out.println("请输入正常的年龄!");
}
}
public int getAge(){
return this.age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public boolean isMan() {
return man;
}
public void setMan(boolean man) {
this.man = man;
}
}