Java面向对象程序设计课件_第1页
Java面向对象程序设计课件_第2页
Java面向对象程序设计课件_第3页
Java面向对象程序设计课件_第4页
Java面向对象程序设计课件_第5页
已阅读5页,还剩402页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

面向对象概述1.1面向过程与面向对象的

方法论比较2023/11/223系统建模方法软件危机与系统建模方法的发展两种流行的建模方法:面向过程建模方法面向对象建模方法2023/11/224面向过程的建模方法和建模语言始于20世纪70年代的结构化分析设计(StructuredAnalysisandDesign,SAD)方法。把一个系统看作是功能的集合,可以进行分解。用数据流图设计系统的模块结构。IDEF(ICAMDEFinitionmethod)图形化建模语言是面向过程建模技术的代表。2023/11/225IDEF的基本表示法盒子代表活动,连到盒子上的箭头表示由活动产生的、或活动所需要的信息或真实对象。盒子左边及上方进入的箭头表示为完成此活动所需要的数据,控制说明了控制变换的条件或环境,或者说是约束;右边离开盒子的箭头表示执行活动时产生的数据;下方的箭头作为执行的机制,可以是执行活动的人或设备。箭头限制了盒子间的关系,而不是表示活动的顺序。2023/11/226面向对象的建模方法与建模语言发源于20世纪60年代,Simula语言中引入了类(Class)的概念;但真正的面向对象程序设计是Smalltalk语言奠定基础的,“面向对象”一词也是Smalltalk首先采用的;C++的问世促进面向对象技术的发展,也使之成为标准化的面向对象程序设计语言。20世纪90年代初,Booch、Jocobson、Rumbaugh一起开发了统一建模语言(UnifiedModelingLanguage,UML)。UML可以用于确定、展示和记录软件系统,UML中的图形标记尤其适用于面向对象的软件设计。2023/11/227UML的基本表示法UML有一套复杂的标记法,这里只给出对类的基本表示,就是在一个矩形框中可以详细描述类(抽象类、接口、对象实例等)的名称、属性和操作。2023/11/228面向过程程序设计方法从程序设计范型(Paradigm,指设计程序的规范、模型和风格)看:

程序=过程(定义)+(过程)调用。从程序语言角度出发,依靠各种循环、函数调用、参数传递维护程序。重视程序流程,不在乎数据的传递方式,只要程序能运行就可以了。2023/11/229面向过程程序设计方法的缺点子程序(过程)的抽象级别(函数)太低,难以重用。需要花相当多的成本维护程序与程序之间的关联性。数据和操作相分离,当一个或多个数据的结构发生了变化,这种变化将波及程序的很多部分甚至遍及整个程序,往往变量和参数传来传去,传到最后根本就不知道这个变量的作用何在,故程序的复杂性很难控制。已不适宜描述复杂的数据对象。2023/11/2210面向对象软件开发方法面向对象程序的基本元素为对象(Object)。程序结构一般由类的定义和类的使用两部分组成。程序中的一切操作都是通过向对象发送相应的消息来实现:对象接收到消息后,启动有关的方法完成相应的操作。从面向对象程序设计范型看:

程序=对象+消息。2023/11/2211面向对象技术的优点直观性可增加程序的模块性(Modularity)可提高程序的可复用性(Reusability)增加可扩展性(Extendibility)可改善程序的可维护性(Maintainability),减少维护负荷可控制程序的复杂性可改进质量,降低成本2023/11/2212面向对象技术的缺点与困难面向对象需要完全改变每个人的思想以及开发文化面向对象不仅仅是编程面向对象需要更关注于需求、分析和设计开发人员必须和用户紧密合作面向对象的许多优点要经过较长的时间才能显示出来面向对象技术不能保证你能构建出正确的系统2023/11/2213讨论面向过程方法的优势面向对象方法的优势结合面向过程与面向对象方法的应用优势历史反思1.2面向对象技术的基本原则2023/11/2215OO(ObjectOrientation)四原则抽象(Abstraction)封装(Encapsulation)模块化(Modularity)分层(Hierarchy)2023/11/2216问题域的合理抽象实体抽象一个对象表示一个问题域的实体的有用模型。动作抽象一个对象提供一个通用化的操作集,它们的执行是相似或有关联的功能。子系统抽象一个对象是一组对象和操作的集合,它们是一个大系统的特定组成部分。对象设计成败的关键就是抽象类型必须符合人们对该客观事物的认识习惯,这就要求设计人员对问题域应该有深入的理解,并且具有较强的综合分析能力,而达到这一步往往是有难度的。1.3面向对象技术的基本要素2023/11/2218写字课老师:强调“飞凤家”

——遥远的记忆,仍耳熟能详…面向对象老师:强调“PIE”

——多态(Polymorphism)

——继承(Inheritance)

——封装(Encapsulation)

“写好飞凤家”对于学习面向对象的启示

2023/11/2219封装性外界要改变一个对象的状态,也就是对它所包含的数据进行操作,只能向该对象发出请求消息,然后由该对象的对应方法来改变其自身的状态。是一种典型的“黑箱”机制。有利于代码复用和信息隐藏。2023/11/2220信息隐藏(Informationhiding)如果一个类想获取另一个类的信息,必须先征得同意,而不是直接拿来就用;意味着类模块中除了向外界提供的接口以外,还有大量不为外界所知的用以支持这些接口实现的属性和方法。2023/11/2221继承性继承是在类、子类以及对象之间自动地共享属性和方法的一种机制。继承具有传递性,即如果有类C继承B,B(间接)继承A,则C(间接)继承A。一个类实际上继承了层次结构中在其上面的所有类的全部描述。2023/11/2222继承性保证类可合理层次化2023/11/2223多态性同一个方法名的操作不仅仅定义一种行为,因此有比较强的表达能力和更多的用途。多态形式:

参数多态(即重载,Overload)

