1.阅读《疯狂Java讲义》

从2000年至今,Java语言一直是应用最广的开发语言,并拥有最广泛的开发人群。如今,java已经不再简单地是一门语言,它更像一个完整的体系,一个系统的开发平台。更甚至,它被延伸成一种开源精神。

如何学习java?

程序的作用是:解决问题--如果你的程序不能解决你自己的问题,如何期望你的程序去解决别人的问题呢?那你的程序的价值何在?所以笔者认为:最好的学习方法就是“案例驱动”--知道为什么要用这个知识点,才去学这个知识点,而不是盲目学习!因此本书强调编程实战,强调以项目激发编程兴趣。

java语言具有功能强大和简单易用两个特征。

Sun公司在1995年年初发布了java语言,Sun公司直接把java放到互联网山,免费给大家使用。甚至连源代码也不保密,也放在互联网上向所有人公开。

  • J2ME:主要用于控制移动设备和信息家电等有限存储的设备。
  • J2SE:是整个java技术的核心和基础,它是j2ME和J2EE编程的基础,也是这本书主要介绍的内容。
  • J2EE:java技术中应用最广泛的部分,J2EE提供了企业应用开发相关的完整解决方案。

java的设计宗旨独立于任何平台,自然不会提供太多的Windows特性。但这也正是java语言的优势:跨平台。

事实上,Ruby确实是一种非常简洁的解释性语言,它是一种纯粹的面向对象编程语言,甚至比java更纯粹(在java语言里,还有基本数据类型等不是对象的变量,但在Ruby语言里,一切都是对象)。除此之外,Ruby还提供了许多额外的便捷功能:闭包、迭代和集合等,这些都是为了达到Ruby语言创始人的梦想:让Ruby开发者能享受编程的快乐。

Ruby语言还有一个重要的优点:它也是完全跨平台的,可以在任何操作系统上解释执行。

关于Rails框架和java EE平台,其实是各有优势的:Rails平台的简洁性,易用性会在中小型应用上发挥出更大的吸引力;但java EE平台则提供了更多的选择,适合对技术有精准把握的开发者,用于解决有复杂需求的大型企业级应用。

java语言是一种特殊的高级语言,它既具有解释性语言的特征,也具有编译型语言的特征,因为java程序要经过先编译,后解释两个步骤。

封装,继承和多态。

  • OOA-面向对象分析
  • OOD-面向对象设计
  • OOP-面向对象编程

目前业界统一采用UML(统一建模语言)来描述并记录OOA和OOD的结果。

结构化程序设计简介

结构化程序设计方法主张按功能来分析系统需求,其主要原则可概括为自顶向下,逐步求精,模块化等。结构化程序设计首先采用结构化分析方法对系统进行需求分析,然后使用结构化设计方法对系统进行概要设计,详细设计,最后采用结构化编程方式来实现系统。使用这种SA,SD和SP的方式可以较好地保证软件系统的开发进度和质量。

因为结构化程序设计方法主张按功能把软件系统逐步细分,因此这种方式也被成为面向功能的程序设计方法;结构化程序设计的每个功能都负责对数据进行一次处理,每个功能都接受一些数据,处理完后输出一些数据,这种处理方式也被成为面向数据流的处理方式。

结构化程序设计里最小的程序单元是函数,每个函数都负责完成一个功能,用于接受一些输入数据,函数对这些输入数据进行处理,处理结束后输出一些数据。整个软件系统由一个一个函数组成,从而完成整个软件系统的功能。

结构化设计需要采用自顶而下的设计方式,在设计阶段就需要考虑每个模块应该分解成哪些子模块,每个子模块又分解成哪些更小的模块......以此类推,直至将模块细分成一个一个函数。

每个函数都是具有输入,输出的子系统,函数的输入数据包括函数形参,全局变量和常量等,函数的输出数据包括函数返回值以及传出参数等。结构化程序设计方式的局限性有如下两个:

  • 设计不够直观,与人类习惯思维不一致。采用结构化程序分析,设计时,开发者需要将客观世界模型分解成一个一个功能,每个功能用以完成一定的数据处理。
  • 适应性差,可扩展性不强。由于结构化设计采用自顶而下的设计方式,所以当用户的需求发生改变,或需要修改现有的实现方式时,都需要自顶而下地修改模块结构,这种方式的维护成本相当大。

任何简单或复杂的算法都可以由顺序结构,选择结构和循环结构这三种基本结构组合而成。

java语言是面向对象的,但java的方法里则是一种结构化的程序流。

面型对象程序设计简介

面向对象是一种更优秀的程序设计方法,它的基本思想是使用类,对象,继承,封装,消息等基本概念来进行程序设计。它是从现实世界中客观存在的事物(即对象)出发来构造软件系统,并在系统构造中尽可能运用人类的自然思维方式,强调直接以现实世界中的事物(即对象)为中心来思考问题,认识问题,并根据这些事物的本质特点, 把他们抽象地表示为系统中的类,作为系统的基本构成单元(而不是用一些与现实世界中的事物相关比较远,并且没有对应关系的其他过程来构造系统),这使得系统可以直接映射客观世界,并保持客观世界中事物及其相互关系的本来面貌。

如果采用面向对象方式开发的软件系统,其最小的程序单元是类,这些类可以生成系统中的多个对象,而这些对象则直接映射成客观世界中的各种事物。

从世界观的角度可以认为:面向对象的基本哲学是认为世界是由各种各样具有自己的运动规律和内部状态的对象所组成的;不同对象之间的相互作用和通信构成了完整的现实世界。因此,人们应当按照现实世界这个本来面貌来理解世界,直接通过对象及其相互关系来反映世界。这样建立起来的系统才能符合现实世界的本来面目。

从方法学的角度可认为:面向对象的方法是面向对象的世界观在开发方法中的直接运用。它强调系统的结构应该直接与现实世界的结构相对应,应该围绕现实世界中的对象来构造系统,而不是围绕功能来构造系统。

