*** 封装 ***

面向对象特征 - 封装

封装的基本原则
  • 将你的实例变量标记为私有的,比如提供公有的get与set方法来控制存取动作
  • 有些get和set 可能什么事情也没做, 只是把值设给变量而已。 这样不会增加执行的负担吗?这样的好处是当你以后改变想法却不需要更改其他的部分代码

封装的实现:
    1. 修改实例变量的可见属性来限制对变量的访问
    2. 为每个属性创建一对setter和getter方法用于对变量的访问
    3. 在setter和getter方法中加入对属性的存取限制

封装 encapsulation 有时称为数据隐藏。 实现封装的关键在绝对不能让类中方法直接访问其他类的成员变量。 成员仅通过对象的方法与对象的数据进行交互。 封装给与对象了“黑盒”特征, 这是提高重用性和可靠性的关键。 这意味一个类可以全面的改变存储数据的方式, 只要使用同样的方法操作数据。

private 修饰的成员变量如果只在内部使用, 还需要getter, setter方法吗? 
 
public class Person {
    private int id;
    private String name;
    protected String money;
     
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getMoney() {
        return money;
    }
    public void setMoney(String money) {
        this.money = money;
    }
}
 
比如你有一个属性String name;你在很多时候都直接调用,比如:person.name
然后呢,因为某些需求,如果name=null,你需要让name=“未定义”。
然后呢?难道把这个变量引用过的地方全部修改一遍吗?万一有个地方因为粗心改错了呢?再万一name不是未定义,而改成“暂未定”呢,再全部改一遍吗?
 
但是如果有个get方法就不一样了,你可以在get方法里面写:
 
