java类的特性(一)
2015-08-12 00:23
363 查看
在前端学习的过程中,插入对java的学习,算是调剂吧。光看书没有编码的学习果然还是很磨人的。直接进入正题:
1、java域封装的注意事项
在java核心技术书中,不止一次的强调了类的数据域要设置为私有的,也就是保证了封装性,避免其他代码 对类数据域的直接更改。我理解这样做最大的好处就是当内部的数据域发生改变时,所有其他类中调用该数据域的代码都不需要同步改动,只需要修改处理该数据域的方法即可,便于代码管理和更新。
在需要获得或设置数据域值的位置,应该提供下面三项内容:
一个私有的数据域
一个公有的域访问器方法(获取值)
一个公有的域更改器方法(设置值)
注意,出于封装性考虑,当类中的方法需要返回类中的对象数据域并且该数据域是可以被更改的,应该避免直接返回对象数据域的引用。原因在书中解释的比较清楚了。简单插图如下:
d 和harry.hireDay引用的是同一个对象,直接操作d就可以更改harry中的元素
2、java参数的传递
与C++不同,java中没有指针的概念,传递的参数要么是基本的数据类型,要么是对象或数组等复杂数据。对于java参数到底是传值还是传地址这个问题,一直都有争论。其实,对于java语言来说,传值和传地址只是从效果上进行的区分,本质上传递的都是“值”。对于基本数据类型比较好理解,方法中对传入的数值无论怎么修改,都不会影响实参的结果。但为什么传递对象和数组时,当方法修改了对象和数组的值时,同时也能改变实参的结果?这样不就是传地址吗?这里的问题就在传递参数时,对象和数组类的参数代表的是该参数的首地址,也就是说该参数本质上是地址;在传递时,实际上是在方法中创建该地址的拷贝;当方法通过地址的拷贝去修改它所指向的对象或数组的值时,由于该拷贝和参数指向的是同一块内存的数据,所以可以起到修改对象或数组值的作用。那么当我们只是修改这个地址值,也就是让这个拷贝的地址指向另外的地址时,实参地址是不会跟着变化的。这就是为java核心技术中提到的,不能在方法中交换对象参数,因为传递的是地址这个“值”,交换的是该值的拷贝,外面的实参是没有变化的。
其实在C++中也可以这么理解,即便参数传递的是指针,如果只是在方法中交换地址,而不是交换通过参数地址访问的实际值,那么外部的实参也不会被交换。这样说来C++的参数传递也可以理解为都是传值。
总结起来,传值还是传地址只是从方法对参数的使用上来区分:如果是对参数本身操作,那就是传值;如果是通过参数来对其指向的内存进行操作,那就是传地址。。。(图片明天再加)
1、java域封装的注意事项
在java核心技术书中,不止一次的强调了类的数据域要设置为私有的,也就是保证了封装性,避免其他代码 对类数据域的直接更改。我理解这样做最大的好处就是当内部的数据域发生改变时,所有其他类中调用该数据域的代码都不需要同步改动,只需要修改处理该数据域的方法即可,便于代码管理和更新。
在需要获得或设置数据域值的位置,应该提供下面三项内容:
一个私有的数据域
一个公有的域访问器方法(获取值)
一个公有的域更改器方法(设置值)
注意,出于封装性考虑,当类中的方法需要返回类中的对象数据域并且该数据域是可以被更改的,应该避免直接返回对象数据域的引用。原因在书中解释的比较清楚了。简单插图如下:
</pre><pre name="code" class="java"> class Employee { Date hireDay; public Date getHireDay() { return hireDay; } }
d 和harry.hireDay引用的是同一个对象,直接操作d就可以更改harry中的元素
2、java参数的传递
与C++不同,java中没有指针的概念,传递的参数要么是基本的数据类型,要么是对象或数组等复杂数据。对于java参数到底是传值还是传地址这个问题,一直都有争论。其实,对于java语言来说,传值和传地址只是从效果上进行的区分,本质上传递的都是“值”。对于基本数据类型比较好理解,方法中对传入的数值无论怎么修改,都不会影响实参的结果。但为什么传递对象和数组时,当方法修改了对象和数组的值时,同时也能改变实参的结果?这样不就是传地址吗?这里的问题就在传递参数时,对象和数组类的参数代表的是该参数的首地址,也就是说该参数本质上是地址;在传递时,实际上是在方法中创建该地址的拷贝;当方法通过地址的拷贝去修改它所指向的对象或数组的值时,由于该拷贝和参数指向的是同一块内存的数据,所以可以起到修改对象或数组值的作用。那么当我们只是修改这个地址值,也就是让这个拷贝的地址指向另外的地址时,实参地址是不会跟着变化的。这就是为java核心技术中提到的,不能在方法中交换对象参数,因为传递的是地址这个“值”,交换的是该值的拷贝,外面的实参是没有变化的。
其实在C++中也可以这么理解,即便参数传递的是指针,如果只是在方法中交换地址,而不是交换通过参数地址访问的实际值,那么外部的实参也不会被交换。这样说来C++的参数传递也可以理解为都是传值。
总结起来,传值还是传地址只是从方法对参数的使用上来区分:如果是对参数本身操作,那就是传值;如果是通过参数来对其指向的内存进行操作,那就是传地址。。。(图片明天再加)
相关文章推荐
- SpringMVC+KindEditor在线编辑器之文件上传
- JAVA实现字符串表达式求值
- 泛型使用一例子
- Java自带排序方法
- 嘚吧嘚java的发展历史
- java url 下载
- java调用身份证接口查询
- struts1_DispatchAction 可以同时处理多个请求的Action
- struts1——指定多个配置文件(struts-config.xml)
- struts1——动态formbean
- struts1——Validator框架的校验过程
- eclipseRCP深入浅出(学习总结)2015.08.11
- Java垃圾回收机制 入门
- Java集合框架 入门
- Java异常处理机制
- MyEclipse设置Java代码注释模板
- JAVA 汉字ASCII范围
- springmvc 上传文件 type=file name=imagepath request转换出
- 解决一个少见的错误java.lang.NoClassDefFoundError
- eclipseRCP深入浅出(学习总结)2015.08.08