从程序设计的角度来看,面向对象的程序设计语言必须有描述对象及其相互之间关系的语言成分。这些程序设计语言可以归纳为以下几类:系统中一切皆为对象:对象是属性及其操作的封装体;对象可按其性质分为类,对象称为类的实例;实例关系和继承关系是对象之间的静态关系;消息传递是对象之间动态联系的唯一形式,也是计算的唯一形式:方法是消息的序列。

对于面向对象的眼光来看,开发者从自己的使用角度或认识角度出发来定义类。就是说,我们定义类的目的是希望模拟客观世界的某种事物,并让自己明白,这种事物是用来做什么的,或者这种事物是怎么来的,对于我们有什么意义,这就睡面向对象方式的主要思考方式。因此,面向对象程序设计的主要优点是:让人类习惯的思维方法一致;稳定性哈;可重用性好;易于开发大型软件产品;可维护性好。

面向对象的基本特征

面向对象方法具有三个基本特征:封装,继承和多态,其中,继承是面向对象实现软件复用的重要手段,当子类继承父类后,子类作为一种特殊的父类,将直接获得父类的属性和方法;封装指的是将对象的实现细节隐藏起来,然后通过一些公用方法来暴露该对象的功能;多态指的是子类对象可以直接赋给父类变量,但运行时依然表现出子类的行为特征,这意味着同一个类型的对象在运行时可能表现出不同的行为特征。

除此之外,抽象也是面向对象的重要部分,抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是考虑部分问题。例如我们需要考察Person实体时,我们不可能在程序中将Person的所有细节都定义出来,通常只能定义Person的部分数据,部分行为特征--而这些数据,行为特征是软件系统所关心的部分。


提示:虽然抽象是面向对象的重要部分,但它不是面向对象的特征之一,因为所有编程语言都需要抽象。当开发者进行抽象时应该考虑哪些特征是软件系统所需要的,那么这些特征就应该使用程序记录,并表现出来。因此,需要抽象哪些特征没有必然的规定,而是取决于软件系统的功能需求。


面向对象还支持如下几个功能:

  • 对象是面向对象方法中最基本的概念,它的基本特点有:标识唯一性,分类性,多态性,封装性,模块独立性好。
  • 类是具有共同属性,共同方法的对象的集合。类是对象的抽象;对象则是类的实例。而类是整个软件呢系统最小的程序单元,类的封装性将各种信息细节隐藏起来并通过公用方法来暴露该类对外所提供的功能,从而提高了类的内聚性,降低了对象之间的耦合性。
  • 对象间的这种相互合作需要一个机制协作进行,这样的机制称为“消息”。消息是一个实例与另一个实例之间传递的信息。
  • 在面向对象方法中,类之间共享属性和操作的机制称为继承。已有的类可当做几类来引用,则新类相应的可当做派生类来引用。继承具有传递性。可分为单继承(一个继承只允许有一个直接父类,即类等级为树形结构)与多继承(一个类允许有多个直接父类)。

注意:由于多重继承可能引起继承结构的混乱,而且会大大降低程序的可理解性,所以java不再支持多继承。

在编程语言领域,还有一种“基于对象”的概念,这两个概念极易混淆:通常而言,"基于对象"也使用了对象,但是无法利用现有的对象模板产生新的对象类型,继而产生新的对象,也就是说,“基于对象”没有继承的特点。而“多态”表现为父类类型的子类对象实例,没有了继承的概念也就无从谈论“多态”。而面向对象的三大基本特征(封装,继承,多态)缺一不可,例如javaScript语言就是基于对象的,它使用一些封装好的对象,调用对象的方法,设置对象的属性。但是他们无法让开发者派生新对象类型。他们只能使用现有对象的方法和属性。

当你判断一门语言是否是面向对象的时候,通常可以使用后两个特性来加以判断。“面向对象”和“基于对象”都实现了“封装”的概念,但是面向对象实现了“继承和多态”,而“基于对象”没有实现这些。

从事面向对象编程的人按照分工来说,可以分为“类库的创建者”和“类库的使用者”。使用类库的人并不都是具备了面向对象思想的人,通常知道如何继承和派生新对象就可以使用类库了,然而我们的思维并没有真正地转过来,使用类库只是在形式上是面向对象,而实质上只是库函数的一种扩展。

UML(统一建模语言)介绍

面向对象软件开发需要经过OOA(面向对象分析),OOD(面向对象设计)和OOP(面向对象编程)三个阶段,OOA对目标系统进行分析并建立分析模型,并将之文档化,OOD用面向对象的思想将OOA的结果进行细化,得出设计模型。OOA和OOD的分析,设计结果需要统一的符号的描述,交流并记录,UML就是这种用于描述,记录OOA和OOD结果的符号表示法。

面向对象的分析与设计方法在20世纪80年代末至90年代中出现了一个高潮,UML是这个高潮的产物。在此期间出现了三种具有代表性的表示方法。

UML是一种定义良好,易于表达,功能强大且普遍适用的建模语言。它的作用域不限于支持面向对象的分析与设计,还支持从需求分析开始饿软件开发的全过程。

截止1996年10月,UML获得了工业界,科技界和应用界的广泛支持,已有700多个公司表示支持采用UML作为建模语言。1996年底,UML已稳占面向对象技术市场的85%,称为可视化建模语言事实上的工业标准。

很少有一个系统软件系统在分析,设计阶段把每个细节都使用十三种图形来表现。永远记住一点:不用把UML表示法当成一种负担,而应该把它当成一种工具,一种用于描述,记录软件分析设计的工具。最常用的UML图包括:用例图,类图,组件图,部署图,顺序图,通信图,活动图和状态机图等。

用例图

用例图用于描述系统提供的系列功能,而每个用例则代表系统的一个功能模块。用例图的主要目的是帮助开发团队以一种可视化的方式理解系统的需求功能,用例图对系统的实现不作任何说明,仅仅是系统功能的描述。

用例图包括用例(以一个椭圆表示,用例的名称放在椭圆的中心或椭圆下面),“角色”(Actor,也就是与系统交互的其他实体,以一个人形符号表示),角色和用例之间的关系(以简单的线段来表示),以及系统内用例之间的关系。用例图一般表示出用例的组织关系--要么是整个系统的全部用例,要么是完成具体功能的一组用例。

