面向对象三大特征之简介封装
举个例子
- 引入
package com.u1.day0130;
/**
* 封装的演示。
*
* @author Feng 2018年1月30日下午2:37:59
*/
public class Demo02 {
/**
* 用人的属性作为成员变量。
*/
public String name;// 名字
public int age;// 年龄
public String sex;// 性别
public Demo02() {// 无参构造方法
judg();
}
public Demo02(String name, int age, String sex) {// 有参构造方法
this.name = name;
this.age = age;
this.sex = sex;
judg();
}
void demo03() {
/**
* 在这里对类Demo02的成员变量赋值
*/
// 很显然名字的字数太多了,不符合常理。
name = "日出东方唯我不败东方不败";
// 很显然age 也不符合常规。
age = 10000;
age = -10000;
// 性别居然可以是“不知道”。
sex = "不知道";
/**
* 那么问题来了,这种非法的年龄,性别,名字 是没有任何限定的。 那怎么去避免呢?一般我们都可以加上判断语句。
*/
// 加上判断
if (age < 0 || age > 100) {// 在正常的范围内。
// 可以看出,这样确实可以达到效果,但是代码的冗余太大,每次赋值都要判断一次。
age = 25;
}
/**
* 那么还有其他的方法吗? 说到方法,我们可以在Demo02中加上一个专门的方法。
* 如果不在构造方法中添加的话,还是会出错。
*/
}
public static void main(String[] args) {
Demo02 d2 = new Demo02("ixnxi",-12,"男");
System.out.println(d2.age);//得到的是负值的年龄。
/**
* 这时,需要把方法加到构造方法中去调用。
* 如此,还是很麻烦,有没有什么方式能从根本上解决这个问题呢?
* 有人说,不就是把成员变量改了吗,你不让他改就行了,主要就是限制他呀。
* 然后就有了属性的私有化,不让其他人去碰。只能自己去动它。
* 但是这样也不好,这样虽然可以杜绝那种胡乱改变量的现象,但是,这是根本就改不了了好吗!
* 所以就出现了,给私有成员变量赋值的专门的方法,和取出的专门的方法,就是set和get方法。
* 所以就有了现在的私有属性,公共方法。
*/
}
public void judg() {//需要判断的时候,就可以直接调用这个方法。
if(age < 0|| age >100) {
age = 25;
}
}
}
- 稍微深入一下
package com.u1.day0130;
import com.sun.org.apache.xerces.internal.util.SynchronizedSymbolTable;
/**
* 一个钱包!
* @author Feng
* 2018年1月30日下午3:10:00
*/
public class MoneyPackage {
/**
* 分析:
* 钱包的话,能想到什么?
* 这里只看俩属性。
* 钱包肯定是有主人的,所以有个能看到的能接触到的user
* 钱包肯定要装钱,装多少,其他人不能知道,所以只对钱数进行封装。
*/
private int money;//对钱数进行封装
String user;//钱包的主人,不封装。
//主人对外,提供了借钱的方法,还钱的方法
public int getMoney() {//借到钱
//这个题只对set方法进行控制,不对get控制,若读者有意愿,可以自己加上。
return money;
}
public void setMoney(int money) {//去借钱
if(money >=0 && money <=1000) {//加上限定。除了可以对set方法控制,还能对get方法控制
this.money = money;
}else {
System.out.println("没那么多钱啦~");
}
}
}
- 再创建一个宾客类,去向主人借钱
package com.u1.day0130;
/**
* 宾客类,可以向钱包的主人借钱,并还钱。
* @author Feng
* 2018年1月30日下午3:14:50
*/
public class Guest {
public static void main(String[] args) {
MoneyPackage mp = new MoneyPackage();//声明并实例化。
mp.setMoney(10);//去借10快钱。必须通过mp这个钱包的对象。不能直接得到。
mp.setMoney(10000);//去借10000,应该是不够的。
System.out.println(mp.getMoney());//借到了10块钱。若10000的话,会不同。
}
}
这些就是我对封装的一些理解心得啦~
小提示:我人太懒了,一些解释性的东西直接写到注释里了。