封装
封装是面向对象的三大特征之一,就是将类的状态信息隐藏在类内部,不允许外部程序直接访问,而通过该类提供的方法来实现对隐藏信息的操作和访问。
封装的具体步骤
1.修改属性的可见性来限制对属性的访问
2.为每个属性创建一对赋值方法和取值方法,用于对这些属性的存取
3.在赋值方法中,加入对属性的存取控制语句
封装的好处
1.隐藏类的实现细节
2.让使用者只能通过程序规定的方法来访问数据
3.可以方便的加入存取控制语句,限制不合理操作
封装时会用到多个权限控制符来修饰成员变量和方法,区别如下:
private:成员变量和方法,只能在其定义的类中被访问,具有类可见性
默认:成员变量和方法,只能在其定义的包里被访问,具有包可见性
protected:可以被同一个包里的类访问,被同一个项目中不同包中的子类访问
public:可以被同一个项目中的所有类访问,具有项目可见性,这是最大的访问权限
/**
* 宠物狗狗类,使用权限修饰符private和public进行封装
*/
class Dog {
private String name="无名氏";
private int health=100;
private int love=0;
private String strain="聪明的拉布拉多犬";
/**
* 通过构造方法指定狗狗的昵称,品种
*/
public Dog(String name,String strain){
this.name=name;
this.strain=strain;
}
/**
* 通过吃饭增加健康值
*/
public void eat(){
if(health>=100){
System.out.println("狗狗需要多运动啊!");
}else{
health=health+3;
System.out.println("狗狗吃饱饭了!");
}
}
/**
* 通过玩游戏增加与主人的亲密度,减少健康值
*/
public void play(){
if(health<60){
System.out.println("狗狗生病了!");
}else{
System.out.println("狗狗正在和主人玩耍。");
health=health-10;
love=love+5;
}
}
/**
* 读取狗狗的昵称
*/
public String getName(){
return name;
}
/**
* 读取狗狗的健康值
*/
public int getHealth(){
return health;
}
/**
* 读取狗狗与主人的亲密度
*/
public int getLove(){
return love;
}
/**
* 读取狗狗的品种
*/
public String getStrain(){
return strain;
}
/**
* 输出狗狗的信息
*/
public void print(){
System.out.println("宠物的自白:\n我的名字叫"+this.name+",健康值是"+this.health+",和主人的亲密度是"+this.love+",我是一只"+this.strain+"。");
}
public static void main(String[] args) {
Dog dog=new Dog("欧欧","酷酷的雪纳瑞");
dog.play();
System.out.println("健康值是"+dog.getHealth());
dog.eat();
dog.print();
}
}
This
使用this调用成员变量,解决成员变量和局部变量的同名冲突。
public void setName(String name){
this.name=name;//成员变量和局部变量同名,必须用this
}
public void setName(String xm){
name=xm;//成员变量和局部变量不同命,this 可以省略
}
使用this调用成员变量
public void play(int n){
health =health-n;
this.print();//this可以省略,直接调用print();
}
使用this调用重在的构造方法,只能在构造方法中使用,必须是构造方法的第一条语句
public Penguin(String name,String sex){
this.name=name;
this.sex=sex;
}
public Penguin(String name,int health,int love,String sex){
this(name,sex);//调用重载的构造方法
this.health=health;
this.love=love;
}
因为this在对象内部指代自身的引用,所以this只能调用实例变量,实例方法和构造方法
this不能调用类变量和类方法,也不能调用局部变量