包含多态(即覆盖,Override)多态为描述客观事物提供了极大的能动性。2023/11/2224不同人对play()请求的响应2023/11/2225面向对象概念和术语abstractclass(抽象类)对象不能从中实例化的类abstraction(抽象)某项目(如类或操作)的基本特征aggregation(聚合)表示两个类或组件之间是“ispartof”关系aggregationhierarchy(聚合层次)通过聚合联系的一组类association(关联)对象和其它对象发生联系attribute(属性)类知道的东西(数据/信息)cardinality(基数)表示概念“多少”?class(类)相似对象的软件抽象,创建对象的模板cohesion(内聚)封装单元(例如组件或类)的相关程度collaboration(协作)类协作来完成它们的职责2023/11/2226面向对象概念和术语(续)component(组件)可以独立开发、分发以及与其它组件一起构建较大单元的内聚功能单元composition(组合)更强类型的聚合,其中“整体”完全负责它的各组成部分,每“部分”对象仅和一个“整体”对象相联系concreteclass(具体类)可以进行对象实例化的类coupling(耦合)两个项目的依赖程度encapsulation(封装)把相关的概念(例如类或组件)归组到一个项目informationhiding(信息隐藏)限制外部对属性的访问inheritance(继承)表示“isa”、“islike”或“iskindof”关系inheritancehierarchy(继承层次)通过继承相联系的一组类instance(实例)对象是类的一个实例2023/11/2227面向对象概念和术语(续)instantiate(实例化)从类中实例化对象interface(接口)定义内聚行为集的一个或多个操作特征标记的集合message(消息)消息是信息请求或执行一个动作的请求messaging(消息传递)为了协作,类互相发送与接收消息method(方法)类完成的事情(与结构化编程中的函数相似)multipleinheritance(多重继承)类直接从一个以上的类继承object(对象)一个人、地址、物品、事件、概念、屏幕显示或者报表objectspace(对象空间)主存,加上网络上所有可供使用的存储空间optionality(可选性)表示概念“你想要吗?”override(覆盖)有时在子类中你需要覆盖(重定义)属性与方法2023/11/2228面向对象概念和术语(续)pattern(模式)考虑到相关因素时通用问题的可复用方案persistence(持久性)对象怎样永久被保存的问题persistentobject(持久对象)一个保存到永久存储的对象polymorphism(多态)以不同方式响应同一消息的不同对象,使对象可以不必知道相互的类型而交互singleinheritance(单一继承)一个类直接从唯一一个类继承stereotype(原型)表示一种建模元素的通用用法subclass(子类)如果类B继承自类A,我们说B是A的子类superclass(父类)如果类B继承自类A,我们说A是B的父类transitoryobject(临时对象)一个没有被保存到永久存储的对象1.4面向对象的软件开发体系2023/11/2230面向对象框架下软件开发的生命周期

2023/11/2231OO框架下软件项目开发的一般过程

业务模型需求模型分析模型设计模型实现模型测试模型关键UML元素业务流程(用例)、业务域对象系统、角色、用例、交互业务包/类/对象/消息软硬件配置、包/类/对象/消息组件、节点、编码测试计划和测试案例关键问题业务建模系统黑箱建模不含实现细节的问题域业务元素建模面向特定实现(如软硬件配置)分析图及其说明书更改分布式环境物理元素建模以及按需求编码单元(类/操作)测试、集成系统测试目标(元素之间的低耦合高聚合)足够的业务或企业信息足够的用例/方案信息以及递增/迭代计划满足需求的最简单业务/问题域模型支持最大编码或手工编码的足够信息优化组件框架(网络性能等)足够的测试内容静态结构图业务域对象角色方框图及用例图包/类图包/类图组件与配置图,逆向类图-2023/11/2232OO框架下软件项目开发的一般过程(续)业务模型需求模型分析模型设计模型实现模型测试模型动态时基图业务流程(用例)用例图、各用例方案的顺序图、活动图各用例方案的顺序图,状态基类型的状态图及复杂操作的活动图各用例方案的顺序图,状态基类型的状态图及复杂操作的活动图选择性更改显示分布信息的顺序图-关键团队成员业务分析师业务分析师业务分析师开发工程师架构师,开发工程师开发工程师,测试工程师模型确认项目经理、架构师、客户项目经理、架构师、客户项目经理、架构师、客户项目经理、架构师项目经理、架构师项目经理、架构师、客户2.1Java语言的特点2023/11/226:4034Java的由来1991年初,SunMicrosystems公司设立一项较大规模“消费者电子产品先进软件发展项目”,该项目是为了发展小型、可靠、可移植、分布式、实时的嵌入式系统。

项目小组开发了一种与平台无关的新语言,命名为“Oak”。其灵感来源于项目主持人JamesGosling办公室外的一棵橡树(Oak),它就是Java语言的前身。

但因Oak名称与其它产品雷同,最后将开发的新语言取名为“Java”。据说是项目小组成员经常在公司附近一家咖啡厅喝咖啡,因此把咖啡原产地Java作为新语言的名称。1995年,SunMicrosystems公司正式发布Java产品。

2023/11/226:4035与Java有关的一些图片Java的标识Java的吉祥物DukeJava之父JamesGosling2023/11/226:4036Java语言的特点

在Java语言白皮书中,Java被描述为“是一种简单、面向对象、分布式、解释、健壮、安全、结构中立、可移植、高效能、多线程、动态的语言。Asimple,object-oriented,network-savvy,interpreted,robust,secure,architectureneutral,portable,high-performance,multithreaded,dynamiclanguage。

—JamesGosling,HenryMcGilton.TheJava™LanguageEnvironment,AWhitePaper.

2023/11/226:4037简单的面向对象程序设计语言

“爪哇”——Java总给人以小巧玲珑

和C++很相近,但删除许多极少被使用、不容易理解和令人混淆的C++功能,主要包括运算符重载、多重继承以及广泛的自动强迫同型。

自动垃圾收集(Automaticgarbagecollection)功能,这不仅简化了Java程序的内存分配与释放工作,而且能大幅度减少程序中的漏洞。

Java程序非常小,对于在嵌入式的系统中使用是很重要的,同时也可以通过网络轻易下载。

2023/11/226:4038健壮安全的分布式语言

Java拥有广泛的能轻易处理TCP/IP协议(如HTTP与FTP等)的类库,更容易创建网络连接。

除了运行时异常检查外,Java提供了广泛的编译时异常检查,以便尽早的发现可能存在的错误。同时,在Java中对象的创建机制(只能用new操作符)和自动垃圾收集机制大大减少了因内存管理不当引发的错误。

Java的验证技术是以公钥加密算法为基础。

2023/11/226:4039结构中立、可移植性强的解释型语言

为了让Java应用程序能够在网络上任何地方执行,其编译器会产出一种结构中立的字节代码(Bytecode)。字节代码可以在提供Java运行时系统的多种不同处理器上面执行。

Java严格定义了基本数据类型的大小和算术运算符的行为,因此不存在软硬件平台不兼容的情况。

Java系统本身具备相当好的移植性。它的编译器用Java写成,而Java运行时程序则是参照POSIX(一个可移植接口工业标准)规格使用ANSIC写成的。

2023/11/226:4040高效能

字节代码可以动态地为执行应用程序的特定CPU解释成机器码。字节代码格式在设计上即顾及机器码的产生,因此实际的机器码产生程序相当简单。

解释器运行时不需检查运行环境,自动垃圾收集器设为优先级最低后台线程,以保证内存得到更有效的应用。

对于运算量很大的程序可以采用原生代码编写,再经由Java平台转换。Just-In-Time编译技术更是让字节代码的执行速度大幅度提升。

2023/11/226:4041支持多线程的动态语言

在Java核心类库中包含Thread类,同时Java运行时系统提供了线程监视器和同步锁定机制。多线程的其它优点包括更好的交互式回应能力与实时执行行为。

Java是一种比C或C++更具动态特性的语言。它在设计上强调为进化中的运算环境提供支援。甚至可以在不中断网络服务的情况下替换相关的组件。

2023/11/226:4042Java与几种常用语言的比较

2.2Java执行环境2023/11/226:4044Java执行环境

2023/11/226:4045Java虚拟机(JVM)执行引擎负责把字节代码导入虚拟机;内存管理

负责分配内存给对象和数组,并进行垃圾收集;错误和异常管理

负责异常的捕获或抛出;线程接口

负责对线程的支持;对原生方法(NativeMethod)的支持

支持调用C/C++等语言编写的方法。

2023/11/226:4046什么是JVM?Java虚拟机(JavaVirtualMachine,JVM)实际上是一个类似于真实计算机系统的抽象机(AbstractComputingMachine),它拥有一组指令集,用来解释“.class”字节代码;也就是说,JVM并不认识所谓的Java语言,而仅仅能够读懂class文件中有限的指令、符号及其它一些辅助信息。2023/11/226:4047JVM类似于数控机床的数控系统数控机床数控机床抽象数控机床可以加工各种形状的物体原因在于它拥有一个可以能读懂指令的核心系统MachineVirtualMachine2023/11/226:4048解释产品(问题域)编程人员是熟悉的!但数控系统(JVM)是不认识的!!编程人员根据自己的想法,在相应的平台上编写出符合产品形状要求的程序(.java)2023/11/226:4049解释这是程序员可以理解的程序(.java),因其是接近自然语言的。但对数控系统(JVM)来说太复杂,它是读不懂的!2023/11/226:4050解释于是程序员利用相应的平台把它编译成数控系统(JVM)可以理解的程序(.class)于是数控机床(JVM)动起来啦!产品也做出来啦!可是最终数控机床(JVM)也没有明白它做出的产品是什么,只知道走了许许多多的直线或圆弧(JVM指令集)!2023/11/226:4051演示虚拟的真实的2023/11/226:4052JREJVM协同类加载器、字节代码校验器和Java类库一起,组成了整个Java运行环境JRE。

一次编写随处运行

(WriteOnceRunAnywhere,WORA)2023/11/226:4053保护域机制与沙箱模型

保护域(Protectiondomain)是有关系统安全的基本概念和重要模块。域界定了作为主体的系统实体对各种对象集直接访问的被许可程度。保护域概念提供一种在受保护单元中分组和隔离不安全因素的便利机制。

2023/11/226:4054类加载器——启动引擎的点火器

加载当JVM加载类时,它寻找类或接口的二进制表示,并从这个二进制表示(通常是Java编译器生成的类文件)生成Class对象。Class对象封装类或接口的运行时状态。链接链接是取得加载的类或接口,并将其与JVM运行时环境结合起来,以准备执行的过程。初始化初始化在JVM调用类或接口初始化方法时发生。2023/11/226:4055类加载器——启动引擎的点火器JVM在启动独立Java应用程序时的第一步是生成初始Class对象,表示包含publicstaticvoidmain(String[]args)方法的Java的类。JVM链接与初始化这个类并调用main()方法。这个方法推动所需要的其他类和接口的加载、链接与初始化。

2.3JDK的组成与安装设置2023/11/226:4057Java平台的组成结构

2023/11/226:4058JDK版本主要特点

2023/11/226:4059SETPATH的作用SETPATH=c:\j2sdk1.4.0\bin含义是告诉操作系统到哪里可以找到Java的编译器等可执行文件的位置。2023/11/226:4060SETCLASSPATH的作用SETCLASSPATH=.;c:\j2sdk1.4.0\lib\tools.jar含义是告诉操作系统到哪里可以找到编译或解释运行时所需字节代码的位置。2023/11/226:4061在运行环境中的设置方法如果系统平台为Windows9X,则把以上的设置内容加入系统根目录下的autoexec.bat文件中;如果系统平台为WindowsNT、Windows2000及以后版本,则把以上的设置内容加入【控制面板】|【系统】|【高级】|【环境变量】中。2.4典型例子及常见问题2023/11/226:4063演示编译器javac的使用解释器java的使用小程序观察器appletviewer的使用反编译器javap的使用2023/11/226:4064应用程序编程举例//:HelloWorld.java//packageg3ds.joop.ch2;publicclassHelloWorld{//anapplication publicstaticvoidmain(String[]args){ System.out.println("HelloWorld!"); }}程序保存为HelloWorld.java编译时执行javacHelloWorld.java