用例图通常用于表达系统或者系统范畴的高级功能。可以很容易看出该系统所提供的功能。这个系统允许注册用户登录,发帖和回复,其中发帖和回复需要依赖于登录;允许管理员删除其他人的帖子,删帖也需要依赖于登录。

用例图主要在需求分析阶段使用,用于与客户交流,保证系统需求的无二性,用实例图表示系统外观,不要指望用例图和系统的各个类之间有任何联系。不要把用例做得过多,过多的用例将导致难以阅读,难以理解;尽可能多地使用文字说明。

类图

类图是最古老,功能最丰富,使用最广泛的UML图形。类图表示系统中应该包含哪些实体,各实体之间如何关联;换句话说,它显示了系统的静态结构,类图可用于表示逻辑类逻辑类通常就是业务人员所谈及的事物种类。

类在类图上使用包含三个部分的矩形来描述,最上面额部分显示类的名称,中间部分包含类的属性,最下面的部分包含类的方法。

类图除了可以表示实体的静态内部结构之外,还可以表示实体之间的相互关系,类之间有三种基本关系:

  • 关联(包括聚合,组合)
  • 泛化(与继承同一个概念)
  • 依赖

关联

客观世界之间的两个实体之间总是存在千丝万缕的关系,当我们把这两个实体抽象到软件系统中时,两个类之间必然存在关联关系。关联具有一定的方向性:如果仅能从一个;类单方向地访问另一个类,则被称为单向关联;如果两个类可以互相访问对象,则被称为双向关联。一个对象能访问关联对象的数目被称为多重性,例如建立学生和老师之间的单向关联,则可以从学生访问老师,但从老师不能访问学生,关联使用一条实线来表示,带箭头的视线表示单向关联。

在很多时候,关联和属性很像,关联和属性的关键区别在于:类里的某个属性引用到另外一个实体时,则变成了关联。

关联关系包括两种特例:聚合和组合,他们都有部分和整体的关系,但通常认为组合比聚合更加严格。当某个实体聚合成另一个实体时,该实体还可以同时是另一个实体的部分,例如学生可以既是篮球俱乐部的成员,也可以是书法俱乐部的成员;当某个实体组成另一个实体时,该实体则不能同时是一个实体的部分。聚合使用带空心菱形框的实线表示,组合则使用带实心菱形框的实线表示。

泛化

泛化与继承是同一个概念,都是指的子类是一种特殊的父类,类与类之间的继承关系是非常普遍的,继承关系使用带空心箭头的实线表示。

依赖

如果一个类的改动会导致另一个类的改动,则称为两个类之间存在依赖。依赖关系使用带箭头的虚线表示,其中箭头指向被依赖的实体。依赖的常见可能原因:

  • 改动的类将消息发给另一个类。
  • 改动的类以另一个类作为数据部分。
  • 改动的类以另一个类作为操作参数。

通常而言,依赖是单向的,尤其是当数据表现和数据模型分开设计时,则数据表现依赖于数据模型。

组件图

对于现代的大型应用程序而言,通常不只是单独一个雷或单独一组类所能完成的,通常会由一个或多个可部署的组件组成。对java程序而言,可复用的组件通常打包成一个JAR,WAR等文件;对C/C++应用而言,可复用的组件通常是一个函数库,或者是一个DLL(动态链接库)文件。

组件图提供系统的物理视图。它的用途是显示系统中的软件对其他软件组件(例如,库函数)的依赖关系。组件图可以在一个非常高的层次上显示,从而仅显示粗粒度的组件,也可以在组件包层次上显示。UML使用一个特殊符号来表示组件。

部署图

现代的软件工程早已超出早期的单击程序,整个软件系统可能是跨国家、跨地区的分布式软件。软件的不同部分可能需要部署在不同地方、不同平台之上。部署图用于描述软件系统如何部署到硬件环境中。它的用途是显示软件系统不同的组件将在何处物理地运行,以及他们将如何彼此通信。

因为部署图是对物理运行情况进行建模,所以系统的生产人员就可以很好地利用这种图来安装,部署软件系统。

部署图中的符号包括组件图中所使用的符号元素,另外还增加了几个符号,主要是增加了节点的概念:节点是各种计算资源的通用名称,主要包括处理器和设备两种类型,两者的区别是处理器能够执行程序的硬件构件(如计算机主机),而设备是一种不具备计算能力的硬件构件(如打印机),UML中使用三维立方体表示节点,节点的名称位于立方体的顶部。

顺序图

顺序图显示具体用例(或者是用例的一部分)的详细流程,并且显示了流程中不同对象之间的调用关系,同时还可以很详细地显示对不同对象的不同调用。顺序图描述了对象之间的交互(顺序图和通信图都被称为交互图),重点在于描述消息及其时间顺序。

顺序图有两个维度:垂直维度以发生的时间顺序显示消息/调用的序列;水平维度显示消息被发送到的对象实例。顺序图的关键在于对象之间的消息,对象之间的信息传递就是所谓的消息发送,消息通常表现为对象调用另一个对象的方法或方法的返回值,发送者和接受者之间的箭头表示消息。

顺序图的绘制非常简单。顺序图的顶部每个框表示每个类的实例(对象),在框中,类实例名称和类名称之间用冒号或空格来分隔,例如,myReportGenerator:ReportGenerator。如果某个类实例向另一个类实例发送一条消息,则绘制一条具有指向接收类实例的带箭头的连线,并把消息/方法的名称放在连线上面。

对于某些特别重要的消息,我们还可以绘制一条带箭头的,指向发起类实例的虚线,将返回值标注在虚线上,绘制带返回值的信息可以使得序列图更易于阅读。

当绘制顺序图时,消息可以向两个方法扩展,消息穿梭在顺序图中,通常应该把消息发送者与接受者相邻摆放,尽量避免消息跨越多个对象。对象的激活器不是其存在的时间,而是它占据cpu的执行时期,绘制顺序图时,激活期要精确。

