`

Thinking in java notes

    博客分类:
  • java
阅读更多

 ============chapter 1 Basic===================

区分基类和派生类的方法:

1.在派生类中添加新的方法

2.在派生类中覆盖基类的方法

 

是和象的关系

是:完全替换

象:

派生类是否应该只覆盖基类中的方法。

 

通过使用后绑定来实现动态性

前绑定是编译器把调用在编译时就解析成绝对地址

后绑定通过特殊代码来代替绝对调用,代码用存储在对象中的信息来计算方法的地址。

因此每个对象的运行方式会根据这段特殊代码的内容而改变。

后绑定是Java的默认行为

 

upcast:将子类转成父类的过程。。。。。。(cast表示把东西浇筑到模子中去)

当消息发送给基类时,会根据具体的子类来调用相应的代码。

 

 

abstract表示你不想建立一个此类的对象,这个类只是为了表示能使用的接口。

interface是abstract概念的深化。不允许实现任何方法,从而将设计和实现完全分开。

 

 

 

抽象的数据类型==封装。。

对象的创建、使用、数据存储和控制其生命周期

1.堆(运行时才知道数量、寿命和确切的类型)还是栈(编写是知道数量、寿命和确切的类型)

    栈中分配存储单元只要一个汇编指令,而堆需要依实现而定。

    使用堆是基于对象都是很复杂,创建对象的开销远远大于分配存储的开销的假设以及更好的灵活性的假设

    java只使用堆的方式来实现存储。

2.对象的寿命

   在栈中创建的,编译器知道其寿命,会自动清理。而在堆中创建的编译器就不知道其寿命了(为什么???)

    java中使用垃圾回收的机制。

 

 

Collection和迭代器

存储分配问题和动态扩容问题。

添加对象和取出对象,取出对象时的问题:每次只能取出一个对象。解决方案:迭代器。

迭代器把集合对象抽象成了一个可以操纵的线性序列。

java1.0和1.1中使用的是Enumeration迭代器。现在用Iterator迭代器,功能更强大。

挑选容器:

1.不同的容器由不同的行为:Stack与List的行为就不同

2.不同的容器进行同一操作时由不同的效率:List、ArrayList和LinkedList

 

 

单根继承体系

从0开始,最好是单根继承。融合第三方类库,可以考虑多重继承或者适配器模式。

单根继承可以保证所有对象都有某种功能

单根继承可以使垃圾回收的实现变得更加容易

所有对象都提供运行时的类型信息,不会碰到无法判断对象类型的情况。这对异常处理之类的功能很有帮助。

 

 

下传和类型转换

把丢失的身份信息找回来。。

必须取得对象的reference和相应的类型信息。

下传的类型检查使程序的性能降低。也加重了程序编写的负担。

参数化类型机制使得可以方便的获取类型的信息

 

 

确保正确的清除

java的垃圾回收机制仅仅处理内存问题而不涉及到清除对象的其他方面【单根继承,只能用堆来创建对象】

所有能简化编程的东西都是以牺牲性能为代价的【在栈中的清理和分配都是自动的,但是失去了按需创建的能力】

单根继承和多态性也影响性能

没有办法知道什么时候调用垃圾回收程序,不能用于实时系统。

 

 

 

异常处理

绝大多数的异常处理方案都有一个问题,不是由语言强制的而要靠开发人员去遵守。

异常肯定能在某个地方得到处理,还提供了一种可靠的从错误状态下恢复的机制

Java的异常处理是从底层支持的,但是它不是一种面向对象的特性

 

 

 

并发

 

 

 

 

Persistence

Java提供轻量级persistence支持。

可以通过序列化或者jdo来实现。

 

 

 

Web

C/S

服务器:信息库、分发信息的软件和存储信息和分发信息的软件的机器合起来称为服务器。

关键:服务器存储信息并能把信息分发到客户端。

事务处理。

软件维护。

多系统、多硬件支持。

性能问题。

为了降低延时,将大多数处理放到客户端。

 

B/S

 

客户端编程:html,python,perl

插件:客户端编程最重要的步骤之一。提供了客户端编程的后门

.NET平台(JVM和Java类库)和C#(Java)

安全性:java的sandbox,没有文件IO,applet的电子签名框架

 

先用java写,再翻译成C++。。。。

 

 

JIT,HostSpot

 

 

 

============chapter 2 万物皆对象===================

Java是更纯粹的面向对象语言。

C++和java都是混合语言

C和C++必须知道是在用对象还是引用,Java中一切都是对象,通过对象的引用来操纵。

对象引用也可以单独存在。此时只创建了一个引用而没有创建对象。

 

你必须创建所有对象

    创建引用后就得链接到对象:引用初始化。

数据存储地:

    寄存器(数量有限,由编译器分配)

    栈:CPU通过栈指针来访问,对象的引用放在栈内

    堆:灵活,慢

    静态存储:在整个程序运行期间都可以访问。

    固定存储:常量值

    非内存存储:独立于程序。persistance 和 stream

特例:primitive类型

    非引用类型,放在栈中。有对应的Wrapper类别。

高精度数值:BigDecimal,BigInteger 支持任意精度

Java中的数组:

    自动初始化,null或者基本类型值。

    边界检查

 

你永远都不需要清理对象:

 作用域:作用域由{}来表示,在作用域内定义的变量只能用到这个作用域结尾。

 在Java中不能象C和C++一样隐藏变量{int x = 0;{int x=0;}}

对象的作用域:{string str = "1111";}

   str会在作用域结束后消失,但是对象"1111"不会,要等待垃圾收集工具。

 

 

 

 

 

 

============chapter 7 多态性===================

多态性提供了另一个层面的实现和接口的分离,即分离做什么和怎么做。。

隐藏实现通过将细节设计成private来实现实现和接口的分离。

多态方法调用可以让类表现出各自所独有的特点。

多态性:dynamic binding

后绑定:late binding

运行时绑定:run-time binding

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics