java提升篇(一)-----理解java的三大特性之封装

      从大二接触java开始,到如今也差很少三个年头了。从最基础的HTML、CSS到最后的SSH本身都是一步一个脚印走出来的,其中开心过、失落过、寂寞过。虽然是半道出家可是通过本身的努力也算是完成了“学业”。期间参加过培训机构,可是极其不喜欢那种培训方式,因而毅然的放弃了选择自学(可怜我出了6000块钱啊),虽然自学途中苦不少,可是乐更多,当中的付出和收获只有本身知道。黄天不负有心人,鄙人愚钝,在大四第一学期终于自学完成java(其中走了弯路,荒废半年),而且凭借它获得了一份不错的工做,不胜感激!javascript

      闲话过多!进入正题,LZ最近刚刚看完设计模式,感触良多。并且在工做过程当中深感java基础不够扎实,例如IO不熟、垃圾回收不知所云、多态七窍通五窍、反射不知、甚至连最基本的三大特性都搞得我迷糊了!因此我发狠心必定要好好弥补java基础!从第一课开始---封装!!!!!!java

三大特性之---封装

      封装从字面上来理解就是包装的意思,专业点就是信息隐藏,是指利用抽象数据类型将数据和基于数据的操做封装在一块儿,使其构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,尽量地隐藏内部的细节,只保留一些对外接口使之与外部发生联系。系统的其余对象只能经过包裹在数据外面的已经受权的操做来与这个封装的对象进行交流和交互。也就是说用户是无需知道对象内部的细节(固然也无从知道),但能够经过该对象对外的提供的接口来访问该对象。程序员

      对于封装而言,一个对象它所封装的是本身的属性和方法,因此它是不须要依赖其余对象就能够完成本身的操做。数据库

      使用封装有三大好处:设计模式

         一、良好的封装可以减小耦合。this

         二、类内部的结构能够自由修改。spa

         三、能够对成员进行更精确的控制。设计

         四、隐藏信息,实现细节。code

      首先咱们先来看两个类:Husband.java、Wife.java对象

public class Husband {
    
    /*
     * 对属性的封装
     * 一我的的姓名、性别、年龄、妻子都是这我的的私有属性
     */
    private String name ;
    private String sex ;
    private int age ;
    private Wife wife;
    
    /*
     * setter()、getter()是该对象对外开发的接口
     */
    public String getName() {
        return name;
    }

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

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void setWife(Wife wife) {
        this.wife = wife;
    }
}
public class Wife {
    private String name;
    private int age;
    private String sex;
    private Husband husband;

    public String getName() {
        return name;
    }

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

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void setHusband(Husband husband) {
        this.husband = husband;
    }

    public Husband getHusband() {
        return husband;
    }
    
}

       从上面两个实例咱们能够看出Husband里面wife引用是没有getter()的,同时wife的age也是没有getter()方法的。至于理由我想各位都懂的,男人嘛深屋藏娇妻嘛,没有那个女人愿意别人知道她的年龄。

      因此封装把一个对象的属性私有化,同时提供一些能够被外界访问的属性的方法,若是不想被外界方法,咱们大可没必要提供方法给外界访问。可是若是一个类没有提供给外界访问的方法,那么这个类也没有什么意义了。好比咱们将一个房子看作是一个对象,里面的漂亮的装饰,如沙发、电视剧、空调、茶桌等等都是该房子的私有属性,可是若是咱们没有那些墙遮挡,是否是别人就会尽收眼底呢?没有一点儿隐私!就是存在那个遮挡的墙,咱们既可以有本身的隐私并且咱们能够随意的更改里面的摆设而不会影响到其余的。可是若是没有门窗,一个包裹的严严实实的黑盒子,又有什么存在的意义呢?因此经过门窗别人也可以看到里面的风景。因此说门窗就是房子对象留给外界访问的接口。

      经过这个咱们还不能真正体会封装的好处。如今咱们从程序的角度来分析封装带来的好处。若是咱们不使用封装,那么该对象就没有setter()和getter(),那么Husband类应该这样写:

public class Husband {
    public String name ;
    public String sex ;
    public int age ;
    public Wife wife;
}

     咱们应该这样来使用它:

Husband husband = new Husband();
        husband.age = 30;
        husband.name = "张三";
        husband.sex = "男";    //貌似有点儿多余

      可是那天若是咱们须要修改Husband,例如将age修改成String类型的呢?你只有一处使用了这个类还好,若是你有几十个甚至上百个这样地方,你是否是要改到崩溃。若是使用了封装,咱们彻底能够不须要作任何修改,只须要稍微改变下Husband类的setAge()方法便可。

public class Husband {
    
    /*
     * 对属性的封装
     * 一我的的姓名、性别、年龄、妻子都是这我的的私有属性
     */
    private String name ;
    private String sex ;
    private String age ;    /* 改为 String类型的*/
    private Wife wife;
    
    public String getAge() {
        return age;
    }
    
    public void setAge(int age) {
        //转换便可
        this.age = String.valueOf(age);
    }
    
    /** 省略其余属性的setter、getter **/
    
}

      其余的地方依然那样引用(husband.setAge(22))保持不变。

      到了这里咱们确实能够看出,封装确实可使咱们容易地修改类的内部实现,而无需修改使用了该类的客户代码

      咱们在看这个好处:能够对成员变量进行更精确的控制。

      仍是那个Husband,通常来讲咱们在引用这个对象的时候是不容易出错的,可是有时你迷糊了,写成了这样:

Husband husband = new Husband();
        husband.age = 300;

      也许你是由于粗心写成了,你发现了还好,若是没有发现那就麻烦大了,逼近谁见过300岁的老妖怪啊!

      可是使用封装咱们就能够避免这个问题,咱们对age的访问入口作一些控制(setter)如:

public class Husband {
    
    /*
     * 对属性的封装
     * 一我的的姓名、性别、年龄、妻子都是这我的的私有属性
     */
    private String name ;
    private String sex ;
    private int age ;    /* 改为 String类型的*/
    private Wife wife;

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        if(age > 120){
            System.out.println("ERROR:error age input....");    //提示錯誤信息
        }else{
            this.age = age;
        }
        
    }
    
    /** 省略其余属性的setter、getter **/
    
}

      上面都是对setter方法的控制,其实经过使用封装咱们也可以对对象的出口作出很好的控制。例如性别咱们在数据库中通常都是已一、0方式来存储的,可是在前台咱们又不能展现一、0,这里咱们只须要在getter()方法里面作一些转换便可。

public String getSexName() {
        if("0".equals(sex)){
            sexName = "女";
        }
        else if("1".equals(sex)){
            sexName = "男";
        }
        else{
            sexName = "人妖???";
        }
        return sexName;
    }

      在使用的时候咱们只须要使用sexName便可实现正确的性别显示。同理也能够用于针对不一样的状态作出不一样的操做。

public String getCzHTML(){
        if("1".equals(zt)){
            czHTML = "<a href='javascript:void(0)' onclick='qy("+id+")'>启用</a>";
        }
        else{
            czHTML = "<a href='javascript:void(0)' onclick='jy("+id+")'>禁用</a>";
        }
        return czHTML;
    }

      鄙人才疏学浅,只能领悟这么多了,若是文中有错误之处,望指正,鄙人不胜感激!

吐槽

      宅了三天今天就出去走走,在公交车上遇到一极品美女!我坐着,一美女上车,站在我旁边,开始还好,过了一下子她就对我笑,笑笑还好,可是你也不能总对着人家笑吧!笑的我都很差意了(鄙人脸皮薄,容易害羞??)。难道是我没有洗脸?照照镜子蛮干净的啊!难道是我衣服又或者裤子没**,看来衣服裤子蛮好的!难道是我帅,对我有意思?(程序员屌丝一枚,貌似没可能)!实在受不了了,哥想惹不起我还躲不起么?哥下车!我一下车,那枚美女就飞速的占我座位!哥当时就憋出一个字:靠!!!!!!!!

相关文章
相关标签/搜索