Java,
Java,
Chapter one
Overview : The Mental Landscape
当开始学着写计算机程序的时候,我们需要知道什么是计算机程序以及计算机程序是如何运行的。
1.1 The Fetch and Execute Cycle: Machine Language
计算机是由不同组件构成的复杂系统,但是计算机的核心部件是计算功能,即我们所熟知的CPU。在现代桌面计算机中,CPU集成为一个小小的正方形芯片。CPU的工作是执行程序。
程序是一组清晰指令的集合。计算机可以执行机器语言写成的指令。当CPU执行程序的时候,程序被存储在主内存(或者称为随机缓存)里面。除了在内存里面放置程序,内存还可以容纳数据以便被程序使用或者处理。内存包括一系列的地址。这些地址被编号。编号提供了获得特定内存地址信息的方式。当CPU需要访问内存某一地址的程序或者数据,它可以通过发送对应的地址编号作为信号给内存,内存根据地址编号返回此地址编号所存储的信息。CPU执行存储在内存的程序,执行的过程是重复的读取内存的指令,然后执行。这种读取,执行;再读取,再执行的过程被称为fetch-and-execute cycle.
对于计算机循环执行周期,我们还应该知道CPU包含一些内部的注册器,这些注册器是小的内存单元,可以用来存储单个数或者机器指令。CPU利用其中一个叫做计数器的注册器来跟踪程序的执行位置。计算器存储下一个要执行的指令的内存编号。当计算机循环执行周期开始的时候,CPU先检查计数器的值从而决定读取哪一部分的指令。在循环的过程中,计数器的数值被不断更新,指向新的待执行的机器指令。
1.2 Asynchronous Events: Polling Loops and Interrupts
CPU 和内存是计算的两大核心部件,计算机还包括其他设备:
#硬盘:存储程序和数据文件;
#键盘和鼠标:用户输入;
#显示器:显示输出;
#调制解调器:通过电话线与其他计算机通信;
#网络接口:通过网络与其他计算机通信;
#扫描仪:把图片转化成二进制数据便于计算机存储和处理。
键盘、鼠标、网络接口可以产生CPU所需要的数据;可是CPU如何知道这些数据已经产生呢?一个简单的想法就是CPU不断的检查是否有数据到来,当它发现数据,就开始处理它,这种方式叫做polling,也就是说CPU把所有的输入设备都囊括进来,不停的检查它们是否有新数据产生。虽然这种方法简单,可是这种方法非常的低效。
为了避免这种低效,interrupts方式通常会替代polling方式。interrupt是设备发送给CPU的信号。CPU通过停下它正在处理的事情,来处理interrupt的方式响应interrupt信号。一旦CPU处理完interrupt,它又返回它之前所处理的事情。interrupt赋予CPU处理异步事件的能力。
所有现代计算机都是都是多任务处理的,CPU处理的单任务被称为thread 或者process。线程和进程是有技术上的差异的。在给定的事件内,只有一个线程被CPU所运行,CPU将持续运行这个线程直到有如下的事件发生:
#此线程资源的让出;
#此线程等待异步事件的发生;
#此线程暂停。
1.3 The Jave Virtual Machine
几乎所有的程序都是用例如Java、c++等高级语言写的,用高级语言写的程序不能被计算机直接运行,必须转换成机器语言,把高级语言转换成机器语言是通过编译器来实现的。除了编译器之外,还可以通过解释器来逐步逐步解析高级语言程序。
Java语言的设计者选择了编译器和解释器的组合。用Java写成的程序被编译成机器语言,这种机器语言没有对应的机器存在,所以我们称之为Java虚拟机。Java语言的最大优势在于字节码可以在任何机器上使用。当然,不同类型的机器要安装不同的解释器,一旦机器有了字节码解释器,它就可以运行任何Java字节码程序。
1.4 Fundamental Building Blocks of Programs
变量其实是一个内存地址;程序员需要给变量命名;编译器负责跟踪内存地址。变量有类型的约束,类型决定了变量可以存放什么样的数据。
编程有两个基本元素:数据和指令。为了操作数据,我们需要理解变量和类型;为了执行指令,我们需要理解控制结构和子路由。Java语言里面提供了对变量赋值和操作的语句。
程序是由一系列的指令构成的。控制结构是特殊的指令,控制结构可以改变控制流程。有两种基本的控制结构: loops 和 branches。在loops和braches中可以插入subroutines。
1.5 Object and Object-orinted Programming
面向对象编程的核心概念是object;object是包含数据和子路由的模块。面向对象编程的三大特性: information hiding、polymorphism、inheritance。
1.6 The Modern User Interface
最早的人机交互是通过command-line interface;现在大多数人通过Graphical User Interface 与计算机交互。Java拥有两套GUI组件:AWT 和Swing. Java的GUI编程充分的体现了OOP的思想。
1.7 The Internet and the World-Wide Web
计算机可以通过网络联系在一起。在同一个网络中的计算机可以交换数据和文件。
Chapter 2
Programming in the Small I: Names and Things
2.1 Vaiables and the Primitive Types
命名是编程的基础。在程序中,命名被用来引用不同的事物。按照Java语言句法的规则,命名是一系列字符的组合。命名必须以字母或者下划线开头。
Java的对象类型与原始类型有着很大的不同;声明一个类变量并不一定自动创造此类的对象。对象必须显示的被构造。对于计算机来说,构造对象的过程意味着在heap中找到未使用的内存来保存变量;然后填充对象的实例变量;作为程序员,我们不在意对象存放在内存中的哪个位置,我们关心如何控制对象实例变量的初始化值。
对象存在于heap中,对象可以通过持有对象引用的变量来访问;Java通过垃圾回收来释放不被其他程序所使用或者引用对象的内存。
内部类是定义在另外一个类内部的类,分为命名内部类和匿名内部类;静态内部类是包含它的外部类的静态结构的一部分。静态内部类可以访问外部类所有的静态成员;同样,外部类可以访问静态内部类的任何成员。当编译内部类的时候,会产生两个类文件。
Java的GUI程序有两种类型:独立应用和applets。applets是运行在网页上的程序。在GUI程序中;每一个GUI组件都是一个对象。最重要的一个组件是window,窗口有很多行为,它们可以打开或者关闭,可以调整大小、可以显示标题,可以包含其他GUI组件。JFrame类是程序的主窗口;JFrame对象有一个setContentPane()方法来添加JPanel对象;JPanel对象有两个作用;一是添加其他组件;二是在面板上画一些东西。
GUI编程是事件驱动编程。当一个事件发生的时候,程序会执行事件处理方法;处理事件的技巧是使用事件监听器。监听器是包含一个或者多个事件处理方法的对象。GUI组件产生事件;监听器监听到事件发生后,执行对应的方法处理事件。
当数组创建的时候,数组的元素个数已经确定。通过查找数组中每一个元素的方法是线性查询法;如果没有数组中元素的顺序信息,将没有比这个更好的算法。如果知道数组中元素是以升序或者倒序的顺序排列;那么可以利用更快的查找算法。二分法是查找排序数组的方法;
在Java中,一个单一任务就是一个线程。为了解决竞争条件的问题,需要提供一些方法来排他性的获得共享资源。在Java中用synchronized 方法和synchronized 语句来实现排他性访问共享资源。The problem of inserting a new item into a liked list is more difficult, at leat in the case where the item is inserted into the middler of the list. To do this, it is convenient to have two variables of type Node, which refer to the existing nodes that will lie on either side if the new node.
A node that has no children is called a leaf. A leaf node can be recognized by the fact that both the left and right pointers in the node are null. In the standard picture of a binary tree, the root node is shown at the top and the leaf nodes at the bottom.
Java的数据结构分为两大类:collections和maps。collections是对象的集合;maps是键值对集合。collections有两种类型:lists和sets。lists是对象以线性方式存放的集合。sets是无重复元素的集合,元素没有固定的顺序存放。
在Java中,实现Set<T>接口有TreeSet和HashSet。TreeSet有一个特点就是TreeSet中的元素都以升序的方式排列。TreeSet中的元素不是随便的元素,所以它必须实现Comparable<T>接口;就是说元素可以进行比较从而排序。
To deal with the two broad categories of data representation, java has two broad categories of streams: byte streams for machine-formatted data and character streams for human-readable data. An object that output data to a byte stream belongs to one of the subclasses of the abstract class outputstream.
The classes PrintWriter,TextReader,Scanner,DataInputStream and DataOutputStream allow you to easily input and output all of java's primitive data types. But what happens when you want to read and write objects?Traditionally, you would have to come up with some way of encoding your objects as a sequence of data values belonging to the primitive types,which can then be output as bytes or character. This is called serializing the object.page
网络传输协议依赖于两队协议:Transmission Control Protocol和Internet Protocol 简称为TCP/IP。UDP是替代TCP另外一种协议。Java也支持UDP协议。利用TCP/IP通信的两个程序都需要创建一个socket,这两个socket将相连。一旦socket建立起连接;输出流和输入流的通信将发生。每一个程序有它自身的输入流和输出流。程序通过输出流将数据传递给另外一台计算机;它将称为另外一个程序的输入流,输入流读取传递过来的数据。创建socket监听请求连接的一端称为服务端;等待其他socket请求的连接的socket也称为服务端socket;连接服务器端的socket称为客户端socket;
为了实现TCP/IP连接;java.net包里面提供了两个类:ServerSocket和Socket。ServerSocket是等待客户端连接请求的监听Socket。Socket是实际网络连接的一个端点。当你构建一个ServerSocket对象的时候,需要指定监听的端口号:public ServerSocket(int port) throws IOException。
ServerSocket实例创建后,就开始监听连接请求;ServerSocket对象的accept()方法接受请求,建立与客户端的连接,然后返回Socket与客户端通信。accept()方法的具体形式如下:public Socket accept() throws IOException;当你调用accept()方法时,请求连接接收到才会返回Socket,要不然会抛出错误信息。当等待连接的时候,accept()方法处于阻塞状态。连接服务端的socket,采用如下构造函数:public Socket(String computer, int port) throws IOException。Socket建立起连接,Socket的getInputStream()和 getOutputStream()方法就可以获得通信中的数据流。
相关文章
- 暂无相关文章
用户点评