封装的作用和含义:
程序的设计要追求“高内聚,低耦合”。高内聚就是类的内部数据操作细节自己完成,不允许外部干涉;低耦合是仅暴露少量的方法给外部使用,尽量方便外部调用。
编程中封装的具体优点:
提高代码的安全性。
提高代码的复用性。
“高内聚”:封装细节,便于修改内部代码,提高可维护性。
“低耦合”:简化外部调用,便于调用者使用,便于扩展和协作。
封装的实现——使用访问控制符
Java是使用“访问控制符”来控制哪些细节需要封装,哪些细节需要暴露的。
Java中4种“访问控制符”分别为private、default、protected、public。
【注】关于protected的两个细节:
1.若父类和子类在同一个包中,子类可访问父类的protected成员,也可访问父类对象的protected成员。
2.若子类和父类不在同一个包中,子类可访问父类的protected成员,不能访问父类对象的protected成员。
封装的使用细节
开发中封装的简单规则:
属性:一般使用private访问权限。属性私有后,提供相应的get/set方法来访问相关属性,这些方法通常是public修饰的,以提供对属性的赋值与读取操作(注意:boolean变量的get方法是is开头)。
方法:一些只用于本类的辅助性方法可以用private修饰,希望其他类调用的方法用public修饰。
JavaBean的封装演示:
public class Person{
//属性一般使用private修饰
private String name;
private int age;
private boolean flag;
//为属性提供public修饰的set/get方法
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public int getAge(){
return age;
}
public void setAge(int age){
this.age = age;
}
public boolean isFlag(){ //注意:boolean类型的属性get方法是is开头的
return flag;
}
public void setFlag(boolean flag){
this.flag = flag;
}
}
封装的使用:
class person{
private String name;
private int age;
public Person(){}
public Person(String name,int age){
this.name = name;
//this.age = age; //构造方法中不能直接赋值,应该调用setAge()方法
setAge(age);
}
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
public void setAge(int age){
//在赋值之前先判断年龄是否合法
if(age > 130 || age < 0){
this.age = 18; //不合法赋默认值18
}else{
this.age = age; //合法才能赋值给属性age
}
}
public int getAge(){
return age;
}
@Override
public String toString(){
return "Person [name=" + name + ",age=" + age +"]";
}
}
public class Test2{
public static void main(String[] args){
Person p1 = new Person();
//p1.name = "小明"; //编译错误
//p1.age = -45; //编译错误
p1.setName("小明");
p1.setAge(-45);
System.out.println(p1);
Person p2 = new Person("小华",300);
System.out.println(p2);
}
}