阅读顺序图也非常简单,通常我们从最上面的消息开始(也就是时间上最先开始的消息),然后沿消息方向依次阅读。

大多数情况,交互图中的参与者是对象,多以也可以直接在方框中放置对象名。

绘制顺序图主要帮助开发者对某个用例的内部执行清晰化,当需要考察某个用例内部若干对象行为时,应使用顺序图,顺序图擅长表现对象之间的协作顺序,不擅长表现行为的精确定义。

活动图

活动图和转态机图都被称为演化图,其区别和联系如下:

  • 活动图:用于描述用例内部的活动或方法的流程,如果除去活动图中的并行活动描述以后,它就变成流程图。
  • 状态机图:描述某一对象生命周期中需要关注的不同状态,并将详细描述刺激对象状态改变的事件,以及对象状态改变时所采取的动作。

演化图的五要素如下:

  • 状态:状态是对象响应事件前后的不同面貌,状态是某个时间段对象所保持的稳定态,目前的软件计算都是基于稳定态的,对象的稳定态是对象的固有特征,一个对象的状态一般是有限的。有限状态的对象是容易计算的,对象的状态越多,对象的状态迁移越复杂,对象状态可以想象成对象演化过程中的快照。
  • 事件:来自对象外界的刺激,通常的形式是消息的传递,只是相对对象而言发生了事件。事件是对象状态发生改变的原动力。
  • 动作:动作是对象针对所发生事件所做的处理,实际上通常表现为某个方法被执行。
  • 活动:活动是动作激发的后续系统行为。
  • 条件:条件指事件发生所需要具备的条件。

对于激发对象状态改变的事件,通常有两种类型:

  • 内部事件:从系统内部激发的事件,一个对象的方法(动作)调用,(通过事件激活)另一个对象方法(动作)。
  • 外部事件:从系统边界外激发的事件,例如用户的鼠标,键盘动作。

活动图主要用于描述过程原理,业务逻辑以及工作流的技术,很多情况下,活动图与传统的流程图非常相似,区别是活动图支持并发。活动图非常类似于传统的流程图,它也使用圆角矩形表示活动,使用带箭头的实线表示事件。

从图中可以看出如果将这个活动图的两支分开,每支就是一个传统的流程图,每个活动依次向下,遇到条件分支使用菱形框来表示条件。与传统的流程图不同的是,互动图可以使用并行分支分出多条并行活动。

绘制活动图时以活动为中心,整个活动图只有一个开始活动,可以有多个结束活动,活动图需要将并行活动和串行活动分离遇到分支和循环时最好像传统流程图将分支,循环条件明确表示。活动图最大优点在于支持并行行为,并行对于工作流建模和过程建模非常重要。因为有了并行,因此需要进行同步,同步通过汇合来指明。

状态机图

状态机图表示某个类所处的不同状态和该类的状态转换信息。实际上我们很少绘制状态机图,我们只对“感兴趣的”类绘制状态机图。也就是说,在系统活动期间具有三个或更多潜在状态的类才需要考虑使用状态机图进行描述。

状态机图的符号集包括5个基本元素:

  • 初始状态,它使用实心圆来绘制;
  • 状态之间的转换,它使用具有带箭头的线段来绘制;
  • 状态,它使用圆角矩形来绘制;
  • 判断点,它使用空心圆来绘制;
  • 一个或者多个终止点,它们使用内部包含实心圆的圆来绘制。

要绘制状态机图,首先绘制起点和一条指向该类的初始状态的转换线段。状态本身可以在图上的任意位置绘制,然后只需使用状态转换线条将他们连接起来。

绘制状态机图时应该保证对象只有一个初始状态,可以有多个终结状态。状态要表示对象的关键快照,有重要的实际意义,无关紧要的状态则无须考虑,绘制状态机图时事件和方法要明确。

