今天重温封装性,在原来比较较混乱的理解上有了更加深层次的认识。主要是通过一个代码举例来表现的,具体如下:
第一个例子:
/*
* 面向对象一:封装与隐藏
*
* ----封装性的体现:
* 将类的属性xx私有化(private),同时,提供公共的(public)方法来获取(getxx)和设置(setxx)此属性的值
*
*/
public class PrivateTest {
public static void main(String[] args) {
//实例化Animal
Animal a = new Animal();
//调用Animal的属性
a.name = "大黄";
a.setAge(0);
// a.age = 1;
/*
* 但实际问题限制:legs是不可能是负数的
* ---->在实际开发中可能会有额外的限制
* 这些限制条件,在属性声明的时候体现,是有困难的
* 因为在给属性赋值的时候,通过属性声明只能体现类型,只要在声明的类型所表示的范围内的话,是不会报错的
*
* 思考:如何给属性加一个限制,使得赋值的时候只能赋整偶数呢?
* 其实,限制赋值为整的偶数,其实就是一个if-else语句
* ---->通过方法来实现
* 一个专门给legs属性赋值的方法
*
*/
// a.legs = 4;//The field Animal.legs is not visible
a.setLegs(6);
//显示基本信息是什么
a.show();
}
}
class Animal{
String name;
private int age;
/*
* 一方面,提供一个方法,通过方法写限定条件,给属性赋值
* 另一方面,通过权限修饰符,应该把直接调属性的操作给禁掉
* ---->实现这个属性的封装
* 属性存在于类当中
* 只可以通过某些函数(接口)来调用它,
* 使得对外不能直接看到它
* 当造一个对象的时候,堆空间中会加载对象的属性,其中一定会有legs这个属性
* 只是与其他属性存在区别,它的权限很小,用户不能通过对象直接调用它
*/
//以下属于稍微完整的关于类的属性的封装性的体现
private int legs;//腿的个数
//给legs属性赋值的方法
public void setLegs(int l) {
if(l >= 0 && l % 2 == 0 ) {
legs = l;
}else {
//如果legs是一个负数,或者奇数的情况
//把legs设置成一个默认的数
legs = 0;
//或者是抛出异常也可以
}
}
//获取属性值的方法
public int getLegs() {
return legs;
}
public void eat() {
System.out.println("动物进食");
}
//输出属性信息
/*
*谁调用的show(),显示输出的属性就是谁的
*/
public void show() {
System.out.println("name = "+name+"',age = "+age+",legs = "+legs);
}
public void setAge(int a) {
if(a > 0 ) {
age = a;
}else {
System.out.println("输入的年龄有误!");
//如果输入的年龄有误,应该在提醒的同时,结束此次输入
System.exit(0);
}
}
public int getAge() {
return age;
}
}
第二个例子:
public class PersonTest {
public static void main(String[] args) {
Person b = new Person();
// b.age = 23;//编译不通过
b.setAge(23);
System.out.println("年龄为:"+b.getAge());
}
}
class Person{
private int age;
public void setAge(int a) {
if(a > 0 && a < 130) {
age = a;
}else {
//throw new RuntimeException("传入的数据非法!");
System.out.println("传入的数据非法!");
}
}
public int getAge() {
return age;
}
}
学习不止!
路漫漫其修远兮,吾将上下而求索。