封装与隐藏
- 程序的设计追求 高内聚和低耦合
- 高内聚 类的内部数据操作细节自己完成,不允许外部干涉
- 低耦合 仅对外暴露少量的方法用于使用
引入
- 我们创建一个类后,可以通过"对象.属性"的方式,对对象的属性进行赋值,此时对对象的属性的赋值操作只受到属性类型和存储范围的限制。
- 在实际问题中我们要求对象属性进行限制,而这些条件不能在属性声明的时候体现,我们也需要避免用户通过"对象。属性"进行赋值。因此我们需要用private来修饰属性
封装性
- 将类的属性私有化(private) 提供公共(public)的方法来设置(setXXX)和获取(getXXX)属性的值
- 举例 set/get 单例模式 私有化的内部方法
封装性的体现 权限修饰符 private -> 缺省(什么也不写default) -> protected -> public
- private 类内部
- default 类内部 同一个包
- protected 类内部 同一个包 不同包的子类
- public 类内部 同一个包 不同包的子类 同一个工程
- 四种权限修饰符可以用来修饰,构造器,内部类,属性,方法
- 类只能用public或缺省修饰
构造器(构造方法, constructor)
构造器的作用
说明
- 如果没有显式的定过类的构造器的话,系统默认提供一个空参的构造器
- 构造器的格式: 权限修饰符 类名(形参列表){}
- 一个类中定义的多个构造器,彼此构成重载
- 一旦我们在类中定义了构造器,系统就不再提供空参的构造器
- 一个类中至少有一个构造器
JavaBean 是指符合下列要求的Java类
- 类是公共
- 有一个无参的公共构造器
- 有属性,并且有对应的get和set
this关键字
- this可以用来修饰 属性 构造器 方法
- 当this修饰属性和方法时 可以理解为 this 等于 当前对象或当前正在创建的对象
- 使用格式 this.属性 或 this。方法
- 通常情况下不写 this. 但当形参的变量名和类的数据名相同时,使用this关键字类区分
this调用构造器
- 在类的构造器中,可以通过 “this(形参列表)” 的方式调用本类其他的构造器
- 构造器不能通过this调用自己
- 如果要使用this调用其他构造器,必须声明在当前构造器首行
- 构造器内部只能声明一个"this(形参列表)"的方式调用其他构造器
public class Test {
public static void main(String[] args) {
Anim an = new Anim();
an.name = "小黑";
an.age = 2;
an.setLegs(8);
an.show();
Per p = new Per("xiao");
p.eat();
p.show();
System.out.println( 5211314 >> 2);
}
}
class Per{
String name;
int age;
public Per() {
System.out.println("Per 构造器");}
public Per(String n) {
name = n;}
public Per(int a) {
age = a;}
public Per(String n,int a) {
name = n;age = a;}
public void eat() {
System.out.println("eat");
}
public void show() {
System.out.println("name = "+name+",age = "+age);
}
}
class Anim{
String name;
int age;
private int legs;
public void setLegs(int l) {
if (l >= 0 && l % 2 == 0) {
legs = l;
}else {
l = 0 ;
}
}
public int getLegs() {
return legs;
}
public void setAge(int a) {
age = a;
}
public int getAge() {
return age;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void eat() {
System.out.println("eat");
}
public void show() {
System.out.println("name = " +name+", age= "+age+", legs= "+legs);
}
}