得到字节代码HelloWorld.class。运行时执行javaHelloWorld

2023/11/226:4065小程序编程举例//:HelloWorldApplet.java//packageg3ds.joop.ch2;importjava.awt.Graphics;importjavax.swing.JApplet;publicclassHelloWorldAppletextendsJApplet{//anapplet publicvoidpaint(Graphicsg){ g.drawString("HelloWorld!",150,50);}}<HTML><!--HelloWorldShow.html--><APPLETCODE="HelloWorldApplet.class"WIDTH=300HEIGHT=100></APPLET></HTML>保存为HelloWorldShow.html或HelloWorldShow.htmappletviewerHelloWorldShow.html

进一步讨论2023/11/226:4067反编译程序样式javap–cHelloWorld

则可以获得字节码的助记符版本:CompiledfromHelloWorld.javapublicclassHelloWorldextendsjava.lang.Object{publicHelloWorld();publicstaticvoidmain(java.lang.String[]);}MethodHelloWorld()0aload_01invokespecial#1<Methodjava.lang.Object()>4returnMethodvoidmain(java.lang.String[])0getstatic#2<Fieldjava.io.PrintStreamout>3ldc#3<String"HelloWorld!">5invokevirtual#4<Methodvoidprintln(java.lang.String)>8return2023/11/226:4068哪些类被加载了2023/11/226:4069使用Java的一些注意事项Java中规定,在一个.java的源文件中最多只能有一个(另一个意思是可以没有)publicclass。当这个publicclass存在时,要求该类名必须与.Java源文件的名字一致。如果你想编写一个应用程序(通常被声明为publicclass),在这一个类中必须定义一个publicstaticvoidmain(String[]agrs)方法,在这个方法中,除了变量名agrs可以改变,其它内容均不可改变,甚至排放的顺序都是几乎不可改变的。2023/11/226:4070应用程序的主方法JVM解释应用程序需要一个程序执行入口,也就是程序中逻辑运行的启动模块,或者称为应用程序的驱动器,这就是对应类中的main方法,它的声明publicstaticvoidmain(String[]agrs)也叫main方法的标志性签名。JVM解释某个应用程序时,就会首先查找对应类的这个main方法,当无法匹配时就引发如上述的异常报告:

Exceptioninthread"main"java.lang.NoSuchMethodError:main

2023/11/226:4071小程序的生命周期

3.1类型、值与基本变量2023/11/2273基本概念:字符集

ASCII(AmericanStandardCodeforInformationInterchange)字符集:使用7位代码表示大小写字母、数字0~9以及若干控制字符,如NUL和EOT。ISO8859-1Latin-1字符集:在西欧,用户希望字符集能够表示他们本国字符集的所有字符,ASCII字符集因而被扩展到8位,即增加了128个字符,用于表示英文中不存在的各种西欧语言的字符。Unicode字符集:是ISO标准16位字符集,支持65536个不同的字符。其中大约有21000个字符专门用于中文、日文和韩文的表意文字。ASCII、ISOLatin-1都是Unicode的子集。Java内部使用2个字节表示每个字符,采用Unicode编码。2023/11/2274基本概念:关键字、值、标识符关键字(Keyword):也称保留字(Reservedword),全部由小写的英文字母所组成。关键字总共有50多个,其中一些留作将来供语言设计者扩充语言功能时使用。值(Literal):是指不能由程序员规定的代表某一特定常量或数字的可知的或未知的字母或符号,一般译作“直接量”或“字面值”,实际上泛指赋给各种不同类型(常指基本类型、字符串类型、空类型等)的有效值。本书将它简称为“值”,而另一个单词“Value”则称为“数值”。标识符(Identifier):是程序员提供的名字,在Java中,标识符的长度不受限制,但必须以字母、下划线或$符号开始,随后位置也可以包含数字。Java标识符支持几万个Unicode字母中所包含的世界上任何重要语言中的任何字母。举例:IdentifierTest.java

2023/11/2275Java关键字abstractdefaultifprivatethisbooleandoimplementsprotectedthrowbreakdoubleimportpublicthrowsbyteelseinstanceofreturntransientcaseextendsintshorttrycatchfinalinterfacestaticvoidcharfinallylongstrictfpvolatileclassfloatnativesuperwhileconstfornewswitchcontinuegotopackagesynchronizedconst和goto是保留字true,false和null为相应类型的值,不属于关键字2023/11/2276强类型语言

(Stronglytypedlanguage)Java属于强类型的程序设计语言。所有变量和表达式在编译时都有明确的类型,它有助于编译时的错误检测:类型限制了一个变量能够拥有的或者一个表达式能够生成的值;类型还限制了各种操作对这些值的支持程度以及决定操作的含义。2023/11/2277Java语言的类型结构Java类型基本类型引用类型数值类型布尔类型整型浮点型类/接口类型数组类型byteshortintlongcharbooleanfloatclassdoubleinterfaceType[](空类型)(null)2023/11/2278基本类型

(PrimitiveType)boolean用于逻辑运算。int、long、byte和short用于整数算术运算。char主要用于输入输出。double和float用于实数(即浮点数)的算术运算。整型数值缺省为int型,long型在数值之后加l或L浮点型数值缺省为double型,float型在数值之后加f或F2023/11/2279基本类型的特点基本类型在所有的平台和实现中的定义相同,类型名称属于Java保留的关键字。基本类型的值不允许共享,任何一个基本类型的变量都会独自拥有一份相同类型的值。基本类型的变量的值只能通过赋值操作才能被改变。2023/11/2280基本类型的值(1)类型位数取值范围byte8bits–128~127short16bits–32768~32767int32bits–2147483648~2147483647long64bits–9223372036854775808~9223372036854775807char16bits'\u0000'~'\uffff'(0~65535)2023/11/2281基本类型的值(2)类型位数取值范围float32bits–3.40282347e+38f~–1.40239846e-45f0.0f1.40239846e-45f~3.40282347e+38fdouble64bits–1.79769313486231570e+308~

