封装定义
将类的某些信息隐藏在类内部,不允许外部程序直接访问,
通过该类提供的方法来实现对隐藏信息的操作和访问。
简单来说就是隐藏对象的信息,同时留出访问的接口。
封装特点
1.只能通过规定的方法访问数据
2.隐藏类的实例细节,方便修改和实现
如何理解封装?
举个生活中的例子,比如ATM机内部存储了很多钞票,但是用户是无法随意直接查看和获取的,这就是ATM机对钞票这个重要信息的隐藏,但同时ATM机也提供了相关的操作接口,用户只需要通过简单的操作就可以获取到机器里存储的钞票。
对于用户而言,其实是不关心机器里面到底在什么位置,以什么形式存放这些钞票的。只要能通过银行卡对钞票进行正确的存取就好了。
这样通过ATM机既保证了重要信息钞票的安全性,同时又通过了一系列的对外接口实现了用户的便捷操作。而且对于用户而言,无论ATM机的内部构造发生了怎样的变化,只要对外的操作口不发生改变,就可以照常进行存取钱操作。
总结
封装是面向对象编程的核心思想,将对象的属性和行为封装起来,而将对象的属性和行为封装起来的载体就是类,类通常对客户隐藏其实现细节,这就是封装的思想,用户只能通过对外提供的接口访问数据
封装的实现
封装步骤
- 修改属性的可见性,设为private
- 创建getter/setter方法,设为public,用于属性的读写
- 在getter/setter方法中加入属性控制语句
注意事项
- 只有getter方法的属性是只读属性,只有setter方法的属性是只写属性
- boolean类型的getter方法是is开头的,如isFlag();
- 如果在setter方法中有对属性进行限定,那么在带该参数的构造方法里也最好调用setter方法进行属性赋值
- 批量生成getter和setter方法,在eclipse中快捷键为alt+shift+s,选择Generate Getters and Setters
封装代码实现
package com.silly.animal;
/**
* 宠物猫类
*/
public class Cat {
// 成员属性:昵称、年龄、体重、品种
// 1.修改属性的可见性---private 限定只能在当前类内访问
private String name;// 昵称
private int month;// 年龄
private double weight;// 体重
private String species;// 品种
private boolean sex; //性别
//构造方法
public Cat() {
}
public Cat(int month, String name) {
this.name = name;
// this.month=month;
//如果有对属性进行判断,最好调用setter方法
this.setMonth(month);
}
// 2.创建get/set方法
public void setName(String name) {
this.name = name;
}
public String getName() {
return "我是一只名叫:" + this.name + "的宠物猫";
}
public int getMonth() {
return month;
}
public void setMonth(int month) {
// 3.在get/set方法中添加对属性的限定
if (month <= 0)
System.out.println("输入信息错误,宠物猫的年龄必须大于0");
else
this.month = month;
}
public double getWeight() {
return weight;
}
public void setWeight(double weight) {
this.weight = weight;
}
public String getSpecies() {
return species;
}
public void setSpecies(String species) {
this.species = species;
}
//特别注意boolean类型的getter方法
public boolean isSex() {
return sex;
}
public void setSex(boolean sex) {
this.sex = sex;
}
}
对封装类进行访问
public class CatTest {
public static void main(String[] args) {
Cat one = new Cat();
//设置属性
one.setName("花花");
one.setMonth(-3);//打印输入信息错误
//访问属性
System.out.println("昵称:" + one.getName()); //我是一只名叫:花花的宠物猫
System.out.println("昵称:" + one.getMonth()); //0
}
}