状态机图擅长表现单个对象的跨用例行为,对于多个对象的交互行为应该考虑采用顺序图,不要对系统的每个对象都画状态机图,只对真正需要关心各个状态的对象才画状态机图。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
第1章 Java概述 1 1.1 Java语言的发展简史 2 1.2 Java的竞争对手及各自优势 4 1.2.1 C#简介和优势 4 1.2.2 Ruby简介和优势 4 1.2.3 Python的简介和优势 5 1.3 Java程序运行机制 5 1.3.1 高级语言的运行机制 6 1.3.2 Java程序的运行机制和JVM 6 1.4 开发Java的准备 7 1.4.1 安装JDK 8 学生提问:不是说JVM是运行Java程序的虚拟机吗?那JRE和JVM的关系是怎样的呢? 8 学生提问:为什么不安装公共JRE系统呢? 9 1.4.2 设置PATH环境变量 10 学生提问:为什么选择设置用户变量,用户变量和系统变量有什么区别呢? 11 1.5 第一个Java程序 12 1.5.1 编辑Java源代码 12 1.5.2 编译Java程序 13 学生提问:当我们使用编译C程序时,不仅需要指定存放目标文件的位置,也需要指定目标文件的文件名,这里使用javac编译Java程序时怎么不需要指定目标文件的文件名呢? 13 1.5.3 运行Java程序 14 1.5.4 根据CLASSPATH环境变量定位类 15 1.6 Java程序的基本规则 16 1.6.1 Java程序的组织形式 16 1.6.2 Java源文件的命名规则 17 1.6.3 初学者容易犯的错误 18 1.7 垃圾回收机制 20 1.8 何时开始使用IDE工具 21 学生提问:老师,我想学习Java编程,到底是学习Eclipse好呢,还是学习JBuilder好呢? 21 1.9 本章小结 22 本章练习 22 第2章 理解面向对象 23 2.1 面向对象 24 2.1.1 结构化程序设计简介 24 2.1.2 程序的三种基本结构 25 2.1.3 面向对象程序设计简介 27 2.1.4 面向对象的基本特征 28 2.2 UML(统一建模语言)介绍 29 2.2.1 用例图 30 2.2.2 类图 31 2.2.3 组件图 33 2.2.4 部署图 33 2.2.5 顺序图 34 2.2.6 活动图 34 2.2.7 状态机图 36 2.3 Java的面向对象特征 36 2.3.1 一切都是对象 37 2.3.2 类和对象 37 2.4 本章小结 37 第3章 数据类型和运算符 38 3.1 注释 39 3.1.1 单行注释和多行注释 39 3.1.2 文档注释 40 学生提问:API文档是什么? 40 学生提问:为什么要掌握查看API文档的方法? 42 3.2 标识符和关键字 45 3.2.1 分隔符 45 3.2.2 标识符规则 47 3.2.3 Java关键字 47 3.3 数据类型分类 48 3.4 基本数据类型 48 3.4.1 整型 49 3.4.2 字符型 49 3.4.3 浮点型 51 3.4.4 布尔型 52 3.5 基本类型的类型转换 53 3.5.1 自动类型转换 53 3.5.2 强制类型转化 54 3.5.3 表达式类型的自动提升 56 3.6 直接量 57 3.6.1 直接量的类型 57 3.6.2 直接量的赋值 58 3.7 运算符 58 3.7.1 算术运算符 58 3.7.2 赋值运算符 61 3.7.3 位运算符 62 3.7.4 扩展后的赋值运算符 64 3.7.5 比较运算符 65 学生提问:Java为什么要对这些数据进行缓存呢? 67 3.7.6 逻辑运算符 67 3.7.7 三目运算符 68 3.7.8 运算符的结合性和优先级 69 3.8 本章小结 70 本章练习 70 第4章 流程控制和数组 71 4.1 顺序结构 72 4.2 分支结构 72 4.2.1 if条件语句 72 4.2.2 switch分支语句 76 4.3 循环结构 78 4.3.1 while循环语句 78 4.3.2 do while循环语句 79 4.3.3 for循环 80 4.3.4 嵌套循环 83 4.4 控制循环结构 84 4.4.1 使用break结束循环 84 4.4.2 使用continue结束本次循环 86 4.4.3 使用return结束方法 87 4.5 数组类型 87 4.5.1 理解数组:数组也是一种类型 88 学生提问:int[]是一种类型吗?怎么使用这种类型呢? 88 4.5.2 定义数组 88 4.5.3 数组的初始化 89 学生提问:能不能只分配内存空间,不赋初始值呢?89 4.5.4 使用数组 90 学生提问:为什么要我记住这些异常信息? 91 4.5.5 JDK1.5提供了foreach循环 91 4.6 深入数组 93 4.6.1 内存中的数组 93 学生提问:为什么有栈内存和堆内存之分? 93 4.6.2 基本类型数组的初始化 95 4.6.3 引用类型数组的初始化 96 4.6.4 没有多维数组 99 学生提问:我是否可以让图4.13中灰色覆盖的数组元素再次指向另一个数组?这样不可以扩展成三维数组吗?甚至扩展到更多维的数组? 101 4.6.5 操作数组的工具类 102 4.6.6 数组的应用举例 103 4.7 本章小结 106 本章练习 106 第5章 面向对象(上) 107 5.1 类和对象 108 5.1.1 定义类 108 学生提问:构造器不是没有返回值吗?为什么不能用void修饰呢? 110 5.1.2 对象的产生和使用 110 5.1.3 对象、引用和指针 111 5.1.4 对象的this引用 112 5.2 方法详解 116 5.2.1 方法的所属性 116 5.2.2 方法的参数传递机制 116 5.2.3 形参长度可变的方法 120 5.2.4 递归方法 121 5.2.5 方法重载 123 学生提问:为什么方法的返回值类型不能用于区分重载的方法? 124 5.3 成员变量和局部变量 124 5.3.1 成员变量和局部变量 125 5.3.2 成员变量的初始化和内存中的运行机制 128 5.3.3 局部变量的初始化和内存中的运行机制 130 5.3.4 变量的使用规则 130 5.4 隐藏和封装 132 5.4.1 理解封装 132 5.4.2 使用访问控制符 132 5.4.3 package和import 135 5.4.4 Java的常用包 140 5.5 深入构造器 140 5.5.1 使用构造器执行初始化 141 学生提问:构造器是创建Java对象的途径,是不是说构造器完全负责创建Java对象? 141 5.5.2 构造器的重载 142 学生提问:为什么要用this来调用另一个重载的构造器?我把另一个构造器里的代码复制、粘贴到这个构造器里不就可以了吗? 143 5.6 类的继承 144 5.6.1 继承的特点 144 5.6.2 重写父类的方法 145 5.6.3 父类实例的super引用 146 学生提问:我们只是创建了一个Ostrich对象时,哪来的Bird对象? 147 5.6.4 调用父类构造器 148 学生提问:为什么我创建Java对象时从未感觉到java.lang.Object的构造器被调用过? 150 5.7 多态 151 5.7.1 多态性 151 5.7.2 引用变量的强制类型转换 152 5.7.3 instanceof运算符 154 5.8 继承与组合 154 5.8.1 使用继承的注意点 155 5.8.2 利用组合实现复用 156 学生提问:使用组合关系来实现复用时,需要创建两个Animal对象,是不是意味着使用组合关系时系统开销更大? 159 5.9 初始化块 159 5.9.1 使用初始化块 160 5.9.2 初始化块和构造器 161 5.9.3 静态初始化块 162 5.10 本章小结 165 本章练习 165 第6章 面向对象(下) 166 6.1 基本数据类型的包装类 167 6.2 处理对象 170 6.2.1 打印对象和toString方法 170 6.2.2 ==和equals比较运算符 172 6.3 类成员 175 6.3.1 理解类成员 175 6.3.2 单例(Singleton)类 176 6.4 final修饰符 177 6.4.1 final变量 177 6.4.2 final方法 181 6.4.3 final类 182 6.4.4 不可变类 182 6.4.5 缓存实例的不可变类 186 6.5 抽象类 188 6.5.1 抽象方法和抽象类 188 6.5.2 抽象类的作用 191 6.6 更彻底的抽象:接口 192 6.6.1 接口的概念 192 6.6.2 接口的定义 193 6.6.3 接口的继承 195 6.6.4 使用接口 195 6.6.5 接口和抽象类 197 6.6.6 面向接口编程 198 6.7 内部类 202 6.7.1 非静态内部类 202 学生提问:非静态内部类对象和外部类对象的关系是怎样的? 206 6.7.2 静态内部类 207 学生提问:为什么静态内部类实例方法也不能访问外部类的实例属性呢? 207 学生提问:接口里是否能定义内部接口? 208 6.7.3 使用内部类 208 学生提问:既然内部类是外部类的成员,是否可以为外部类定义子类,在子类中再定义一个内部类来重写其父类中的内部类? 211 6.7.4 局部内部类 211 6.7.5 匿名内部类 212 6.7.6 闭包(Closure)和回调 215 6.8 枚举类 217 6.8.1 手动实现枚举类 217 6.8.2 枚举类入门 219 6.8.3 枚举类的属性、方法和构造器 220 6.8.4 实现接口的枚举类 223 6.8.5 包含抽象方法的枚举类 224 6.9 对象与垃圾回收 225 6.9.1 对象在内存中的状态 226 6.9.2 强制垃圾回收 227 6.9.3 finalize方法 228 6.9.4 对象的软、弱和虚引用 230 6.10 修饰符的适用范围 233 6.11 使用JAR文件 234 6.11.1 jar命令详解 235 6.11.2 创建可执行的JAR包 237 6.11.3 关于JAR包的技巧 238 6.12 本章小结 239 本章练习 239 第7章 Java集合 240 7.1 Java集合概述 241 7.2 Collection和Iterator接口 243 7.2.1 使用Iterator接口遍历集合元素 244 7.2.2 使用foreach循环遍历集合元素 246 7.3 Set接口 247 7.3.1 HashSet类 247 学生提问:hashCode方法对于HashSet的作用是什么? 249 7.3.2 TreeSet类 252 7.3.3 EnumSet类 259 7.4 List接口 261 7.4.1 List接口和ListIterator接口 261 7.4.2 ArrayList和Vector实现类 264 7.4.3 固定长度的List 266 7.5 Queue接口 266 7.5.1 LinkedList实现类 266 7.5.2 PriorityQueue实现类 269 7.6 Map 270 7.6.1 HashMap和Hashtable实现类 271 7.6.2 SortedMap接口和TreeMap实现类 276 7.6.3 WeakHashMap实现类 279 7.6.4 IdentityHashMap实现类 280 7.6.5 EnumMap实现类 281 7.7 HashSet和HashMap的性能选项 282 7.8 操作集合的工具类:Collections 283 7.8.1 排序操作 283 7.8.2 查找,替换操作 287 7.8.3 同步控制 288 7.8.4 设置不可变集合 288 7.9 烦琐的接口:Enumeration 289 7.10 本章小结 290 本章练习 290 第8章 泛型 291 8.1 泛型入门 292 8.1.1 编译时不检查类型的异常 292 8.1.2 手动实现编译时检查类型 293 8.1.3 使用泛型 294 8.2 深入泛型 294 8.2.1 定义泛型接口、类 295 8.2.2 从泛型类派生子类 296 8.2.3 并不存在泛型类 298 8.3 类型通配符 298 8.3.1 使用类型通配符 300 8.3.2 设定类型通配符的上限 300 8.3.3 设定类型形参的上限 302 8.4 泛型方法 303 8.4.1 定义泛型方法 303 8.4.2 泛型方法和类型通配符的区别 306 8.4.3 设定通配符的下限 307 8.4.4 泛型方法与方法重载 309 8.5 擦除和转换 310 8.6 泛型与数组 311 8.7 本章小结 313 第9章 与运行环境交互 314 9.1 与用户互动 315 9.1.1 运行Java程序的参数 315 9.1.2 使用Scanner获取键盘输入 316 9.1.3 使用BufferedReader获取键盘输入 318 9.2 系统相关 319 9.2.1 System类 319 9.2.2 Runtime类 321 9.3 常用类 322 9.3.1 Object类 322 9.3.2 String、StringBuffer和StringBuilder类 322 9.3.3 Math类 327 9.3.4 Random类 328 9.3.5 BigDecimal类 330 9.4 处理日期的类 333 9.4.1 Date类 333 9.4.2 Calendar类 334 9.4.3 TimeZone类 337 9.5 正则表达式 338 9.5.1 创建正则表达式 338 9.5.2 使用正则表达式 341 9.6 程序国际化 345 9.6.1 Java国际化的思路 346 9.6.2 Java支持的语言和国家 346 9.6.3 完成程序国际化 347 9.6.4 使用MessageFormat处理包含占位符的字符串 349 9.6.5 使用类文件代替资源文件 350 9.6.6 使用NumberFormat格式化数字 350 9.6.7 使用DateFormat格式化日期 352 9.7 本章小结 355 本章练习 355 第10章 异常处理 356 10.1 异常概述 357 10.2 异常处理机制 358 10.2.1 使用try...catch捕获异常 359 10.2.2 异常类的继承体系 360 10.2.3 访问异常信息 363 10.2.4 使用finally回收资源 364 10.2.5 异常处理的嵌套 367 10.3 Checked异常和Runtime异常体系 367 10.3.1 使用throws声明抛出异常 367 10.4 使用throw抛出异常 369 10.4.1 抛出异常 369 10.4.2 自定义异常类 371 10.4.3 catch和throw同时使用 371 10.4.4 异常链 373 10.5 Java的异常跟踪栈 374 10.6 异常处理规则 376 10.6.1 不要过度使用异常 377 10.6.2 不要使用过于庞大的try块 378 10.6.3 避免使用Catch All语句 378 10.6.4 不要忽略捕获到的异常 379 10.7 本章小结 379 本章练习 379 第11章 AWT编程 380 11.1 GUI(图形用户界面)和AWT 381 11.2 AWT容器 382 11.3 布局管理器 385 11.3.1 FlowLayout布局管理器 386 11.3.2 BorderLayout布局管理器 387 学生提问:BorderLayout最多只能放置5个组件吗?那它还有什么作用? 388 11.3.3 GridLayout布局管理器 389 11.3.4 GridBagLayout布局管理器 390 11.3.5 CardLayout布局管理器 393 11.3.6 绝对定位 395 11.3.7 BoxLayout布局管理器 396 学生提问:图11.15和图11.16显示的所有按钮都紧挨在一起,如果希望像FlowLayout、GridLayout等布局管理器指定组件的间距该怎么办? 397 11.4 AWT 常用组件 398 11.4.1 基本组件 398 11.4.2 对话框 400 11.5 事件处理 403 11.5.1 Java事件模型的流程 403 11.5.2 事件和事件监听器 405 11.5.3 事件适配器 409 11.5.4 事件监听器的实现形式 411 11.6 AWT的菜单 413 11.6.1 菜单条、菜单和菜单项 414 11.6.2 右键菜单 416 学生提问:为什么即使我没有给多行文本域编写右键菜单,但当我在多行文本域上单击右键时一样会弹出右键菜单? 418 11.7 在AWT中绘图 418 11.7.1 画图的实现原理 418 11.7.2 使用Graphics类 419 11.8 处理位图 425 11.8.1 Image抽象类和BufferedImage实现类 425 11.8.2 使用ImageIO输入/输出位图 427 11.9 剪贴板 432 11.9.1 数据传递的类和接口 432 11.9.2 传递文本 433 11.9.3 使用系统剪贴板传递图像 435 11.9.4 使用本地剪贴板来传递对象引用 439 11.9.5 通过系统剪贴板传递Java对象 442 11.10 本章小结 445 本章练习 445 第12章 Swing编程 446 12.1 Swing概述 447 12.2 Swing基本组件的用法 448 12.2.1 Swing组件层次 448 12.2.2 AWT组件的Swing实现 449 学生提问:为什么单击Swing多行文本域时不是弹出像AWT多行文本域中的右键菜单? 455 12.2.3 使用JToolBar创建工具条 458 12.2.4 使用JColorChooser和JFileChooser 461 12.2.5 使用JOptionPane 469 12.3 Swing中的特殊容器 475 12.3.1 使用JSplitPane 475 12.3.2 使用JTabbedPane 477 12.3.3 使用JLayeredPane、JDesktopPane和JInternalFrame 481 12.4 Swing拖放功能 490 12.4.1 拖放目标 491 12.4.2 拖放源 494 12.4.3 简化的拖放操作 495 12.5 Applet和JApplet 497 12.5.1 Applet简介及其安全性 498 12.5.2 开发Applet类 498 12.5.3 使用HTML页面装载Applet 500 12.5.4 appletviewer简介 502 12.5.5 Applet的生命周期和动画机制 503 学生提问:程序中重写paint方法时绘制了一个字符串,但图12.28上则绘制出了如此之多的字符串,这是为什么呢? 505 12.5.6 使用Applet创建音乐播放器 505 12.6 使用JProgressBar、ProgressMonitor和BoundedRangeModel创建进度条 508 12.6.1 创建进度条 508 12.6.2 创建进度对话框 512 12.7 使用JSlider和BoundedRangeModel创建滑动条 513 12.8 使用JSpinner和SpinnerModel创建微调控制器 517 12.9 使用JList、JComboBox创建列表框 520 12.9.1 简单列表框 520 12.9.2 不强制存储列表项的ListModel和ComboBoxModel 524 12.9.3 强制存储列表项的DefaultListModel和DefaultComboBoxModel 528 学生提问:为什么JComboBox提供了添加、删除列表项目的方法?而JList没有提供添加、删除列表项的方法呢? 530 12.9.4 使用ListCellRenderer改变列表项外观 530 12.10 使用JTree和TreeModel创建树 532 12.10.1 创建树 533 12.10.2 拖动、编辑树节点 536 12.10.3 监听节点事件 540 12.10.4 使用TreeCellRendering改变节点外观 542 12.11 使用JTable和TableModel创建表格 549 12.11.1 创建JTable 549 学生提问:我们指定的表格数据、表格列标题都是Object类型的数组,JTable如何显示这些Object对象?550 12.11.2 TableModel和监听器 555 12.11.3 TableColumnModel和监听器 561 12.11.4 实现排序 564 12.11.5 绘制单元格内容 567 12.11.6 编辑单元格内容 570 12.12 使用JFormattedTextField和JTextPane创建格式文本 576 12.12.1 监听Document的改变 576 12.12.2 使用JPasswordField 578 12.12.3 使用JFormattedTextField 579 12.12.4 使用JEditorPane 588 12.12.5 使用JTextPane 588 12.13 本章小结 595 本章练习 595 第13章 JDBC编程 596 13.1 JDBC基础 597 13.1.1 JDBC简介 597 13.1.2 JDBC驱动程序类型 598 13.2 SQL语法介绍 599 13.2.1 安装数据库 599 13.2.2 关系数据库基本概念和MySQL基本命令 601 13.2.3 SQL语句基础 603 13.2.4 DDL语句 604 13.2.5 DML语句语法 618 13.2.6 select语句和SQL函数 620 13.2.7 分组和组函数 627 13.2.8 多表连接查询和子查询 629 13.3 JDBC的典型用法 635 13.3.1 JDBC常用接口和类简介 635 13.3.2 JDBC编程步骤 637 学生提问:前面给出的仅是MySQL和Oracle两种数据库的驱动,我看不出驱动类字符串有什么规律啊。如果我希望使用其他数据库,我怎么用其他数据库的驱动类呢?637 13.4 执行SQL语句的方式 639 13.4.1 使用executeUpdate执行DDL和DML语句 640 13.4.2 使用execute方法执行SQL语句 642 13.4.3 使用PreparedStatement执行SQL语句 644 13.4.4 使用CallableStatement调用存储过程 650 13.5 管理结果集 652 13.5.1 可滚动、可更新的结果集 652 13.5.2 处理Blob类型数据 654 13.5.3 使用ResultSetMetaData分析结果集 660 13.6 事务处理 663 13.6.1 事务的概念和MySQL事务支持 663 13.6.2 JDBC的事务支持 665 13.6.3 批量更新 667 13.7 分析数据库信息 668 13.7.1 使用DatabaseMetaData分析数据库信息 668 13.7.2 使用系统表分析数据库信息 670 13.7.3 选择合适的分析方式 671 13.8 使用连接池管理连接 671 13.9 本章小结 673 本章练习 673 第14章 Annotation(注释) 674 14.1 基本Annotation 675 14.1.1 限定重写父类方法:@Override 675 14.1.2 标示已过时:@Deprecated 676 14.1.3 抑制编译器警告:@SuppressWarnings 677 14.2 自定义Annotation 677 14.2.1 定义Annotation 677 14.2.2 提取Annotation的信息 679 14.2.3 使用Annotation的例子 680 14.3 JDK的元Annotation 685 14.3.1 使用@Retention 685 14.3.2 使用@Target 686 14.3.3 使用@Documented 686 14.3.4 使用@Inherited 687 14.4 使用APT处理Annotation 688 14.5 本章小结 693 第15章 输入/输出 694 15.1 File类 695 15.1.1 访问文件和目录 695 15.1.2 文件过滤器 697 15.2 理解Java的IO流 698 15.2.1 流的分类 698 15.2.2 流的概念模型 699 15.3 字节流和字符流 700 15.3.1 InputStream和Reader 701 15.3.2 OutputStream和Writer 703 15.4 输入/输出流体系 705 15.4.1 处理流的用法 705 15.4.2 输入/输出流体系 706 15.4.3 转换流 708 学生提问:怎么没有把字符流转换成字节流的转换流呢? 708 15.4.4 推回输入流 710 15.5 重定向标准输入/输出 711 15.6 Java虚拟机读写其他进程的数据 713 15.7 RandomAccessFile 716 15.8 对象序列化 720 15.8.1 序列化的含义和意义 720 15.8.2 使用对象流实现序列化 720 15.8.3 对象引用的序列化 723 15.8.4 自定义序列化 728 15.8.5 另一种自定义序列化机制 733 15.8.6 版本 735 15.9 Java新IO 736 15.9.1 Java新IO概述 736 15.9.2 使用Buffer 737 15.9.3 使用Channel 740 15.9.4 编码集和Charset 743 15.9.5 文件锁 745 15.10 本章小结 747 本章练习 747 第16章 多线程 748 16.1 线程概述 749 16.1.1 线程和进程 749 16.1.2 多线程的优势 750 16.2 线程的创建和启动 750 16.2.1 继承Thread类创建线程类 751 16.2.2 实现Runnable接口创建线程类 752 16.2.3 两种方式所创建线程的对比 754 16.3 线程的生命周期 754 16.3.1 新建和就绪状态 754 16.3.2 运行和阻塞状态 756 16.3.3 线程死亡 757 16.4 控制线程 758 16.4.1 join线程 758 16.4.2 后台线程 759 16.4.3 线程睡眠:sleep 760 16.4.4 线程让步:yield 761 16.4.5 改变线程优先级 762 16.5 线程的同步 764 16.5.1 线程安全问题 764 16.5.2 同步代码块 766 16.5.3 同步方法 767 16.5.4 释放同步监视器的锁定 770 16.5.5 同步锁(Lock) 770 16.5.6 死锁 772 16.6 线程通信 774 16.6.1 线程的协调运行 774 16.6.2 使用条件变量控制协调 778 16.6.3 使用管道流 780 16.7 线程组和未处理的异常 782 16.8 Callable和Future 785 16.9 线程池 787 16.10 线程相关类 789 16.10.1 ThreadLocal类 789 16.10.2 包装线程不安全的集合 791 16.10.3 线程安全的集合类 792 16.11 本章小结 792 第17章 网络编程 793 17.1 网络编程的基础知识 794 17.1.1 网络基础知识 794 17.1.2 IP地址和端口号 795 17.2 Java的基本网络支持 796 17.2.1 使用InetAddress 796 17.2.2 使用URLDecoder和URLEncoder 797 17.2.3 使用URL和URLConnection 798 17.3 基于TCP协议的网络编程 806 17.3.1 TCP协议基础 806 17.3.2 使用ServletSocket创建TCP服务器端 807 17.3.3 使用Socket进行通信 807 17.3.4 加入多线程 810 17.3.5 记录用户信息 813 17.3.6 使用NIO实现非阻塞Socket通信 823 17.4 基于UDP协议的网络编程 829 17.4.1 UDP协议基础 829 17.4.2 使用DatagramSocket发送、接收数据 829 17.4.3 使用MulticastSocket实现多点广播 834 17.5 使用代理服务器 845 17.5.1 直接使用Proxy创建连接 845 17.5.2 使用ProxySelector选择代理服务器 847 17.6 本章小结 849 本章练习 849 第18章 类加载和反射 850 18.1 类的加载、连接和初始化 851 18.1.1 JVM和类 851 18.1.2 类的加载 852 18.1.3 类的连接 853 18.1.4 类的初始化 853 18.1.5 类初始化的时机 854 18.2 类加载器 855 18.2.1 类加载器简介 856 18.2.2 类加载机制 857 18.2.3 创建并使用自定义的类加载器 858 18.2.4 URLClassLoader类 862 18.3 通过反射查看类信息 863 18.3.1 获得Class对象 863 18.3.2 从Class中获取信息 864 18.4 使用反射生成并操作对象 868 18.4.1 创建对象 868 18.4.2 调用方法 870 18.4.3 访问属性值 873 18.4.4 操作数组 874 18.5 使用反射生成JDK动态代理 875 18.5.1 使用Proxy和InvocationHandler创建动态代理 876 18.5.2 动态代理和AOP 878 18.6 反射和泛型 882 18.6.1 泛型和Class类 882 18.6.2 使用反射来获取泛型信息 884 18.7 本章小结 885 本章练习 886
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值