java零基础入门-面向对象篇(十一) 数据流动与包装类
面向对象学了这么多,满脑子都是对象,面向对象千好万好,可是就是不知道对象到底有什么用。
这节课来讲讲对象和数据流动,以及如何选取合适的方式处理数据。
讲解过程可能会涉及到web知识,没关系,先混个眼熟,只用理解对象那一块即可。
数据的流动
本人曾经炒过股票,那过程可是一个惊险万分,惊心动魄,惊为天人啊。一直都非常自信非常自我非常骄傲的我,认为自己完全就是天选之人,没赚到钱只是暂时的,总有一天我会抓住大黑马,然后走向人生巅峰。
直到有一天我突然看见了一张图。
心态
我看着这张图,发现这个世界上居然有人能把我的心态揣摩的这么详细,高,实在是高。当然,最后亏得差不多了,我就金盆洗手了。
为了玩股票,肯定少不了看股票网站或者app,我们看看对象如何 “带着” 数据一起动起来。
首先有一个网站,他为广大韭菜们提供各种各样的股票数据。数据的获取渠道有很多种,我们这里不详细说。只用知道每个网站都有“一个”数据库,用来存放数据。
网站数据采集
网站有了数据,并且存放在了数据库,然后就等着各种端,WEB端,移动端来获取数据。但是各种客户端是不能够直接与数据库进行交互的,他们需要一个中介,那就是服务器。
我们前面有介绍过服务器,这个中介很厉害,他一边可以接受来自客户端的请求,一边从数据库里面掏出数据,递给客户端,这就是服务器的作用。
中间这个就是服务器
其实精确的说,应该是服务器上的java代码帮我们完成了这个动作。客户端的请求发送到java代码,java代码去数据库查找客户端需要的数据,然后返回给客户端,这样就形成了数据的流动。
数据的流动
数据库和客户端我们现在不去了解,我们重点来看看这里的java做的工作,这里的java代码用对象将数据封装起来,从数据库“搬运”到了客户端。具体看个例子。
我们可以将数据库里面的数据,想象成excel表格中的一行数据,像这样。
一条数据
有没有一种熟悉的感觉?这不就是属性和赋值吗?你的感觉很对,我们在设计数据库的时候也会参考对象的设计理念,虽然设计数据库还有各种各样数据库自己的规则。
我们从数据库里面将这一条数据拿出来,直接将他放进一个对象里面。
从数据库到客户端
客户端也是可以直接获取对象的,在拿到服务器返回的数据以后,客户端就可以将数据展现在网页或者APP里面了。
客户端展示数据
这样就完成了数据从数据库 “流动” 到客户端的过程,java里的对象很好的体现了载体的作用,他将数据合理的聚合在一起,使我们很方便的操作数据。
包装类
讲完了数据的流动,我们再来讲一个概念,包装类。
包装类就是将基础类型转换为对象,让操作基础类型可以像操作对象一样简单。
java里面的数据操作一般都是通过基础类型完成。比如我们对数据进行加减,求和等等,但是基础数据也有局限性,比如一些非计算的操作。
有时候我们获取到的数据是字符串,而又需要将字符串String里面的内容当做数字进行计算,这时候我们就需要使用包装类来做转换。
八种基础类型对应八种包装类。Double,Float,Long,Integer,Short,Byte,Character,Boolean。
其中数值类型使用频率最高,数值类型中Integer,Long,Double使用频率最高。
这里通过使用频率最高的Integer来讲解包装类,其他的几个包装类大同小异。
Integer源码
查看源码的方法前面讲过了,这里展示了包装类的基本用法。
首先定义一个基础类型。然后使用这个基础类型创建一个Integer的对象,Integer包装类也是一个类,他有自己的方法,成员变量,当我们使用基础类型作为参数的时候,我们可以看到,这个包装类仅仅就是把这个基础类型当成了成员变量。
而基础类型的操作可以通过方法来实现,比如这里是将currentPrice对象转换成float类型,在源码里面,其实是将成员变量value进行了强制转换。
各位看清楚了没有,其实包装类就是将基础类型封装到一个类里面,基础类型是不具备扩展性的,而类是可以扩展的,我们可以为类添加各种各样的方法,这样我们就可以定制各种我们需要的功能。
数据转换
这个字符串转换的操作使用比较频繁,因为在开发过程中,不同的系统对数据的定义可能不一样,有很大的概率碰到这种字符串数据,所以需要进行类型转换以后再进行操作才能得到我们想要的结果。
自动装箱与拆箱
上面在定义包装类的时候是用 new 来创建对象,但是这个操作比较麻烦,好在jdk帮我们做了一些操作,看下面的例子。
自装箱与拆箱
首先看自动装箱,自动装箱就是直接将一个int类型的数值赋值给Integer类型对象,不需要使用 new关键字来创建。其实这个地方只是没有手动new对象而已,在我们看不见的地方,jdk帮我们完成了new对象这个动作。
我们查看源码可以看到,Integer有一个专门的缓存,用来存放-128到127之间的数据。当我们需要的值在这个范围内,程序会直接从缓存中获取值并返回给我们,然后赋值给变量currentPrice1。如果值不在这个范围内,比如我们这里是 218 ,它不在缓存范围,那么程序做的事其实和我们一样,使用 new 关键字创建了一个 Integer 类型对象赋值给 currentPrice1。这就是自动装箱的过程。
自动拆箱就更简单了,将一个Integer类型的对象直接赋值给一个int类型变量,就是自动拆箱。
通过源码我们看到,他是将一个Integer类型对象中的成员变量value,使用 intValue 方法拿出来,赋值给currentPriceInt1。
有了自动装箱与拆箱,在编写程序的过程中可以更加灵活方便的在基础类型与对象之间进行转换。