Java重新出发--Java学习笔记(三)--关于封装

面向对象的特点我们都熟知是封装,继承和多态。但是其实在今天之前的我也并没有对这些概念有深入了解。
如果问你什么是封装,可能有人会说是将变量私有化,然后对外提供接口。但是为什么要这么做呢,将类private不如public来的便捷,直接访问person.name多么容易,为何还要使用get方法和set方法呢。
我们可以先举一个不使用封装的例子:

public class Man{
    public String name;
    public Women wife;
    public double money;
    
    public void marry(Woman woman){
        this.wife = woman;
        woman.marry(this);
    }
}

public class Woman{
    public String name;
    public Man husband;
    
    public void maryy(Man man){
        this.husband = man;
    }
}

代码看起来很精简,写个测试方法试一下:

@Test
public void testPackage(){
    Man man = new Man();
    man.name = "jack";
    man.money = 1000000;
    
    Woman woman = new Woman();
    woman.name = "lucy";
    
    man.marry(woman);
    
    System.out.print(man.name+"and"+man.wife.name);
    System.out.print(man.name+"and"+man.money;
    //输出 jack and lucy
    //jack and 1000000  
}

看起来测试代码也完美,这时候来了一个小偷

public class Thief{
    private double stealMoney = 0;
    private List<Women> womens = new ArrayList<>();
    
    public void stealMoney(Man man){
        stealMoney += man.money/100;
        man.money = 990000;
        System.out.print("偷了钱");
    }
}

public void testPackage1(){
     Man man = new Man();
    man.name = "jack";
    man.money = 1000000;
    
    Woman woman = new Woman();
    woman.name = "lucy";
    
    man.marry(woman);
    
    Thief thief = new Thief();
    thief.stealMoney(man);

    System.out.print(man.name+"and"+man.money;
    //jack and 990000   
}

我们看到,man的钱被偷走了10000,那这个时候我们就要想办法解决这个问题了。
封装就是可以解决这个问题的一个好办法。

封装

//首先为man对象做封装
public class PackageMan{
    private String name;//私有化名字
    private PackageWoman wife;//必须私有
    private double money;//通通私有
    
    //先写一个构造函数,为了方便
    public PackageMan(String name,double money){
        this.name = name;
        this.money = money;
    }
    
    //结婚
    public void marry(PackageWoman woman){
        this.wife = woman;
        woman.marry(this);
    }
    
     //各种getter和setter
    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public PackageWoman getWife() {
        return wife;
    }

    public double getMoney() {
        return money;
    }
}

//PackageWoman
public class PackageWoman {
    private String name;
    private PackageMan husband;

    public void marry(PackageMan man){
        this.husband = man;
    }

    public PackageWoman(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public PackageMan getHusband() {
        return husband;
    }

    public void setName(String name) {
        this.name = name;
    }
}

看起来复杂了很多,但是真的有用吗?
赶紧加个thief测试一下,什么?小偷已经在路上拦截了?
原来是因为我们压根就没有对外提供setMoney的方法。
他可以获取你有多少钱,但是他却没法进行操作。
但是防止了小偷的操作,如果自己想操作呢,提供set方法又会让所有人都能改。。。
稍等,如果提供set方法,是真的所有人都能改,吗?
我们再来看看

public void setMoney(PackageMan man,double money){
    if(man == this){
        this.money = money;
    }else {
        System.out.println("喂,110吗?"+man.getName()+"抢钱!");
    }
}

这样呢?只有你自己可以修改,别人都不可以,测试一下:

public void testPackage1(){
    PackageMan man = new Man();
    PackageMan man1 = new Man();
    man.setMoney(man,2000000);
    man.setMoney(man1,2000000);

    System.out.print(man.name+"and"+man.money;
    //jack and 990000   
}

但是你老婆不满意了,凭什么只有你自己能改?我也想改!
这种要求,还是应该满足一下的,怎么做呢?

public void setMoney(Object o,double money) {
    if (o == this || o == this.wife) {
        this.money = money;
    } else {
        System.out.println("喂,110吗?有人抢钱!");
    }
}

我相信看到这里你一定和我有一样的疑惑,传进来的是Object我要怎么得知来骚扰我金钱的人是谁呢?
这里可以再写点代码判断一下传进来的数据类型,强转类型后再调用相应的方法。(还有其他方法后面说)
除此之外还有个更大的疑惑,加了set方法以后小偷还是可以偷你的钱啊,小偷可以通过你自己这个对象调用方法来改变你自己不就行了。
那么怎样才能让小偷即使得到”你自己这个对象“还无论如何都不能改变你的属性值呢。
这个以后再详细讲吧。

总结

封装不仅仅是private + getter和setter,使用封装可以对setter做更深层次的定制。
可以规定执行setter方法的对象,也可以对数据做要求,还可以做类型转换等等一系列事情。
使用封装不仅安全,而且可以简化操作。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容