–4.94065645841246544e-3240.04.94065645841246544e-324~1.79769313486231570e+3082023/11/2282基本类型的值(3)类型位数取值范围boolean1bittrue/false转义字符Unicode字符含义\b\u0008backspaceBS(退格)\t\u0009horizontaltabHT(Tab键)\n\u000alinefeedLF(换行)\f\u000cformfeedFF(换页)\r\u000dcarriagereturnCR(回车)\"\u0022"(doublequote,双引号)\'\u0027'(singlequote,单引号)\\\u005c\(backslash,反斜杠)2023/11/2283举例整数值的不同进制表示:NumeralExpression.java字符的表达方式:CharacterExpression.java浮点数运算:FloatingTest.java数值类型的取值范围:ValueScope.java2023/11/2284引用类型类类型(Classtype)接口类型(Interfacetype)数组类型(Arraytype)2023/11/2285类类型使用关键字“class”,它定义了一个新的引用类型,并描述这一类型的具体实现。Java语言定义的根类(Rootclass)是Object类,也就是说除了Object类以外,其它类都是Object类的直接或间接子类(Subclass),这些类只能扩展(使用关键字“extends”

)自唯一一个业已存在的类。Object类是缺省的继承父类,如果有一个类直接继承自Object类,“extendsObject”可以省略不写。2023/11/2286类体的结构组成类的成员类型:类成员(使用关键字static)和实例成员(无关键字static)形式:域(Field;也习惯地叫属性,Attribute)、方法(Method)、内嵌类(Nestedclass)和内嵌接口(Nestedinterface)实例初始化或者类初始化的语句块(Block)实例对象构造器(Constructor,也称构造方法)举例:ClassExample.java2023/11/2287接口类型使用关键字“interface”,定义一套必须由类或组件实现的操作特征标记。一般有一个或多个操作特征标记以及零个或多个属性集合的定义。标识接口(Taginterface):不包含任何成员的接口类型,如java.io.Serializable、java.lang.Cloneable通过类来实现,使用关键字“implements”,多个接口类型之间用“,”隔开。类必须包括接口中定义的方法。接口可以进行多继承,也使用关键字“extends”

。接口类型中不存在被其它所有接口类型继承的根接口类型。2023/11/2288接口体的结构与特点包含与该接口有关的成员,这些成员可以是内嵌类、内嵌接口、常量或抽象方法。所有接口的成员都被隐式声明为“public”;所有的内嵌类或接口都被隐式声明为“static”;所有的成员属性都被隐式声明为“static”和“final”,亦即所有的成员属性都是常量;所有的成员方法都被隐式声明为“abstract”,亦即所有的成员方法都不包含任何具体的实现,但成员方法不能被声明为“static”,因为静态方法不能是抽象的。举例:InterfaceExample.java

2023/11/2289数组类型一个数组对象包含一定数量的数组变量,称为数组的组件或元素。数组元素通过一个非负的整型索引数值被引用。如果数组中包含有n个元素,则数组元素的索引值分别为0~(n-1)。数组元素的个数可以为零,这时该数组被称为empty(空)数组。数组元素的类型可以是基本类型,也可以是其它的引用类型,一个数组中的所有元素的类型都是一样的。2023/11/2290数组表示法Java语言中正式使用的表示法是,假如数组元素的类型表示为Type,则数组表示为Type[]x。如int[]x,读作int数组x。另一种表示法是提供给那些有C/C++编程经验的人们使用的,将方括号移到变量名称的后面,即Typex[],如intx[]。2023/11/2291数组的一些特点Java语言中没有直接的多维数组定义,而是把多维数组的实现理解为数组的数组。Java语言中,多维数组中每维数组的长度可以不同,数组空间也不一定是连续分配的。数组的直接超类是Object类,因此可以调用Object类中的所有方法。每个数组类型都已经实现了java.io.Serializable和java.lang.Cloneable接口,也就是可以对数组对象直接进行串行化处理和对象复制,但对于多维数组也是只能实现单层复制。数组中元素的个数可通过数组属性length进行访问。举例:ArrayExample.java2023/11/2292基本类型的包装类包装类对应的基本类型字符串转换成数值数值转换成字符串包装类中定义的常量Bytebyteb=Byte.parseByte(s)b=newByte(s).byteValue()s=String.valueOf(b)TYPE,MAX_VALUE,MIN_VALUEShortshortsh=Short.parseShort(s)sh=newShort(s).shortValue()s=String.valueOf(sh)TYPE,MAX_VALUE,MIN_VALUECharacterchars=String.valueOf(c)TYPE,MAX_VALUE,MIN_VALUEIntegerintn=Interger.parseInt(s)n=newInteger(s).intValue()s=String.valueOf(n)TYPE,MAX_VALUE,MIN_VALUELonglongg=Long.parseLong(s)g=newLong(s).longValue()s=String.valueOf(g)TYPE,MAX_VALUE,MIN_VALUEFloatfloatf=Float.parseFloat(s)f=newFloat(s).floatValue()s=String.valueOf(f)TYPE,MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITYDoubledoubled=Double.parseDouble(s)d=newDouble(s).doubleValue()s=String.valueOf(d)TYPE,MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITYBooleanbooleanb=newBoolean(s).booleanValue()s=String.valueOf(b)TYPE,FALSE,TRUE2023/11/2293与字符串相关的封装类String和StringBuffer类分别用于处理不变字符串(常量)和可变字符串。Java语言中还提供了一种快速创建String对象的方式,非常像基本类型的赋值方式:

Stringstr=”Iamastringconstant.”

String被设计为存储字符串常量的类,这种实例化形式在大多数情况下是更好的String构造技术,这与所创建的字符串存储在字符串常量池使其可被共享有关。字符串常量池的工作机制是,当需要某一个字符串时,先到池里查找,如果已经存在,则直接引用;如果还没有就在池中创建一个新的字符串对象。也可以说,字符串常量池中内容相同的String对象只有一个,该对象直到JVM退出时才被清除。举例:StringExample.java2023/11/2294类型转换类型转换方式分为窄化(Narrowing)和拓宽(Widening)转换。编译时可以自动执行拓宽转换(称为Promotion,提升)。而窄化转换则总是要求显式执行强制转换(称为Cast,转型)。2023/11/2295基本类型的拓宽转换原则如果存在一个double型,则按double型执行运算。否则,如果存在一个float型,则按float型执行运算。否则,如果存在一个long型,则按long型执行运算。否则,按照32位的int型计算精度执行运算。当在整型与浮点型之间进行转换时,计算精度不仅仅是数据类型的取值范围问题,它还包括浮点能够存储的十进制数的位数。举例:PrimitiveWidening.java2023/11/2296基本类型的窄化转换窄化转换意味着余数转换,这种从一个大容量的数据类型到另一个小容量的数据类型的赋值只会取其较小的数值范围,这可能造成数量级的损失。如果需要把一个范围较大的整型数值赋给一个范围较小的数据类型的变量,原则上都需要对数值执行强制转换。对于byte、short、char类型的变量,在相应类型的取值范围内时,允许不需要显式强制类型转换而直接赋给int型数值,因为这样做并不会引起数据丢失;当所赋数值不在其取值范围内时,则必须显式进行类型强制转换,否则将出现错误而不是警告。如果把浮点型数值转换成整型数值,小数点后面的数值将被圆整去掉。举例:PrimitiveNarrowing.java

2023/11/2297引用类型的转换从子类型转换为父类型即属于引用类型的拓宽转换,特别是从任何引用类型(包括类、接口、数组)转换成Java的根类Object都属于此种转换形式。引用类型的拓宽转换可以自动进行,不会引发任何异常。引用类型的窄化转换指的是从父类型转换为子类型,特别是从Object类转换成其它任何引用类型都属于这种转换形式。引用类型的窄化转换同样需要强制进行,即所谓的转型,这种转换的使用十分广泛,它体现了面向对象的多态性。转型将在运行时进行类型匹配检查,如果类型不匹配将引发异常ClassCastException。举例:ReferenceConversion.java2023/11/2298类型转换讨论自动转换——

不要以为扩大取值范围就万无一失浮点型的有效位问题引用型的属性问题强制转换3.2运算符和表达式2023/11/22100Java语言中的算术运算符与表达式操作数数目运算符表达式描述一元++op正值--op负值++++op,op++自增1----op,op--自减1二元+op1+op2加-op1-op2减*op1*op2乘/op1/op2除%op1%op2取模(求余)2023/11/22101Java语言中的关系运算符与表达式运算符表达式返回true的情况>op1>op2op1大于op2>=op1>=op2op1大于或等于op2<op1<op2op1小于op2<=op1<=op2op1小于或等于op2==op1==op2op1与op2相等!=op1!=op2op1与op2不等2023/11/22102Java语言中的逻辑运算符与表达式操作数取值表达式运算结果op1op2op1&&op2op1||op2!op1falsefalsefalsefalsetruefalsetruefalsetruetruetruefalsefalsetruefalsetruetruetruetruefalse2023/11/22103Java语言中的位运算符与表达式运算符表达式描述&op1&op2二元运算,逻辑与,参与运算的两个操作数,如果两个相应位都为1(或true),则该位的结果为1(或true),否则为0(false)。|op1|op2二元运算,逻辑或,参与运算的两个操作数,如果两个相应位有一个为1(或true),则该位的结果为1(或true),否则为0(false)。^op1^op2二元运算,逻辑异或,参与运算的两个操作数,如果两个相应位值相反,则该位的结果为1(或true),否则为0(false)。~~op1一元运算,对数据的每个二进制位按位取反。<<op1<<op2二元运算,操作数op1按位左移op2位,每左移一位,其数值加倍。>>op1>>op2二元运算,操作数op1按位右移op2位,每右移一位,其数值减半。>>>op1>>>op2二元运算,操作数op1按位右移op2位,正整数运算与>>同,负整数则求该数的反码,但符号位不变。举例:BitOperand.java2023/11/22104其它运算符条件运算符:三元运算符,其表达式为

someCondition?tureExpression:falseExpression赋值运算符与表达式:=、+=、-=、*=、/=、%=、<<=、>>=、>>>=、&=、|=、^=

instanceof运算符2023/11/22105Java语言运算符优先级以及

同等优先级运算符的组合顺序运算符描述优先级(数越大优先级越高)同等优先级结合顺序()圆括号15左→右new创建类实例15左→右[]数组下标运算符15左→右.成员(属性、方法)选择15左→右++、--后缀自增(自减)114右→左++、--前缀自增(自减)113右→左~按位取反13右→左!逻辑非13右→左-、+算术负(正)号13右→左(Type)强制类型转换13右→左*、/、%乘、除、取模运算12左→右+、-加、减运算11左→右<<、>>、>>>左右移位运算10左→右2023/11/22106Java语言运算符优先级以及

同等优先级运算符的组合顺序(续)运算符描述优先级(数越大优先级越高)同等优先级结合顺序instanceof、

