《Head First Java》的思考总结:第三篇
前言:
今天要分享的是关于 《Head First Java》
这本书的读后感,这本书有点小厚差不多有七百页左右,所以我花了几乎整个国庆的时间去阅读,学习。读完之后发现,受益颇多。正如书名所说的,它是一本重视大脑的学习指南。无论你是Java
开发工程师,还是android
开发工程师,这本书都是良师益友。下面让我们一起看看,我会以零碎的列表方式呈现,并以通俗的方式讲解那些你迷糊不清的细节??(细心的你恐怕已经发现了,这个系列的文章的前言都是一毛一样的,因为我不确定你先点开的是第几篇,哈哈)
正文:
[1]
将被序列化的对象写到文件中,然后就可以让你的程序去文件中读取序列化的对象并把它们展开回到活生生的状态。序列化的文件时很难让一般人阅读的,但他比纯文本文件更容易让程序恢复会原来的状态,也比较安全,因为一般人不会知道如何动手动脚改数据。[2]
Stream
这类串流需要两两连接才能做出有意义的事情,一个是低层的串流,一个高层的串流,这样的设计是出于面向对象考虑,一个类只做好一件事。同时通过组合不同的串流,又可以变化出很多花样。[3]
序列化的对象保存了实例变量的值,因此之后可以在堆上带回一模一样的实例。比较叼的就是当对象被序列化时,被该对象引用的实例变量也会被序列化。且所有被引用的对象也会被序列化。。。。最棒的是,这些操作都是自动进行的![4]
如果要让类能够被序列化,就实现Serializable
。Serializable
接口又被称为marker
或tag
类的标记用接口,因为此接口并没有任何方法需要实现的。如果某类事可序列化的,则它的子类也自动地可以序列化(接口的本意就是如此)。[5]
如果一个类中有引用到其他不可序列化的对象,那么这个类也是无法序列化的,切记!如果有变量不想被序列化的,则用transient
来修饰变量即可。那些变量主数据类型值会变成默认值,引用的变量会变成null
。[6]
如果有两个对象都有引用实例变量指向相同的对象对怎么样?例如两个Cat
都有相同的Owner
对象?那Owner
会被存储两次吗?答案:序列化聪明得足以分辨两个对象是否相同,在此情况下只有一个对象会被存储,其他引用会复原成指向改对象。[7]
FileInputStream
跟ObjectInputStream
组合使用的时候,如果os.close()
;的话FileInputStream
会自动跟着关掉![8]
被序列化的对象在解序列化的时候,它的构造函数是不会执行的!切记![9]
静态变量,它们会被序列化吗?答案:不会。要记得static
代表“每个类一个”而不是“每个对象一个”。当对象被还原时,静态变量会维持类中原本的样子,而不是存储时的样子,自己测试哈。[10]
关于File
有个很有用的功能就是它提供一种比使用字符串文件名来表示文件更安全的方式。[11]
缓冲区的奥妙之处就在于使用缓冲区比没有使用缓冲区的效率更高。因为每趟磁盘操作都会比内存操作要花费跟多时间。通过BufferedWriter
和FileWriter
的链接,BufferedWriter
可以暂存一堆数据,然后到满的时候再实际写入磁盘,这样就可以减少对磁盘操作的次数,从而提高效率。[12]
如果想要强制缓冲区立即写入,只要调用writer.flush()
这个方法即可[13]
String
的split()
可以把字符串拆开成数组。[14]
每台服务器上都有65536
个端口,但是我们自己在写测试socket
的时候,用的端口都要在1023
之后,因为0~1023
都已经被保留给已知的特定服务。[15]
Socket serverSocket = new Socket("127.0.0.1",5000)
这是建立服务器的Socket
连接写法。Socket sock = serverSocket.accept()
;当用户连上来的时,此方法会返回一个Socket
(在不同的端口上)以便与客户端通信。Socket
与ServerSocket
的端口不相同,因此ServerSocket
可以空出来等待其他的用户。[16]
当启动多线程的时候,我们会觉得同时在做好几件事情,其实只有真正的多处理器系统能够同时执行好几件事,所以其实多线程只是在执行空间里面非常地快速来回交换执行而已。[17]
Runnable threadJob = new MyRunnable()
;,该类就是你对线程要执行的任务的定义,也就是说此方法会在线程的执行空间运行。[18]
一旦线程执行.start()
;线程会进入可执行状态,它会在可执行与执行中两种状态中来来去去,同时也有另外一种状态:暂时不可执行(又称为被堵塞状态)。[19]
当多个线程同时操作同一个对象的时候,容易发生数据错误的情况,解决方式就是同步化方法,synchronized
。当对象有一个或多个同步化的方法时,线程只有在取得对象锁的钥匙时才能进入同步化的方法。从而保护数据的安全。(不过代价就是损耗性能,需要自己权衡)同时注意死锁的情况。[20]
每个Java
对象都有一个锁,每个锁只有一把钥匙。类也有个锁,??[21]
高级java
类设计中,泛型
的使用是非常高明的,什么是泛型,只要你看到<>就是了,其实到处都是。以泛型的观点来说,extend
代表extend
或implement
。哈哈,不看不知道哈[22]
数组的类型是在运行期间检查的,但集合的类型检查只会发生在编译期间,在多态赋值的时候,集合可没那么容易让你过哈,??[23]
远程过程调用的设计,要创建4种东西:服务器,客户端,服务器辅助设施和客户端辅助设施。其实真相就是两个辅助设施两者在负责通信,客户端跟服务器只是把命令给他们,结果拿回来而已。
总结:
大结局啦,??,其实这三篇文章是我看完之后,觉得有必要从七百多页的书中提出去来的要点,也希望对大家有帮助。我们可是攻城狮,fight!