走进java对象的门口
从题目中可以看出来,今天只是java面向对象的入门级探讨。看看今天的内容。
为什仫说英语呢?我的英语从三年级都不好,一直到现在,但我们的未来职业要求我们必须懂英语,就算不能像马云一样溜吧,但最起码能看懂英语版的专业书籍。其实,专业上的英语挺简单的,如果你能静下心看看那些书,你会发现,书上的语法很简单,词汇还都是高中的,只有极个别的专业词汇有点难,记住就好啦,反正不多,所以,这里说几个英语名词。
面向对象三大特性:encapsulation:封装 inheritance:继承 polymorphism:多态
还有两个词用的比较多:arguments 和 parameters : 实参 和 形参。
编程语言的函数或方法都只能放回一个值(我只学过的几个,语言之多,不知有没有特例),有时想返回多个值,可以数组(当我刚学c语言的时候,我都不知道这样做),python好像能返回多个,直观上如此,但其实python返回的是一个元组,把你的多个返回值构成一个元组返回的。
一、封装
刚学面向对象时,对封装思想不甚了解,特别是从面向过程转过来的人。为什么要对属性进行封装呢?外部直接调用不是很方便吗?
其一原因:通过封装,外部只能通过你的getter() ,setter()来间接访问你的属性,那你不是可以在gette and setter 中做些什么了吗。比如:你写了个Person类,其中一个属性是年龄age,age的范围肯定是 age>= 0的(不知有没有长生的人),如果你不封装,外部可以把 -100 赋值给 age,显然这是不合理的,但通过setter来赋值时,你可以对传进的值进行判断如果小于 0,就抛个异常给调用者。是不是很好,通过封装你可以对传进的值进行一些判定或其他的操作啦。
你可能要反驳说啦,我见过一些setter or getter,就是最简单的赋值啊,没啥功能啊。下面就是另一个重要的使用封装的原因啦。
其二:The point to setters (and getters, too) is that you can change your mind later,without breaking anybody else’s code! 你写了个一款游戏,刚开始时你对游戏充钱的范围设置应该很低,假设充钱的下限是 一毛(哈哈),等过了一段时间,你的游戏大火,为了make more money,你要提高充钱的下限啦(反正总会有人充的,毕竟玩家多嘛),设为price >= 100。你想想,如果开发时你的公司员工都是把属性设置为public,如果想进行更改,你就的在原来需要给price赋值的地方做个if(money >= 100){//ok } else{//buy failure}判断,或者写setter(getter也一样),进行对传进的值判断,然后,在原来使用price的地方调用setter().看见了没有不用封装,以后想改都很麻烦,所以还是使用封装吧,别看现在可能没啥用,以后你有别的想法想改时,就很方便啦。记住这句话:you can change your mind later,without breaking anybody else’s code!
插一段关于对象属性和局部变量初始值的问题:
二、“==”与equals方法的区别:
“==”比较的是两个变量在内存中的 bits 是否相等不关心你的类型是否相等,比如 int a = 1, b = 1; a == b //true byte c = 1; a == c //also true,因为a,c在内存中的bits都是0000 0000 0000 0001。对于对象引用变量来书,他们比较是是否指向相同的对象,其实还是一样的,指向相同的对象,他们的bits就是相同的。所以,“==”,主要还是比较两个变量是否指向相同的对象(基本变量没啥好说的)。
有时,你不关心两个变量是否指向同一个对象,你只是关心两个变量指向的对象的内容是否完全一样。上代码,具体看看:
你猜结果是true or false:
想想为什么.
再看一个对比的:
再猜猜结果:
奇妙的事情发生啦,str1 和 str2的值都是“hello",为什么他两相比的结果是false。因为,str1,str2指向的对象不同,虽然对象中的内容是相同的,但"=="只关心变量的二进制数是否相同,因为指向不同的对象,所以,他们之间的bits不可能相同。
那我想看两个字符串是否相同咋办?那就要用equals方法啦。
把判断语句稍微一改:
结果就是想要的啦:
记住这两句话:
Use == to compare two primitives, or to see if two references refer to the same object.
Use the equals() method to see if two different objects are equal.
留个问题,自己写个类,用“==” 和 equals()方法来比较一下,结果可能会出乎你的意料。具体如何,且看不知多少下回的分析。
When everything seems to be going against you, remember that the airplane takes off against the wind, not with it.
只有通过逆境,你才能变得强大。(我都被自己给翻译服啦,呵呵)
走进java对象的门口的更多相关文章
- Java对象序列化剖析
对象序列化的目的 1)希望将Java对象持久化在文件中 2)将Java对象用于网络传输 实现方式 如果希望一个类的对象可以被序列化/反序列化,那该类必须实现java.io.Serializable接口 ...
- 通过JAXB完成Java对象与XML之间的转换
Java对象转换XML的过程叫marshal. XML转换到Java对象的过程叫unmarshal. 一.Java对象转化为XML 这里省略getter和setter方法 通过标注@XMLRootEl ...
- json相关类库,java对象与json相互转换
有效选择七个关于Java的JSON开源类库 转自:http://www.open-open.com/lib/view/open1397870197828.html 翻译: (英语原文:http://w ...
- Hibernate 系列 07 - Hibernate中Java对象的三种状态
引导目录: Hibernate 系列教程 目录 1. Java对象的三种状态 当应用通过调用Hibernate API与框架发生交互时,需要从持久化的角度关注应用对象的生命周期. 持久化声明周期是Hi ...
- 理解Java对象序列化
http://www.blogjava.net/jiangshachina/archive/2012/02/13/369898.html 1. 什么是Java对象序列化 Java平台允许我们在内存中创 ...
- java对象与XML相互转化
起因 最近在公司做了一次webservice相关的任务,其中我最敢兴趣的就是webservice接受到XML对应的流以后是如何方便的转化成java对象,而java对象又是如何生成对应的XML的. 目的 ...
- java 对象序列化与反序列化
Java序列化与反序列化是什么? 为什么需要序列化与反序列化? 如何实现Java序列化与反序列化? 本文围绕这些问题进行了探讨. 1.Java序列化与反序列化 Java序列化是指把Java对象转换为 ...
- Java对象大小计算
这篇说说如何计算Java对象大小的方法.之前在聊聊高并发(四)Java对象的表示模型和运行时内存表示 这篇中已经说了Java对象的内存表示模型是Oop-Klass模型. 普通对象的结构如下,按64位机 ...
- Java基础学习总结——Java对象的序列化和反序列化
一.序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化. 把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬盘上,通常存 ...
随机推荐
- myeclipse,eclipse控制台输出乱码问题
首先我描述一下问题,我在做udp socket编程(一个聊天的程序)的时候,从控制台中读取中文,然后再向控制台中打印,出现中文乱码的情况. 1.出现乱码最根本的原因就是编码和解码不一致的情况.问题分析 ...
- BI实施过程中的工具与服务
成功的BI项目,不仅仅是应用了BI工具软件,还要具备完善的BI服务体系,才能称之为真正成功的商业智能bi项目. 现在的BI(商业智能)比起几年前的ERP一样,成为CIO们关注的焦点.在ERP等基础信息 ...
- GCD的简单用法
/* 创建一个队列用来执行任务,TA属于系统预定义的并行队列即全局队列,目前系统预定义了四个不同运行优先级的全局队列,我们可以通过dispatch_get_global_queue来获取它们 四种优先 ...
- Glacierskating测试记录
这个游戏本身已经很成熟了,要提什么建议的话也是吹毛求疵.... 不过个人来讲不是很喜欢这个游戏,喜欢程度排倒数第二吧....感觉游戏就是一个套路,掌握了套路就不好玩了.....优点是随时随地可以玩一把 ...
- fzuoj Problem 2129 子序列个数
http://acm.fzu.edu.cn/problem.php?pid=2129 Problem 2129 子序列个数 Accept: 162 Submit: 491Time Limit: ...
- LinQ 简单使用
LinQ: 1.LinQ to Sql类(NET Language Integrated Query (LINQ) ) LINQ定义了大约40个查询操作符,如select.from.in.where以 ...
- webstorm修改文件,webpack-dev-server不会自动编译刷新
重装了 webstorm ,从10升级到了2016 一升不要紧,打开老项目,开启webpakc-dev-server,然后改代码,发现浏览器不会自动刷新了!!! 这可急死我了,各种卸载webpack. ...
- 常用的yum命令
linux各发行版有多种包管理机制,下面介绍基于RedHat系的yum包管理命令: yum -y install xxx 无需询问,安装xxx包 yum list ...
- tslib1.4编译
准备工作:ubuntu14.04-64位+arm-linux-gcc(2014)+tslib.14 1.arm-linux-gcc下载地址:http://www.veryarm.com/arm-non ...
- 数据绑定控件之Repeater
引言 前几篇的文章在说AJAX的内容,利用AJAX技术能够开发出高效运行的网站应用程序,不过在进行B/S项目开发时只拥有AJAX技术是远远不够的,踏入到B/S要学的东西会更多,但相较C/S的复杂逻辑结 ...