<、<=、>、>=关系运算9左→右==、!=相等性运算8左→右&位逻辑与7左→右^位逻辑异或6左→右|位逻辑或5左→右&&条件与4左→右||条件或3左→右?:条件运算符2右→左=、*=、/=、%=、+=、-=、<<=、>>=、>>>=、&=、^=、|=赋值运算符1右→左举例:EvaluationOrder.java2023/11/22107关于断句无鸡鸭亦可无鱼肉亦可青菜一小碟足矣2023/11/22108整型支持的操作运算比较运算,其结果为boolean型:大小比较<、<=、>、>=相等比较==、!=数值运算,其结果为int或long型:加减运算+、-乘除运算*、/、%符号运算+、-前(后)缀自增运算++前(后)缀自减运算--位运算<<、>>、>>>按位取反运算~按位逻辑运算&、|、^条件运算?:类型转换运算(Type)字符串连接运算+Byte、Short、Integer、Long、Character等包装类中的方法Java中存在一个称为的java.math.BigInteger类,支持无限制的整数运算。2023/11/22109浮点型支持的操作运算比较运算,其结果为boolean型:大小比较<、<=、>、>=相等比较==、!=数值运算,其结果为float或double型:加减运算+、-乘除运算*、/、%符号运算+、-前(后)缀自增运算++前(后)缀自减运算--条件运算?:类型转换运算(Type)字符串连接运算+Float、Double等包装类中的方法以及java.lang.Math类,Math类中包含许多与数学运算有关的方法,如幂运算方法exp(doublea)、随机数生成方法random()、正弦函数计算方法sin(doublea),等等。Java语言存在一个称为java.math.BigDecimal的类,支持无限制的实数运算。2023/11/22110布尔型支持的操作运算关系比较运算==、!=逻辑非运算!逻辑运算&、|、^条件与和条件或&&、||条件运算?:字符串连接运算+,布尔型的值true和false都可以转换成字符串,并作字符串连接运算。Boolean包装类中的方法。3.3语句2023/11/22112编组语句代码块由一对花括号“{}”界定,中间包含零或多个语句以及局部变量声明组成,且能够以任何顺序存在。

无论任何位置,只要允许单个语句存在,都可以放置代码块。空语句仅仅是分号“;”本身。

空语句不执行任何动作,无论何处,只要可以放置普通语句,都可以使用空语句。

空语句总是可以完全正常执行。2023/11/22113表达式语句赋值、方法调用、类的实例化、自增(减)1运算等,都是表达式语句。常用的语句格式如下:newStringBuffer(“Hello”);//创建不被引用的实例对象newJFrame().setVisible(true);//方法调用i++;//自增运算a=b;//赋值2023/11/22114选择语句if语句的一般语法格式如下: if(boolean-expression) statement1; [else statement2;]switch语句的一般语法格式如下: switch(expression){ casevalue1:statement1; break; casevalue2:statement2; break;

… casevalueN:statemendN; break; [default:defaultStatement;] }举例:Kid.java2023/11/22115循环语句while语句 [initialization]//初始化部分 while(termination){//布尔型表达式,循环终止条件 body;//循环体部分 [iteration;]//迭代部分 }do-while语句 [initialization]//初始化部分 do{ body;//循环体部分 [iteration;]//迭代部分 }while(termination);//布尔型表达式,循环终止条件for语句 for(initialization;termination;iteration){//初始化部分;循环终止条件;迭代部分 body;//循环体部分 }无限循环语句

while(true){…}

for(;;){…}2023/11/22116讨论:迭代与递归迭代(Iteration)法通常采用循环语句(如for语句、while语句、do-while语句等)来完成运算,递归(Recursion)法通常采用选择语句(如if语句、if-else语句、switch语句等)来完成运算。本质上迭代和递归都包含着循环:迭代法是显式调用了循环语句,而递归法则通过自我调用的策略来实现循环。举例:Fibonacci.java2023/11/22117控制转移语句标识语句continue语句break语句return语句4.1对象的声明与创建2023/11/22119基本术语:类类(Class)

可以由用户自己定义的引用类型,它是相似对象的软件抽象、创建对象的模板。每一个类都组合了一些能够反映某种类型属性的字段和反映某种类型动作的方法。2023/11/22120基本术语:对象对象(Object)

是一个人、地址、物品、事件、概念、屏幕显示或者报表,它属于某一个类,对象拥有自己的属性值和方法调用。作为类设计的初衷,每一个类都将存在许多相互独立的对象。通常我们说一个对象是类的一个实例,一个对象的生命周期包括声明、创建、使用和清除四个状态。2023/11/22121基本术语:对象引用在Java语言中只能引用对象,无法声明一个直接包含对象的变量。类类型变量称为引用变量,它们并不直接保留对象,只是保留对象的地址,而不是拥有对象本身,通过引用变量即可以得到一个对象。所有对象总是且只是通过内存引用访问的,这种方式称为间接寻址。对象引用可以在需要的时候自动撤销。2023/11/22122类、对象和对象引用的关系示意图

