1. 为什么要用java封装
通过代码进行演示
首先定义一个Cat类,Cat类有两个默认修饰符的属性name与age,和一个构造器
class Cat{
//默认访问修饰符的属性
String name;
int age;
//构造器
public Cat(String name,int age){
this.name = name;
this.age = age;
}
//重写toString 方法
@Override
public String toString() {
return "我的猫"+this.name+"\n它"+this.age+"岁了";
}
}
在main函数里实例化并通过构造器赋值,其中将-1给age
public class Encapsulation1 {
public static void main(String[] args) {
Cat cat = new Cat("小白",-1);
System.out.println(cat.toString());
}
}
输出结果如下
实例cat的age属性是负数,但是年龄为负数是不符合实际的。
2. 处理办法:封装
将Cat类的两个属性私有化,并提供修改和获取这两个属性的公共类方法。
注意,用private 修饰的属性,不能在类外直接使用,所以需要提供赋值和获取的两个public修饰的方法,既set和get。
在setAge(int age)方法中,需要对age的数进行判定,规定在(0,20)是合理区间。
class Cat{
//将属性私有化
private String name;
private int age;
//在构造器中调用set方法
public Cat(String name,int age){
setName(name);
setAge( age );
}
//重写toString 方法
@Override
public String toString() {
return "我的猫"+this.name+"\n它"+this.age+"岁了";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
//在set方法中判断age的数值是否合法
public void setAge(int age) {
if(age < 0 || age >20){
System.out.println("输入的年龄有误,赋予默认值");
age = 1;
}
this.age = age;
}
}
再次调用main函数,实例化Cat并通过构造器赋值,这里的main函数无任何改动,就不重复贴源码了。
输出结果如下
可以看到实例cat的属性已经被修改为默认值1
3. 封装步骤
- 将类的属性私有化(private)
- 提供公共的(public)的set和get方法
- 赋值和取值要通过set和get方法,通过set方法进行属性值的修正,用get方法完成对属性值的获取,get方法要与所返回属性的值的类型保持一致。
4. 封装的好处
- 可以对实例化的对象的属性通过set方法进行纠错,如本文中的案例。
- 改变了内部实现,且除了此类的方法之外,不会影响其他代码。