thinkinginjava学习笔记01_导论
初学java,希望旅途愉快 :)
类型决定对象的接口,(有人认为类是类型的特定实现),接口确定对象所能发出的请求(消息),满足请求的代码和隐藏的数据一起构成实现;
对象设计时,应该很好地完成一项任务,并且不试图做更多的事情;
继承实现多态,导出类将包括基类的所有成员以及接口,因此,导出类与基类具有相同类型;
一个完善的基类应该包括所有子类都通用的接口,由导出类设计基类的具体接口实现,并将对象所属的类型当成基类处理(导出类和基类具有相同类型,第二次强调),通过导出新的子类型来扩展封装;
动态绑定:程序直到运行时才决定方法的具体地址,编译器确保调用方法存在并且检查其类型,但并不知道具体代码,java中,动态绑定是默认行为,并不需要virtual方法;
一个形象的例子:
void doSomething(Shape shape){
shape.erase();
//…
shape.draw();
}
Circle circle = new Circle();
Triangle triangle = new Triangle();
Line line = new Line();
doSomething(circle);
doSomething(triangle);
doSomething(line);
其中Circle、Triangle、Line是Shape的导出类,doSomething在实现时,对基类的接口进行实现,而并不需要知道具体的导出类型,在调用该方法时,由于Circle和Shape具有相同类型,Circle中实现了Shape的接口,所以doSomething可以正确执行:shape.erase();shape.draw();并且不需要直到Circle实现接口的细节过程。编译器将检查返回值和参数类型,但是并不决定接口实现的代码所在位置,只有在运行时,接口代码地址才被确定。
java具有单根继承结构,所有的对象最终都继承于一个单一的基类:Object,这点和其他oop语言一致,除了c++(或许还有其他吧);
只有在执行时才能确定需要的内存空间,通过创建可以自动扩展自身的容器(类型),并将对象置于容器中,并且使用容器处理分配等细节;不同的容器提供不同类型的接口和外部行为,选择不同的容器决定解决方案的灵活程度;不同的容器对某些操作具有不同效率,通过封装接口,可以在容器之间进行快速转换而不会对代码造成大的影响,例如:List接口的两种容器:ArrayList和LinkedList具有相同接口不同的效率,并且可以在两者之间灵活转换(类比上面的例子);
由于单根继承的特点,存储Object的容器可以存储任何其他对象,这使得容器容易被复用,然而由于容器存储Object,当对象置入容器时,需要向上转型为Object,这个转型是安全的,但是会丢失部分接口,当对象从容器中取出时,需要向下转型,这个转型可能是危险的,容器需要以某种方式记录对象的类型;
由于向下转型检查需要额外的时间,通过参数化类型,定制只接纳和取出某种类型的容器,即范型,范型通过一对尖括号来指定,如存储Shape的ArrayList范型: ArrayList<Shape> 。
Java采用动态内存分配方式,对象存在堆空间中(heap),通过new关键字创建对象实例(并返回地址引用),这样的方式相对C++等将对象置于堆栈(stack)中,需要更多的查询和释放开销,但是相对C++必须知道对象的具体生命周期并且保证不出错的情况要更加灵活,而动态方式也是基于对象趋于复杂,查询和释放存储空间的开销变得次要的假设前提下。
Java通过垃圾回收机制销毁对象,对象本省并不需要知道生命周期,该工作由垃圾回收机制完成,在对象不再被使用的时候自动释放该对象(引用计数机制?)
Java内置异常处理,并且强制使用,保证实现更加健壮的代码(也是我学习java的最大动机,除了异常处理,还有单元测试);
并发编程,除了解决计算速度的问题之外,还能代替中断实现相应功能(一句话点通,每个型号的CPU含有的中断操作都不一样,实现中断需要更加复杂的硬件调度,通过多线程可以代替中断实现功能);线程只是程序逻辑,指在单一处理器分配执行时间的手段,而当操作系统支持多处理器的时候,自动将线程分配给不同的处理器;通过线程与锁模型,解决多线程的资源同步问题。
Web编程:信息存储池、用于分发信息的软件以及信息与软件所驻留的机器或机群被总称为服务器。驻留在用户机器上的软件与服务器进行通信,以获得并处理信息,然后将他们显示在客户机上;当同时为多个客户服务时,需要保证每个客户操作数据不会对其他客户产生影响(SQL中的事务处理),当并发量比较大时,往往将计算负载分散给客户端处理,或者使用中间件将负载分散给服务器端的其他机器;
另外,通过客户端编程(Native app)来负担更多的处理负载,但同时会对客户端造成计算要求(需要平衡服务器和客户端的运算),B/S模型上,几乎所有的计算任务都由服务器完成(可以通过简单的js脚本在浏览器完成简单任务),而开发浏览器插件则能够让浏览器完成更多的功能,插件引发了脚本语言的开发(如:javascript),通过在页面中嵌入脚本来执行简单任务,而不需要安装特定插件,该做法的缺点是会暴露给任何人去浏览,所以一般不用脚本实现复杂功能;除了浏览器插件,实现复杂功能就需要跨平台的变成语言实现客户端程序,如:Java;Java通过applet以及使用Java Web Start进行客户端编程,applet作为网页的一部分自动下载,并在激活时执行程序,由于是通过网页自动下载,客户端不必在程序有所修改时重新编译安装,而只需要浏览器支持java解释即可;