2023/11/22123基本术语:类变量类变量必须在类体中声明,并且使用关键字“static”,因此也称为静态变量。类变量在类被加载时完成相应的初始化工作。类变量在一个运行系统中只有一份供整个类和实例对象共享的值,该值有可能被类(及其子类)和它们所创建的实例改变,每一次的改变都将影响到该类(及其子类)和其它实例的调用。类变量的作用域是整个类。2023/11/22124基本术语:实例变量实例变量在类体中声明但不使用关键字“static”,也称为非静态变量。它在对象初始化时完成相应的初始化工作,并由某一个对象独自拥有。实例变量的作用域是某一个类具体创建的实例对象。2023/11/22125基本术语:局部变量局部变量在某一个语句(如for语句)或代码块(如方法体)中声明。当该语句或代码块被调用时,每次都将立即创建相关的局部变量。在一个局部变量的声明语句中可能包含有用于初始化的表达式,但是,该表达式一般要等到这条声明语句被执行的时候才会进行相应的初始化。当该语句或代码块被执行完毕退出,相应的局部变量也将失效。局部变量的作用域是声明该变量的语句或代码块。2023/11/22126基本术语:参数变量方法和构造方法用于传递信息的参数(Argument)变量和作用于方法体的局部变量相类似,当方法被调用的时候进行相应的初始化,当方法体执行结束后失效。2023/11/22127变量举例类变量和实例变量都拥有一个缺省初值,如果某个变量在初始化时没有显式赋值,那么将被赋予缺省初值。局部变量则没有缺省初值,如果某个变量在初始化时没有显式赋值,并且在其后的语句中试图直接调用,Java编译器将会报错提示,以保证每个变量都是按照编程人员的意图进行赋值。举例:VariableInit.java2023/11/22128讨论以下程序的问题所在publicclassInitializationDemo{ intscore=100;

publicStringisExcellent(){ Stringresult;

if(score>=90) result="Veryverygood!";

returnresult; }

publicstaticvoidmain(String[]args){ InitializationDemoobj=newInitializationDemo(); System.out.print(obj.isExcellent()); }}2023/11/22129基本术语:关键字thisthis只能用于与实例有关的代码块中,如实例方法、构造方法、实例初始化代码块或实例变量的初始化代码块等,this就代表当前或者正在创建的实例对象的引用,通常可以利用这一关键字实现与局部变量同名的实例变量的调用。在构造方法中还可以用this来代表要显式调用的其它构造方法。除此以外,使用this关键字都将引发编译时错误。2023/11/22130基本术语:关键字supersuper只能用于与实例有关的代码块中,如实例方法、构造方法、实例初始化代码块或实例变量的初始化代码块等,super代表当前或者正在创建的实例对象的父类,通常可以利用这一关键字实现对父类同名属性或方法的调用。在构造方法中还可以用super来代表要调用的父类构造方法,以实现构造方法链的初始化。由于Object类为Java语言的根类,已经没有父类,因此,如果在Object类中使用了关键字super,将引发编译时错误。2023/11/22131this和super举例this和super是在设计类的时候、而不是使用类及其实例的时候引用。举例:ThisSuper.java2023/11/22132基本术语:访问权限修饰符访问权限控制由强到弱的顺序是public、protected、(default)、private。public访问权限意味着在任何地方,只要能访问到该类,即可访问到该成员。protected访问权限意味着类中的成员允许同一个包或该类的扩展子类访问。缺省的访问权限不需要任何关键字,但通常称为“Friendly”。它意味着类中的成员只能由同一个包中的其它类访问。private访问权限意味着该类中的成员只能由自己的成员调用,而无法被该类以外的其它类访问。声明局部变量不能包含访问权限修饰符,否则编译时将检查出错。2023/11/22133存储对象状态的地方寄存器(Register)JVM会根据本身需求适当地分配。堆(Heap)堆是个自由内存区域,常用于动态或临时内存分配,对类和数组对象提供内存。栈(Stack)栈存储方法调用的状态,如方法调用使用的任何局部变量和方法的操作数。方法区(Methodarea)所有JVM线程共享的公用存储区,存储运行时常量池、方法数据、字段数据、方法与构造方法字节码等信息。运行时常量池(Runtimeconstantpool)类似于其它编程语言中的符号表,它包含数值文字和字段常量之类的常量。非运行时存储空间2023/11/22134对象的声明Java作为一种强类型语言,声明基本类型或引用类型都要先指定类型,然后给出相应的变量标识符:

TypeIdentifier;fianl型变量只能赋值一次,而且必须被显式赋值,否则编译时将有检查错误提示。fianl型基本类型变量相当于常量。对于引用型变量,当声明为“final”时,如果该变量引用了一个对象,则意味着该变量只能引用该对象,而该对象的状态仍然可以被改变;如果该变量引用了一个数组,则意味着该变量只能引用该数组,而该数组的元素仍然可以被改变。举例:FinalVariable.java2023/11/22135对象的创建利用关键字new可以创建一个对象,new运算符为对象分配内存空间,调用该类的一个构造方法,实例化一个对象,返回该对象所在内存地址的一个引用。该对象引用可以赋给相应类型的对象变量,以后可以通过该变量操作所引用的对象。如果创建该对象时没有把引用赋给某个对象变量,则该对象将无法再被引用。举例:Employee.java2023/11/22136数组对象的声明数组是一种用来存储相同类型数据项的数据结构,它由一组具有相同类型和相同变量名,放在相邻内存位置的元素构成。数组声明语句:

Type[]Identifier;在任何数组变量的类型声明中,数组维数都被忽略了,数组元素的个数是利用new运算符创建时、而不是在声明时决定的。2023/11/22137数组对象的创建要创建Java的数组对象,通常使用new运算符进行实例化。当第1次生成数组时,应指定这个数组拥有的元素是多少,也就是数组的大小。数组对象的长度在创建时限定后,就不能再被改变。但可以在任何时候把一个不同长度的新数组赋值给数组变量Identifier。数组第一个元素的下标为0,最后一个元素的下标是(length-1),其中length为数组长度,即数组元素的个数。创建数组的大小可以是0,一个长度为0的数组被称为empty(空)数组。

讨论:“int[]i=newint[0];”和“int[]i=null;”

2023/11/22138数组举例数组初始化:ArrayInit.java“int[]i=newint[0];”和“int[]i=null;”区别数组操作:ArrayManipulation.javaArrays类及其方法数组复制:ArraycopyExample.java单层复制与多层复制的实现4.2对象的初始化2023/11/22140成员变量的缺省初始化过程创建对象时需要对属于对象的成员变量进行初始化。无论成员变量是声明在其它方法的前面或者后面,其初始化操作总会在方法调用之前合适的时机执行,并按顺序逐步完成。与方法中声明的局部变量不一样,为了保证数据成员变量在使用前被有效初始化,JVM会在类加载时对所有数据成员变量赋予缺省的初值。这一步骤总是首先被执行的,当没有显式对某个变量赋值时,缺省值的使用可以避免引发异常而导致崩溃。2023/11/22141类型的缺省值类型缺省值booleanfalsechar‘\u0000’(null)byte(byte)0short(short)0int0l

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论