public String getName(){
    if(name==nullreturn "未定义";
    return name;
} 
 
同样,set方法也是一样,比如age属性,age假如被设置成负数怎么办呢,总不能所有用到age的地方都判断一次正负吧?(注意:我这儿用到的是设置,包括用户输入,数据库读入,数据迁移所得,数据流读取所得)
public void setAge(int age){
    if(age<0) age=0;
    this.age=age;
} 
 
所以说,封装以及其他设计思想都是因为变化而出现的,需求的变化,数据的变化等等。而为了更好的应对这些变化,封装是一个很好的手段,请遵守getset这个约定,当你真正需要它的时候,你才会发现它是多么的好用。
封装的核心思想是信息(数据)的控制。封装包括两个方面:隐藏和公开。至于哪些是隐藏哪些是公开,那就是需求所决定的。
这java的编程规范,对象不对外暴露自己的属性,外面只能通过该对象提供的接口访问或者修改对象属性,同时也把对象的访问和修改分开来。。。
 
说实话.在超过50%的场合get和set是没有实际意义的(封装什么的只是理念而已,谈不上实际意义), 比如最开始的setter,getter 没有做任何的判断, 只是简单的赋值 是和public变量没什么区别。 你把所有变量都设为public,然后发布了你的代码。一段时间后,随着需求的改变, 你需要对你的变量设置做一些控制了,这时候再去更改就十分的麻烦,需要把这个变量引用过的地方全部修改一遍,万一有个地方因为粗心改错了呢? 然后你还要通知使用你代码的人, “同志们,请用set()和get()来访问我的变量”,估计你会被海扁的。 所以为了程序的扩展, 也为了符合java规范, 那怕现在看起来没多大意义, 也这样写吧。 
 
当然也不一定都要用到get,set方法了,你可以只取其中之一或者都不要也可以,但是不建议直接用public 变量来访问,不够安全,而且也最好养成好的习惯
就像那些编码规范一样,你不遵守你的代码还是一样能用 当你做大系统的时候就明白了。
 
所以回答最初的问题, 如果你100% 确定你只在自己类内部使用, 不会提供给外部, 可以声明称private  不需要getter setter 。 但是谁能确定以后会发生什么呢? 如果你需做一些限制, 那就需要手动改所有的地方, 即使只在一个类中。

 

private 权限修饰符

    private 可以修饰成员变量和成员方法
    private 修饰的成员只能在自己类的内部被直接访问, 外部包括子类是不能直接访问的。

Java Basic - Encapsulation的更多相关文章

  1. Java Basic&Security Tools

    JDK Tools and Utilities Basic Tools These tools are the foundation of the JDK. They are the tools yo ...

  2. Java Basic - Annotation

    使用注解最主要的部分在于对注解的处理,那么就会涉及到注解处理器.      从原理上讲,注解处理器就是通过反射机制获取被检查方法上的注解信息,然后根据注解元素的值进行特定的处理.   注解处理器类库( ...

  3. Java Basic - Generics

    什么是类型擦除? 类型擦除指的是通过类型参数合并,将泛型类型实例关联到同一份字节码上.编译器只为泛型类型生成一份字节码,并将其实例关联到这份字节码上.类型擦除的关键在于从泛型类型中清除类型参数的相关信 ...

  4. java basic

    //java 声明常量 //final 数据类型 常量名=值; //as: final float PI=3.14f;/ PI=3.14002F //默认浮点为 double //break:跳出多重 ...

  5. [Android] Java Basic : preview

    基础教学:lecture, video, lecturer: Matt Stoker Java教学:http://www.runoob.com/java/java-intro.html[菜鸟教程,非常 ...

  6. Java Basic Notes——static修饰符

    1.static 在程序中任何变量或者代码都是在编译时由系统自动分配内存来存储的,而所谓静态就是指在编译后所分配的内存会一直存在,直到程序退出内存才会释放这个空间,也就是只要程序在运行,那么这块内存就 ...

  7. Java Basic Exception

    异常处理经验小结之一:不要直接抛出InvocationTargetException  (转http://olylakers.iteye.com/blog/1137371) 在最近一段时间的工作中,积 ...

  8. [Basic] The most basic things about java

    [Basic] The most basic things about java // */ // ]]>   [Basic] The most basic things about java ...

  9. java url demo

    // File Name : URLDemo.java import java.net.*; import java.io.*; public class URLDemo { public stati ...

随机推荐

  1. 解决eclipse报PermGen space内存溢出异常的问题

    异常问题如下所示: 1.点击Eclipse->Window->Preferences,如下所示: 2.点击Server->Runtime Environments,选择Apache ...

  2. 盐水的故事[HDU1408]

    盐水的故事Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submissio ...

  3. Javascript中大括号“{}”的多义性

    摘要:本文主要介绍JavaScript中大括号有四种语义作用. JS中大括号有四种语义作用 语义1,组织复合语句,这是最常见的 if( condition ) { //... }else { //.. ...

  4. CSS抗锯齿 font-smoothing 属性介绍

    CSS3里面加入了一个“-webkit-font-smoothing”属性. 这个属性可以使页面上的字体抗锯齿,使用后字体看起来会更清晰舒服. 加上之后就顿时感觉页面小清晰了. 淘宝也在用哦! 它有三 ...

  5. BNUOJ48605International Collegiate Routing Contest 题解

    题目大意: 给你一些子网,求它们在整个网段的补集. 思路: 将子网转换成二进制建一棵Trie,直接DFS搜到没有了就记下来输出.注意:所给的子网会有交集,若搜到结尾就不向下搜了. 代码: #inclu ...

  6. Jquery实现下拉联动表单

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. TC SRM 593 DIV1 250

    我只能说的亏没做,要不就挂0了.. 本来想四色定理,肯定4就可以的...然后准备爆,发现3的时候不好爆,又想了老一会,嗯,数据范围不小,应该不是暴力,直接找规律,貌似最大就是3,有一个3连块,输出3, ...

  8. 热烈庆祝华清远见成功自主研发Farsight TV 智能机顶盒

    近日,华清远见研发中心再传喜讯:Farsight TV 智能机顶盒研发成功并投入教学!这是华清远见研发中心继开源平板电脑.智能医疗终端.智能家居终端后独立成功研发的又一智能硬件!至此,开创了华清远见自 ...

  9. C#中如何在字符串中设置上标

    一.HTML中:如字符串"21st" 想要把st 设置为上标,在html标签中是21<sup>st</sup> 二.C#编辑器中你可以使用 unicode ...

  10. 20145330孙文馨 《Java程序设计》第一周学习总结

    20145330孙文馨 <Java程序设计>第一周学习总结 教材学习内容总结 刚开始拿到这么厚一本书说没有压力是不可能的,开始从头看觉得很陌生进入不了状态,就稍微会有一点焦虑的感觉.于是就 ...