走进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) 把对象的字节序列永久地保存到硬盘上,通常存 ...
随机推荐
- ssh 配合 tar 实现远程推送
tar命令和ssh配合使用 如何在空间不是很富裕的情况,把文件从一个分区tar到另外一个分区,其实还有很多办法的,使用管道命令就可以实现 如: #tar -cvf home |(cd /datavg3 ...
- new一張form時用using{}的好處。
以下代碼,用Using可避免一些問題,例如handel10000.如果PaymentForm裏面用dialogresult=''而不是close或X,(close或X會即時dispose回收,但dia ...
- ReadMe.md MarkDown file
MarkDown 文件写法类似写Confluence page. http://blog.csdn.net/kaitiren/article/details/38513715
- iOS10 - 访问系统通讯录新方法
所需框架 #import <ContactsUI/ContactsUI.h> 遵循代理 CNContactPickerDelegate 调用通讯录 如果在iOS10的机器上调用以前的ABP ...
- jQuery .attr("checked")得undefined 问题解决
出现此错误是因为JQuery版本升级的问题.所以此处应该使用.prop(); 那么,什么时候使用attr(),什么时候使用prop()?1.添加属性名称该属性就会生效应该使用prop();2.是有tr ...
- Leetcode: Sequence Reconstruction
Check whether the original sequence org can be uniquely reconstructed from the sequences in seqs. Th ...
- Pointcut is malformed: Pointcut is not well-formed: expecting 'identifier' at character position 0 ^
错误提示: 解决方法:指定execution 在执行目标方法之前指定execution 例如: import org.aspectj.lang.annotation.Aspect; import or ...
- c++实验,需要的人都知道是啥
利用点.线.面的基本知识,声明Point,Line,Friangle,PolyAngle四个类,完成以下功能.Point类功能://实验88888(1) 移动一个点:(2) 显示一个点:(3) 可计算 ...
- Android 自定义View (五)——实践
前言: 前面已经介绍了<Android 自定义 view(四)-- onMeasure 方法理解>,那么这次我们就来小实践下吧 任务: 公司现有两个任务需要我完成 (1)监测液化天然气液压 ...
- Java学习手记2——多线程
一.线程的概念 CPU执行程序,就好比一个人在干事情一样,同一个时间你只能做一件事情,但是这样的效率实在是太低了,在你用电脑的时候,听歌就不能浏览网页,看电影就不能下载视频,你想想是不是很蛋疼. 所以 ...