Java程序设计教程_第1页
Java程序设计教程_第2页
Java程序设计教程_第3页
Java程序设计教程_第4页
Java程序设计教程_第5页
已阅读5页,还剩408页未读 继续免费阅读

下载本文档

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

文档简介

第一章Java概述

Java程序设计教程本章主要内容Internet、Web与Java渊源程序设计语言的层次发展C、C++与JavaJava的特征Java程序的类型及其不同编程模式Java开发过程及开发工具21.1Internet、Web与Java渊源因特网(Internet)是当前全球最大的、开放的、由众多网络相互连接而成的计算机网络,它采用TCP/IP协议簇,其前身是1969美国问世的ARPANET网。因特网的迅猛发展始于20世纪90年代,所以20世纪90年代又被称为因特网时代,或者网络时代。31.1Internet、Web与Java渊源WWW浏览器具有精良的图形用户界面、方便的菜单和按钮等。可以让用户在全球网络上轻松浏览WWW服务器上的信息。万维网是基于因特网的,万维网被广泛应用于因特网之上。万维网方便了非网络专业人员对网络的使用,从而使万维网的站点数目以指数级增长。41.1Internet、Web与Java渊源万维网WWW(WorldWideWeb的缩写,又称为Web),是Internet上一项发展最快的网络多媒体信息服务。WWW作为Internet上新一代用户界面,摒弃了以往纯文本方式的信息交互手段,采用超文本(HyperText)方式。万维网包括WWW服务器和WWW浏览器。51.1Internet、Web与Java渊源WWW浏览器具有精良的图形用户界面、方便的菜单和按钮等。可以让用户在全球网络上轻松浏览WWW服务器上的信息。万维网是基于因特网的,万维网被广泛应用于因特网之上。方便了非网络专业人员对网络的使用,从而使万维网的站点数目以指数级增长。61.1Internet、Web与Java渊源1991年,SunMicrosystem公司在公司内部投资了一个名为Green的研究项目,研究解决诸如电视机、电冰箱、电话等家用电器的通信和控制问题。项目组开发了一种以C和C++语言为基础的语言。命名为Java语言,有两种说法:其一,印度尼西亚有一个重要的岛屿——爪哇岛,盛产咖啡,开发人员起名Java寓意为世人端上一杯热腾腾的咖啡;其二说法为美洲俚语——咖啡之意。7机器语言与汇编语言由计算机硬件系统可以识别的二进制指令组成的语言称为机器语言。计算机发展的初期,软件工程师们只能用机器语言来编写程序。这一阶段,在人类的自然语言和计算机编程语言之间存在着巨大的鸿沟。汇编语言将机器指令映射为一些可以被人读懂的助记符,如ADD、SUB等。此时编程语言与人类自然语言间的鸿沟略有缩小,但仍与人类的思维相差甚远。因为它的抽象层次太低,程序员需要考虑大量的机器细节。计算机语言的发展8高级语言高级语言屏蔽了机器的细节,提高了语言的抽象层次,程序中可以采用具有一定涵义的数据命名和容易理解的执行语句。这使得在书写程序时可以联系到程序所描述的具体事物。计算机语言的发展9面向对象的语言出发点:更直接地描述客观世界中存在的事物(对象)以及它们之间的关系。特点:是高级语言。将客观事物看作具有属性和行为的对象。通过抽象找出同一类对象的共同属性和行为,形成类。通过类的继承与多态实现代码重用计算机语言的发展101.3C、C++与Java

Java的目的并不是改进C++并最终取代C++。C++和Java这两种语言是设计用来解决不同问题的。Java是用来设计必须共存于不同机器的应用程序——常常是基于Internet的基础之上。相反,C++用来开发在一台特定机器上运行的程序,尽管C++程序被重新编译后能够在其他机器上运行。11Java语言的许多基本结构与C++是相似的,有时甚至是相同的。例如,Java是一种面向对象编程语言,它用类来创建对象的实例。类具有数据成员和方法成员,这和C++中的类是相似的。但是Java没有指针,在C/C++编程语言中指针是一个基石。Java带有自动的垃圾收集器,这是在C/C++中没有的功能。C++中支持多重继承,一个类可以有多个父类而在Java中,一个类只能有一个父类,但是可以实现多个接口,这样既达到多重继承的目的,又保证了结构比多重继承更加清晰。12

C语言为面向过程的程序设计语言。面向过程程序设计语言在程序设计过程中都倾向于面向行为。C语言中,程序设计的单元是函数。C编程人员着重于编写函数。C语言的主要问题是程序中的数据和操作分离,不能够有效地组成与自然界中的具体事物紧密对应的程序成分。Java是纯面向对象的程序设计语言,Java语言中程序设计的单元是类,从类中创建一个一个实例对象。Java编程人员着重创建用户自定义的类。每一个类均可包含数据属性和若干操作数据的函数。一个类的函数部分称为方法。C与Java131.5Java语言的特点

1.面向对象对象是现实世界中某一个实际存在的事物,软件对象是数据和方法的封装体。类与对象的关系,如同一个模具与用这个模具铸造出来的铸件之间的关系;如同自行车图纸和自行车的关系。142.跨平台Java主要靠Java虚拟机(JVM)在目标代码级实现平台无关性。JVM是Java平台无关的基础,Java源代码先经过Java编译器生成Java虚拟机的字节码,再经过Java解释器将字节码转换成实际系统平台上的机器码,然后真正执行。任何一台机器只要配备了Java解释器,就可以运行字节码,而不管这种字节码是在何种平台上生成的。

153.安全性

首先,Java是强类型的语言,保证程序更加可靠;其次,Java不支持指针,杜绝了内存的非法访问;第三,Java的自动单元收集防止了内存丢失等动态内存分配的问题;第四,Java解释器运行时实施检查,可以发现数组和字符串访问的越界;最后,Java提供了异常处理机制,便于程序即时发现运行错误。164.多线程线程是操作系统的一种概念,被称为轻量级进程,是比传统进程更小的、可并发执行的单位。C和C++采用单线程体系结构,Java提供了多线程支持。175.图形功能强Applet是Java特有的一种小应用。Java系统可以使Applet很方便地加入到Internet的网页之中,从而使Internet网页增加了各种动态的多媒体图形效果,增强了可视化的互动对话,对计算机图形学、计算机多媒体通信提供了良好的支持。18

1.6Java程序的类型及其不同的编程模式

用Java书写的程序有两种类型:Java应用程序

(JavaApplication)和Java小应用程序(JavaApplet)。Java应用程序必须得到Java虚拟机的支持才能够运行。Java小应用程序则需要客户端浏览器的支持。Java小应用程序运行之前必须先将其嵌入HTML文件的<applet>和</applet>标记中。当用户浏览该HTML页面时,Java小应用程序将从服务器端下载到客户端,进而被执行。19Application的基本编程模式:class用户自定义的类名

//定义类{

publicstaticvoidmain(Stringargs[])

//定义main()方法{

方法体}}

20//文件名:Welcome.javapublicclassWelcome{publicstaticvoidmain(Stringargs[]){System.out.println("WelcometoJavaProgramming!");}//结束main方法的定义}//结束类Welcome的定义21Applet的基本编程模式:importjava.awt.Graphics;//引入java.awt系统包中的Graphics类importjava.applet.Applet;//引入java.applet系统包中的Applet类class用户自定义的类名extendsApplet//定义类{publicvoidpaint(Graphicsg)//调用Applet类的paint()方法{

方法体}}22例1.2<html><appletcode="WelcomeApplet.class"width=400height=50></applet></html>23

1.7Java程序开发过程

要创建一个Java需要三个基本步骤:(1)创建带有文件扩展名.java的源文件。(2)利用Java编译器生成文件扩展名为.class的字节码文件。(3)Application程序利用Java解释器运行该字节码文件,Applet利用Java自带查看器或浏览器运行嵌有字节码文件的HTML文件。24程序设计方法的发展历程

——面向对象的方法优点:程序模块间的关系更为简单,程序模块的独立性、数据的安全性就有了良好的保障。通过继承与多态性,可以大大提高程序的可重用性,使得软件的开发和维护都更为方便。面向对象的方法25面向对象的基本概念

——对象面向对象方法中的对象:是系统中用来描述客观事物的一个实体,它是用来构成系统的一个基本单位。对象由一组属性和一组行为构成。属性:用来描述对象静态特征的数据项。行为:用来描述对象动态特征的操作序列。面向对象的方法26面向对象的基本概念

——类分类——人类通常的思维方法分类所依据的原则——抽象忽略事物的非本质特征,只注意那些与当前目标有关的本质特征,从而找出事物的共性,把具有共同性质的事物划分为一类,得出一个抽象的概念。例如,石头、树木、汽车、房屋等都是人们在长期的生产和生活实践中抽象出的概念。面向对象的方法27面向对象的基本概念

——类面向对象方法中的"类"具有相同属性和服务的一组对象的集合为属于该类的全部对象提供了抽象的描述,包括属性和行为两个主要部分。类与对象的关系:

犹如模具与铸件之间的关系,一个属于某类的对象称为该类的一个实例。面向对象的方法28Applet需要的HTML文件的最小集的格式为:<HTML><appletcode=类名.classwidth=宽度height=高度></applet></THML>29面向对象的基本概念

——封装把对象的属性和服务结合成一个独立的系统单位。尽可能隐蔽对象的内部细节。对外形成一个边界(或者说一道屏障),只保留有限的对外接口使之与外部发生联系。面向对象的方法30面向对象的基本概念

——继承继承对于软件复用有着重要意义,是面向对象技术能够提高软件开发效率的重要原因之一。定义:特殊类的对象拥有其一般类的全部属性与服务,称作特殊类对一般类的继承。例如:将轮船作为一个一般类,客轮便是一个特殊类。面向对象的方法31面向对象的基本概念

——多态性多态是指在一般类中定义的属性或行为,被特殊类继承之后,可以具有不同的数据类型或表现出不同的行为。这使得同一个属性或行为在一般类及其各个特殊类中具有不同的语义。例如:数的加法->实数的加法

->复数的加法面向对象的方法3233第二章Java语言基础

Java程序设计教程本章主要内容

Java语言的基本组成

数据类型

运算符和表达式35标识符

Java语言中,标识符是一个字符序列

,分为两类:一类是用户自己定义使用的,其作用是用于标识常量、变量、文件、类、方法等的名字。另一类是关键字,也叫保留字,能被系统自动识别,有着特殊的含义。Java语言的基本组成36标识符在Java中,所有的标识符都必须以字母(A-Z、a-z)、下划线“_”或美元符号“$”开头。后面可以包含字母、数字、下划线和美元符号。标识符中的第一个符号不可以用数字。

注意,Java语言对字母的大小写是敏感的,即在所有的语法中都区分大小写。37标识符标识符比较流行的约定是:

(1)表示常值的标识符全部用大写字母。例如:RED。(2)表示类名的标识符用大写字母开始。例如:MyCar。(3)表示公有方法和实例变量的标识符用小写字母开始,后面的描述性词则以大写开始。例如:getCurrentValue。(4)表示私有的或局部的变量的标识符全部用小写字母。例如:next_value。38分隔符分隔符是用来区分源程序中的基本成分,可使编译器确认代码在何处分隔。分隔符有注释、空白符和普通分隔符三种。Java的注释有两种:(1)单行注释,以“//”开头到本行末的所有字符被系统理解为注释,不予编译。(2)

块注释,以“/*”开始,最后以“*/”结束,中间可写多行。39空白符和分隔符空白符包括空格、回车、换行和制表符(Tab键)等符号,用来作为程序中各种基本成分之间的分隔符。

Java有4种普通分隔符:

{}大括号,用来定义复合语句、方法体、类体及数组的初始化;;

分号,是语句结束的标志;,

逗号,分隔方法的参数和变量说明等;:

冒号,说明语句标号。40基本数据类型

数据类型决定了程序处理和存储数据的方式。Java有8种基本数据类型,它们被分为四组:整型:byte、short、int和long浮点型:float和double字符型:char布尔型:boolean

41变量变量是内存中的一块空间,提供可以存放信息和数据的地方,具有记忆数据的功能。变量的值在程序运行过程中是可变的。变量由标识符、类型和可选的初始值组合定义。此外,所有变量都有一个作用域,它定义了变量的可视度和生命周期。Java是强类型语言,所有变量在使用之前必须声明。42数据类型

——变量赋初值例:

inta=3;

doublef=3.56;

charc='a';

intc=5;Page43基本数据类型和表达式43算术运算符与算术表达式基本算术运算符+-*/%(取余)

(若整数相除,结果取整)优先级与结合性先乘除,后加减,同级自左至右++,--(自增、自减)

例:i++;j--;Page44基本数据类型和表达式44赋值运算符和赋值表达式

简单的赋值运算符"="举例:

n=n+5类型:

等号左边对象的类型值:

等号左边对象被赋值后的值Page45基本数据类型和表达式45赋值运算符和赋值表达式

复合的赋值运算符有10种复合运算符:

+=,-=,*=,/=,%=,

<<=,>>=,&=,^=,|=例:a+=3等价于a=a+3

x*=y+8等价于x=x*(y+8)基本数据类型和表达式46常用复合赋值运算符有:+=加迭代赋值-=减迭代赋值*=乘迭代赋值/=除迭代赋值%=取余迭代赋值47赋值运算符和赋值表达式

——赋值表达式举例a=5 表达式值为5a=b=c=5 表达式值为5,a,b,c均为5a=5+(c=6) 表达式值为11,a为11,c为6a=(b=4)+(c=6)

表达式值为10,a为10,b为4,c为6a=(b=10)/(c=2)

表达式值为5,a为5,b为10,c为2a+=a-=a*a相当于:a=a+(a=a-a*a)Page48基本数据类型和表达式48关系运算与关系表达式关系运算是比较简单的一种逻辑运算,优先次序为:

<<=>>=

==!=

优先级相同(高)优先级相同(低)关系表达式是一种最简单的逻辑表达式其结果类型为bool,值只能为true或false。例如:a>b,c<=a+b,x+y==3基本数据类型和表达式49例2.2:利用直角三角形的两条直角边来计算斜边长度。//Demonstratedynamicinitialization.classDynInit{publicstaticvoidmain(Stringargs[]){doublea=3.0,b=4.0;//cisdynamicallyinitializeddoublec=Math.sqrt(a*a+b*b);System.out.println(“Hypotenuseis”+c);}}50

运算符与表达式

赋值运算符对应了赋值运算,即赋予程序里的变量或对象一定的内容。其格式如下:

变量或对象=表达式;例如:x+=8等价于x=x+8,即将x加上8,结果再赋给x。y*=x+2等价于y=y*(x+2),即将变量y的值乘以(x+2),再赋给y。51Java语言的算术运算符有一元运算符和二元运算符两种。Java的一元算术运算符包括取负运算(-)、增量(++)和减量(--)三种。但是在表达式中,增量和减量运算的书写位置对运算结果有很大影响。例如:inti=10;intj=10;intx=i++;inty=++j;程序依次执行之后,x的值为10,y的值为11,i和j的值均为11。52变量的作用域和生命周期

变量在程序中声明的位置隐含地指出了该变量的作用域。可以归纳为以下3种类型:·成员变量;·局部变量;·方法参数。53例2.4运行结果:方法aaa中局部变量xxx的值为:13.0执行方法aaa后,类的成员变量a.xxx=0.0执行方法bbb后,类的成员变量b.xxx=8.054逻辑运算与逻辑表达式逻辑运算符:

!(非)&&(与)||(或)

优先次序:高→低逻辑表达式

例如:(a>b)&&(x>y)

其结果类型为bool,值只能为true或false。基本数据类型和表达式55条件运算符与条件表达式一般形式:表达式1?表达式2:表达式3表达式1必须是bool类型执行顺序:先求解表达式1,若表达式1的值为true,则求解表达式2,表达式2的值为最终结果若表达式1的值为false,则求解表达式3,表达式3的值为最终结果基本数据类型和表达式56Java的二元运算符有加(+)、减(-)、乘(*)、除(/)、求模运算符(%)。关系运算实际上就是比较运算,运算结果是布尔值。如果两个运算对象符合关系运算符所要求的比较关系,则关系运算结果为true,否则为false。逻辑运算符用来表示操作数的逻辑关系,其运算结果也是用布尔值来表示的。当逻辑关系成立时,其运算结果为true;反之为false。57位运算——按位与(&)运算规则将两个运算量的每一个位进行逻辑与操作举例:计算3&53:000000115:(&)000001013&5:00000001

58位运算——按位或(|)运算规则将两个运算量的每一个位进行逻辑或操作举例:计算3|53:000000115:(|)000001013|5:00000111

59位运算——按位异或(^)运算规则两个操作数进行异或:

若对应位相同,则结果该位为0,

若对应位不同,则结果该位为1,举例:计算071^052071: 00111001052:(^)00101010071^052: 00010011

60位运算——按位异或(^)用途:使特定位翻转(与0异或保持原值,与1异或取反)例如:要使01111010低四位翻转: 01111010(^) 00001111 01110101

61位运算——取反(~)单目运算符:对一个二进制数按位取反。例:025:0000000000010101

~025:1111111111101010

62位运算——移位左移运算(<<)左移后,低位补0,高位舍弃。右移运算(>>)右移后,低位:舍弃

高位:无符号数:补0有符号数:补“符号位”基本数据类型和表达式63运算符优先级括号++,--,sizeof*,/,%+,-==,!=位运算&&||?:赋值运算逗号运算低高

6465第三章Java的输入/输出

C++程序设计教程本章主要内容标准输入输出命令行输入输出应用流式交互输入输出简单应用GUI输入输出简单应用67标准输出方法

System类含有标准打印流PrintStream类的成员变量out,我们可以调用它的print、println或write方法来输出各种类型的数据。例3-1

标准输入输出方法68标准输入方法键盘是标准输入设备,用户通常用键盘输入数据。System类含有标准输入流的成员变量in,可以调用它的read方法来读取键盘数据。

publicabstractinread()//从键盘输入一个字符publicintread(byte[]b)//一次输入多个字节数据,存于字节数组b中publicintread(byte[]b,intoff,intlen)//限定输入的字节69例3-270

Java应用程序通常是在命令行下运行,允许用户在命令行中向它传递信息,所传递的信息称为命令行参数。例3.5接收命令行参数的应用程序。publicclassHelloArgs{publicstaticvoidmain(Stringargs[]){System.out.println(args[0]+","+args[1]+"Hello!");}}命令行参数输入法71流式交互输入输出的应用

例3-672GUI图形界面输入方法示例例3.7使用预定义对话框显示一行字符串。importjavax.swing.JOptionPane;//import语句用于加载类库publicclassWelcome6{publicstaticvoidmain(Stringargs[]){JOptionPane.showMessageDialog(null,"WelcometoJavaProgramming!"); //类JOptionPane中的方法showMessageDialog的调用System.exit(0);//使用预定义类System的静态方法exit结束程序}}737475第四章程序流程控制结构和方法

Java程序设计教程本章主要内容简单语句和复合语句选择结构循环结构迭代、穷举和递归算法77顺序结构分支结构循环结构算法的基本控制结构78

语句(statements)是程序的基本组成单位,在Java语言中,有简单语句和复合语句两类语句。一条简单语句总是以分号(;)结尾,它表示一个要执行的功能(如shorts=258;)。语句可以是单一的简单语句,也可以是用一对花括号{}括起来的复合语句(一般也称为语句块――blocks)。语句和流程控制结构79选择结构

Java语言实现选择结构的语句有两种:一种是两路分支选择的if-else语句;一种是多分支选择的switch语句。语句和流程控制结构80例4.1判断2008是否为奇数,是奇数则输出。publicclassIsOdd{ publicstaticvoidmain(String[]args) { inty=2007; if(y%2!=0) System.out.println(y+"是个奇数!"); System.out.println("if语句出口"); }}

if语句

语句和流程控制结构81例4.2判断并输出2008的奇偶性publicclassIsOdd1{ publicstaticvoidmain(String[]args) { inty=2007; if(y%2==0) System.out.println(y+"是个偶数!"); else System.out.println(y+"是个奇数!"); System.out.println("if-else语句出口"); }}82一般形式if()if()语句1else语句2elseif()语句3else语句4注意语句1、2、3、4可以是复合语句,每层的if与else配对,或用{}来确定层次关系。if语句

——嵌套算法的基本控制结构83一般形式switch(表达式){case常量表达式1:语句1case常量表达式2:语句2┆case常量表达式n:语句ndefault:语句n+1}switch语句执行顺序以case中的常量表达式值为入口标号,由此开始顺序执行。因此,每个case分支最后应该加break语句。每个常量表达式的值不能相同,次序不影响执行结果。可以是多个语句,但不必用{}。可以是整型、字符型算法的基本控制结构84例4-7程序运行结果:

5表示是星期五switch结构出口!85如何有效地完成重复工作循环结构是当循环条件为真时,不断地重复执行某些动作,即反复执行同一程序块,直到循环条件为假,结束循环,转向循环结构的出口。在现实世界的许多问题中需要用到循环控制,例如累加求和,迭代求根,求某月工资总和等。Java语言中实现循环结构的语句共有三种:while语句,do-while语句和for语句。算法的基本控制结构86while语句形式while(表达式)语句

可以是复合语句,其中必须含有改变条件表达式值的语句。执行顺序先判断表达式的值,为true时,再执行语句。算法的基本控制结构87例4.9while循环结构——迭代算法。classLoopTest1{ publicstaticvoidmain(Stringargs[]){ System.out.println("0-100个整数之和:");inti=1,sum=0;//循环结构外给循环变量i,计算变量sum初始化while(i<=100) //循环条件{sum+=i; //循环体内迭代运算i+=1; //循环体内修改循环变量 } System.out.println("sum="+sum+",i="+i); //循环结束处理 }}88do-while语句一般形式do语句while(表达式)可以是复合语句,其中必须含有改变条件表达式值的语句。执行顺序先执行循环体语句,后判断条件。

表达式为true时,继续执行循环体与while语句的比较:While语句执行顺序

先判断表达式的值,为true时,再执行语句算法的基本控制结构89例4.11do-while循环结构——迭代算法。classLoopTest2{ publicstaticvoidmain(Stringargs[]) {System.out.println("0-100个整数之和:"); inti=1,sum=0; do {sum+=i; i+=1; }while(i<=100); System.out.println("sum="+sum+",i="+i);}}90for语句语法形式for(表达式1;表达式2;表达式3)语句

循环前先求解非0时执行循环体每次执行完循环体后求解算法的基本控制结构91例4.13循环变量i在for语句中定义时,它只在for语句中有效的局部变量classLoopTest31{ publicstaticvoidmain(Stringargs[]) { System.out.println("0-100个整数之和:"); intsum=0; for(inti=1;i<=100;i++) sum+=i; System.out.println("sum="+sum/*+",i="+i*/); }}92注意:for(inti=1;i<=100;i++) sum+=i; /*i是局部变量,不能在循环外部使用*/System.out.println("sum="+sum+",i="+i);//i无定义编译出错

93循环嵌套例4.15for语句的循环嵌套,在对话框中画字符组成的三角形。importjava.applet.Applet;importjava.awt.*;publicclassContinueLabelTest1extendsApplet{ publicvoidpaint(Graphicsg) { for(introw=1;row<=7;row++) { intx=220-20*row; inty=20+20*row; for(intcolumn=1;column<=2*row-1;column++) g.drawString("*",x+20*(column-1),y); } }94//ContinueLabelTest1.html<HTML><APPLETCODE=ContinueLabelTest1.classWIDTH=400HEIGHT=200></APPLET></HTML>95程序运行结果:96break和continue语句break语句使程序从循环体和switch语句内跳出,继续执行逻辑上的下一条语句。不宜用在别处。continue语句结束本次循环,接着判断是否执行下一次循环。基本控制结构9798第五章数组

Java程序设计教程99本章主要内容一维数组多维数组100数组的概念数组是具有一定顺序关系的若干相同类型变量的集合体,组成数组的变量称为该数组的元素。数组属于构造类型。数组101数组作为一种特殊的数据类型具有以下特点:一个数组中所有的元素是同一类型;数组中的元素是有顺序的;数组中的一个元素通过数组名和数组下标来确定。102在使用数组时,会涉及到以下几个术语:数组名。数组名应该符合Java语言标识符的命名规则。数组的类型。因为数组是用来存储相同类型的数据,因此数组的类型就是其所存储的元素的数据类型。数组的长度。数组的长度指的是数组中可以容纳的元素的个数,而不是数组所占用的字节数。103一维数组的声明

一维数组声明的格式为:类型数组名[];或类型[]数组名;其中类型指出了数组中各元素的数据类型,包括基本类型和构造类型。数组名为一个标识符。“[]”指明了该变量是一个数组类型变量。例如: inta[];或 int[]a;

104

一维数组的初始化1.初始化方式一直接给数组的每个元素赋上一个初始值,系统会自动根据所给的元素个数为数组分配一定的内存空间,一般在数组元素比较少时使用,一般形式为:类型数组名[]={值1,值2,……,值n};以下声明并初始化一个长度为3的整型数组:inta[]={1,2,3};1052.初始化方式二初始化方式二需要使用new操作符为一个数组分配内存空间,然后为每个元素分别赋值,格式如下:类型数组名[];数组名=new类型[数组长度];或简化为类型数组名[]=new类型[数组长度];106例5.1以数据35、22、51、10、60为例,利用冒泡排序法按降序排列。分析:一般来说,需要经过n-1轮循环才能完成全部的排序。原始数据: 35 22 51 10 60第一轮 : 35 51 22 60 10第二轮 : 51 35 60 22 10第三轮 : 51 60 35 22 10第四轮 : 60 51 35 22 10107实现排序的程序如下:publicclassBubbleSort{publicstaticvoidmain(String[]args){inti,j;intintArray[]={35,22,51,10,60};intlen=intArray.length;for(i=1;i<len;i++)for(j=0;j<len-i-1;j++)if(intArray[j]>intArray[j+1])108

{intt=intArray[j];intArray[j]=intArray[j+1];intArray[j+1]=t;}System.out.println("排序后的结果为:");for(i=0;i<len;i++)System.out.println(intArray[i]+"");}}排序后的输出结果为:6051352210109二维数组

二维数组的声明与创建声明二维数组的一般格式如下:

类型数组名[][];或类型[][]数组名;110直接为每一维分配空间,如inta[][]=newint[2][3];该语句创建了一个二维数组a,其较高一维含两个元素,每个元素为由3个整数构成的整型数组。111(2)从最高维开始,分别为每一维分配空间,如intb[][]=newint[2][];//最高维含2个元素,每个元素为一个整型数组b[0]=newint[3];//最高维第一个元素是一个长度为3的整型数组b[1]=newint[5];//最高维第二个元素是一个长度为5的整型数组112例5-3执行结果:ia3的长度=5ia4的长度=7ia5的长度=3ia5[0]的长度=2ia5[1]的长度=4ia5[2]的长度=3113例5.4:二维数组的使用。

程序结果:114for(i=0;i<3;i++)for(j=0;j<arr2[i].length;j++)arr2[i][j]=k++;g.drawString("arr1:",20,20);for(i=0;i<3;i++)for(j=0;j<4;j++)g.drawString(""+arr1[i][j],20+20*j,40+20*i);g.drawString("arr2:",115,20);for(i=0;i<3;i++)for(j=0;j<arr2[i].length;j++)g.drawString(""+arr2[i][j],115+20*j,40+20*i);g.drawString("arr3:",230,20);for(i=0;i<3;i++)for(j=0;j<3;j++)g.drawString(""+arr3[i][j],230+20*j,40+20*i);}}115116第六章Java类与对象Java程序设计教程

117本章主要内容面向对象技术的编程特点类的描述成员变量和成员方法的使用实用工具类118回顾:面向过程的设计方法重点:如何实现细节过程,将数据与函数分开。形式:主模块+若干个子模块(main()+子函数)。特点:自顶向下,逐步求精——功能分解。缺点:效率低,程序的可重用性差。面向对象技术的编程特点119面向对象的方法目的:实现软件设计的产业化。观点:自然界是由实体(对象)所组成。程序设计方法:使用面向对象的观点来描述模仿并处理现实问题。要求:高度概括、分类、和抽象。面向对象的思想120抽象抽象是对具体对象(问题)进行概括,抽出这一类对象的公共性质并加以描述的过程。先注意问题的本质及描述,其次是实现过程或细节。数据抽象:描述某类对象的属性或状态(对象相互区别的物理量)。代码抽象:描述某类对象的共有的行为特征或具有的功能。抽象的实现:通过类的声明。OOP的基本特点121抽象实例——钟表数据抽象:intHour,intMinute,intSecond代码抽象:SetTime(),ShowTime()OOP的基本特点122面向对象技术具有三个重要特点:封装(Encapsulation)继承(Inheritance)多态(Polymorphism)。1231.封装性对象是数据(属性)和方法(行为)的封装。封装是面向对象的一个重要原则。在面向对象的程序开发中,每个类中都封装了相关的数据和操作。类是具有相同属性和行为的一组对象的抽象、一般描述。对象是类的实例。抽象是事物的泛化,抽象的目的是提取重要的特征而忽略不重要的细节。1242.继承性继承是存在于面向对象程序的两个或多个类之间的一种关系。被继承的类称为父类、基类或超类。属于子类的上层类。继承了父类或基类的类称为子类。Java只支持单继承,C++支持单继承和多继承。1253.多态性多态是面向对象程序设计的又一重要特征,通过方法重载、方法重构及抽象类等技术实现。1264.消息单独的对象是没有什么用的,多个对象联系在一起才会有完整的功能。对象之间是通过消息相互联系和相互作用的。对象的行为由方法来实现,消息传递是对象之间进行交互的主要方式。一条消息一般包括:(1)接受消息的对象(目标对象)。(2)需要执行的操作(目标方法)。(3)方法所传递的参数。1276.2.1类的定义

比如:定义一个兔子类:

classRabit{finalcharEyeColor=ˋRˊ;//所有兔子的眼睛都是红的intage; //兔子的年龄charsex; //兔子的性别charfurcolor; //兔子皮毛的颜色intspeed; //兔子跑的速度}128再如:publicclassMyclass{publicstaticvoidmain(Stringargs[]){System.out.println(“ILoveChina”)}}129类的定义可归纳如下:class类名{[成员变量;][成员方法;]//中括号表示可选的含义}注意:在类的定义过程中,必须严格遵循的规则是:类的成员变量必须放在类体中,但又不能包含在某个方法中。130下面给出类定义的一般格式:[public/private][abstract/final]class类名[extends父类][implements接口]{类体}1316.2.2类的构造方法及应用构造方法对于类十分重要,用于确定对象的初始状态。对象实例变量的赋值有三种方式:

可以隐式地初始化为缺省值;可以在类的构造方法中初始化;也可以在对象创建后再对它们设置值(相当于再次重新赋值)。132例6-1程序运行结果:品牌:Audi油量:10汽车正在运行中......没有油了!不能再跑了......1336.3成员变量定义的类中,一般包括成员变量和成员方法两大部分。在一个类中,对象的状态是以变量数据的形式定义的。成员变量描述了类和对象的状态,成员变量也称为属性、数据、域(field)。134

成员变量的声明

成员变量的声明形式:[修饰符]类型变量名;常用的修饰符关键字有:public、private、protected、friendly、static和final。1351.public变量用public修饰的变量是公有变量。访问权限:允许任何包中的任何类的访问。既允许变量所属的类访问,也允许同一包中的其他类访问,还允许其他包中的类访问。公有变量对任何类都是可见的,没有任何秘密可言,不具有数据保护功能。1362.private变量用private修饰的变量是私有变量。私有变量只能被声明它的类中的成员方法所使用,拒绝外部类的直接访问。私有变量是不公开的,它们得到了最好的保护。例如:

classClassA{privateinty;//定义私有变量}classClassB{voidaccessMethod(){ClassAcc=newClassA();cc.y=90;//非法操作}}1373.protected变量用protected修饰的变量是受保护变量。访问权限:允许被声明它的类自身以及与它在同一个包中的其他类访问。4.默认访问控制如果一个成员方法或成员变量前没有访问权限修饰符。对于默认成员变量,可以被同一包中的其他类访问,如果一个子类与父类位于不同包中,子类也不能访问父类中的默认访问控制成员。138例6-2了解了成员变量的访问权限之后,那么在说明每一个成员变量的时候,就可以按访问权限给变量提供适当的保护措施,加强变量的安全性。1396.3.3static变量及static方法使用static修饰的成员变量称为类的静态变量,不把它当作实例对象的成员变量。静态变量是属于类所有,和实例变量的不同之处,静态变量直接通过类名引用。实例变量只有在生成实例对象之后才存在,才可以被引用。也把静态变量称为类变量,非静态变量称为实例变量。相应地,静态方法称为类方法,非静态方法称为实例方法。140例6-3

从输出结果中可以得出如下结论:(1)类的静态方法和静态变量可以通过类名直接引用。静态方法只能操作静态变量,不能使用实例变量。(2)类的静态变量只有一个版本,所有的实例对象引用的都是同一个版本。1416.3.4final变量由final修饰的成员变量实际是一个常量。它的值在程序运行中不能被改变。例如:finaldoublePI=3.14159;1426.4成员方法方法是类的一个成员,由方法的头部和方法体两大部分构成。方法的常用定义格式:

[方法修饰符]方法返回值类型

方法名([形式参数表]){[局部变量列表;][语句块;]}143例6.4设计一个矩形类,封装它的状态和行为,定义数据变量和方法,并计算矩形的面积。classArea{doublewidth,height;Area(doublew,doubleh){//类的构造方法width=w;height=h;}doubleproduct(){//求矩形面积的方法returnwidth*height;}}144

classExample6_4{publicstaticvoidmain(Stringargs[]){doubled;AreamyArea=newArea(20,30);//创建对象myAread=myAduct();//调用对象方法product求矩形面积System.out.println("myArea的面积是:"+d);//输出面积}}

1456.4.2方法调用与参数传递方式

调用对象的方法也叫做向对象发送消息。对象名、成员方法名和实际参数列表构成了消息的基本要素。参数可以分为基本类型的参数和对象参数。调用对象成员方法的语法形式:

对象名.方法名([实际参数列表]);

静态方法属于类方法,调用的语法形式可以是:类名.方法名([实际参数列表]);146例6-5程序运行结果:x=400,y=100147参数传递示例——对象用作方法的参数示例1。例6.8本例中,对类MethodCallDemo的findMax方法进行调用,findMax方法的参数是数组。方法findMax的功能是找到数组arr的最大值,并返回之;调用语句y.findMax(x)将数组的应用传送给形参arr。1486.4.3方法重载Java可以在一个类中定义几个同名的方法,只要这些方法具有不同的参数集合(参数的个数、类型和次序),这称为方法重载(methodoverload)。当调用一个重载的方法时,Java编译器通过检查调用语句中参数的个数、类型及次序就可以选择匹配的方法。方法重载一般用作创建对不同类型的数据进行的类似操作。149例6-10逻辑上,编译器利用方法名,方法各参数的类型和准确顺序来确定类中的某个方法的唯一性。1506.4.4final最终方法和abstract方法1.final方法方法被声明为最终方法后,将不能被子类覆盖,即最终方法能被子类方法继承和使用但不能在子类中修改或重新定义它。这种修饰可以保护一些重要的方法不被修改,尤其是那些对类的状态和行为有关键作用的方法,被保护后,可以避免未知情况的发生。1512.abstract抽象方法所谓抽象方法是指没有方法体,即没有实现的方法。含有抽象方法的类称为抽象类。152成员数据与一般的变量声明相同,但需要将它放在类的声明体中。1536.5对象对象是在程序运行中生成的。一个对象所占的空间是在程序运行中动态分配的。在Java中,对象的创建、使用和释放称为对象的生命周期。1546.5.1创建对象创建对象包括三个组成部分:对象的声明、对象实例化和对象初始化。通常格式为:

类名对象名=new构造方法;例如:Lablelable1=newLable(〝标签〞);TextFieldfield1=newTextField(10);Rectanglerect=newRectangle(20,50);155对象的实例化完成对象的空间分配,对象实例化由new操作符完成。new操作符返回一个引用或参考(reference,即对象所在的内存地址),并将它赋给对象名。对象引用实际上是一个指针,指向对象所在的内存地址。1566.5.2对象的使用1.对象的普通使用通过“.”运算符可以实现对对象成员变量的访问和对象成员方法的调用。变量和方法也可以通过一定的访问权限允许或禁止其他对象对它的访问。(1)通过对象引用对象的成员变量,通用格式:对象名.变量;(2)通过对象调用对象的成员方法,通用格式:对象名.方法名([参数列表]);157例如:假定已定义了一个有年龄、速度和皮毛颜色的Rabbit类,则Rabbitrabbit=newRabbit();rabbit.age=3; //兔子3岁rabbit.speed=100; //跑的速度是每秒100mrabbit.furcolor='w';//兔子的毛色是白色的158

例6.12对象创建和使用的应用。classPerson{Stringname;Stringsex;intage;Person(Stringn,Strings,inta)//构造方法的定义{name=n;sex=s;age=a;}}159publicclassStudentDemo{publicstaticvoidmain(Stringargs[]){Personya=newPerson("yang","female",20);//构造方法的使用

System.out.println("name="+); //成员变量的引用System.out.println("sex="+ya.sex); //成员变量的引用System.out.println("age="+ya.age); //成员变量的引用}程序运行结果:name=yangsex=femaleage=20160对象作为类的成员变量类成员既可以是基本数据类型,也可以是构造数据类型。例6.14程序运行结果:C:\Java-code>javaObjMember编号:123工作日期:1997,3,21161继承性是软件复用的一种形式,是面向对象编程(OOP)的关键技术之一。新类由已存在的类生成。当用户建立一个新类时,不必全部写出所有的实例变量和实例方法,只需声明该类继承已定义过的“父类”(也叫基类、超类)的实例变量和实例方法,这个新类就称作“子类”,每个子类也可以成为其他某个子类的父类。子类只允许从一个父类中派生出来(通过关键字extends来实现),称为单一继承。162要继承一个类,需要使用关键字extends,把一个类定义为另一个类的子类的格式:

[修饰符]子类名称extends父类名称{类体}163在类的定义中,如果没有使用extends,就默认该类继承Object类。如:(甲)publicclassMyAppletextendsjava.applet.Applet{…}(乙)publicclassMyApplicationextendsFrame{…}(丙)publicclassMyApp{…};164例6.18继承父类的方法和变量。设计一个处理汽车品牌和油量的程序,在该程序中,子类Bus继承父类Car的全部代码和变量。classCar{Stringbrand;//品牌voidsetB(Strings){brand=s;}voidshowB(){System.out.println(brand);}}classBusextendsCar{intgas;//油量voidsetG(intg){gas=g;}voidshowG(){System.out.println(gas);}}

165

classExam6_18{publicstaticvoidmain(Stringargs[]){Busb=newBus();//创建Bus类的实例对象bb.setB("Audi"); //调用父类的方法,设置b的车号b.setG(100);//设置b的油量b.showB(); //调用父类的方法,显示b的车号b.showG(); //显示b的油量}}程序运行结果:Audi1001666.6.3成员变量的隐藏和成员方法的重构在子类中,若定义了与父类同名的成员变量,则只有子类的成员变量有效,而父类中的成员变量无效,意味着子类隐藏了父类同名的成员变量;当子类声明了一个与父类同名的成员方法,子类的成员方法就重构了(或覆盖)了与父类对应的成员方法。1671.成员变量的隐藏子类可以隐藏父类中任何访问权限的成员变量。当子类隐藏了父类的同名成员变量后,实际上子类就有了两个同名的成员变量。子类若要引用父类中的同名成员变量,可以采用如下方法:1)super.成员变量名。2)父类名.成员变量名(仅适用于static变量)。例6-191682.成员方法的重构方法重构和方法重载是完全不同的两个概念。重构指的是,在子类中用与父类中相同的方法名、返回类型和参数,重新构造父类的某一成员方法。当子类重构了父类的方法后,子类就不能直接引用父类的同名方法,子类若要引用父类中的同名实例方法应当使用“super.方法名”的方式。1696.6.5抽象类当我们把类理解成一个类型时,总是假设可以实例化该类型的对象。然而,有时定义一个永远不需要实例化对象的类也是有用的,这样的类称之为抽象类。从继承性的角度看,它们被作为超类使用,所以通常称它们为抽象超类。抽象超类不能实例化对象。对象能被实例化的类叫做具体类。170例6-21Java规定,构造方法、静态方法和私有方法不能成为抽象方法。抽象类的类名前也应冠以abstract。不能用new运算符创建抽象类的实例,抽象类只能用作父类派生子类。当子类继承抽象类时,若没有实现父类所有的抽象方法则这个子类仍为抽象类。子类在实现抽象类中的抽象方法时,不能改变抽象方法的返回类型和参数列表。171172第七章Java接口、包和异常

Java程序设计173本章主要内容接口实现接口的类定义接口的多态性包及创建包类的包外引用异常,不受检异常和受检异常自定义异常类174接口C++语言中在定义一个类时,可以继承多个父类多继承对内存开销较大,给系统的维护、移植带来极大的不便。Java不支持多继承考虑到在实际应用中,Java引入接口的概念。Java支持一个类可以实现一个或多个接口。175接口概述接口与类的差别:类有它的成员变量和成员方法,接口是一组抽象方法和常量的集合。可以认为接口是一种只有常量和抽象方法的特殊抽象类。在定义一个实现接口的类时,一定要实现接口中协议规定的那些方法功能。

接口的意义:达到和C++语言中多继承一样的目的,解决了因多继承所带来的开销过大的问题。通过定义实现同一接口的类,描述了类要实现的功能框架,可以使不相关的类具有相同的行为。接口的作用与抽象类有些类似,但功能比抽象类强,使用也更方便。接口176方法协议所谓方法协议,是指只有方法名和参数,方法返回类型,而没有方法体的一种说明格式它只体现方法的说明,但不指定方法体,真正的方法体是由实现接口的类来实现。与抽象方法的关系:抽象方法的方法体是由子类实现的。

接口177

接口的定义接口定义包括接口的声明和接口体两部分,其语法规则为: [public]interface接口名[extends父接口列表] { [publicstaticfinal]类型常量名=值;[publicabstract]返回类型接口方法名(形参表);… }

178实现接口的类定义实现接口的类定义:[类访问控制修饰词]class类名[extends父类名]implements接口列表 { 类体 }例7-1

179接口的多态性在面向对象程序设计中,继承性和多态性是降低软件复杂性的有效技术。通过使用多态,使系统更容易扩充。改进软件开发的关键是软件重用,通过继承基本类和可用类库,带来软件重用的最大效益。接口180接口的多态性演示演示实现接口的各相关类的多态性:Shape提供求图形面积area协议的接口,类Circle,Triangle和ectangle依据各自情况,实现了接口Shape的area方法,因此,不同对象的求图形面积形式各异,形成多态性。

例7-3

181

包(package)包是对类和接口进行组织和管理的目录结构。Java包可以视为存储相关类和接口的容器。包的另外一个好处是它提供了“唯一类名”的约定

182

创建包包的层次结构名是类访问名的一部分,必须在程序中通过package语句指定。包的定义格式如下: package包名1[{.包名}];其中,package是关键字,包名1[{.包名}]为层次结构包名,用圆点.分隔每个包。

183创建可复用的类的步骤:1)定义一个public类,如果不是public类,它只能被同一包中的其它类引用;2)选择层次结构包名,并用package语句将其加到可复用类的源代码文件中的第一行,指明该类所在的包;注意:此时,第一行不能是空行或注释。3)编译这个类,并放到指定的classpath下,作为顶层包的父目录中。例如,指定classpath为c:\j2sdk1.4.1_02\jre\classes。classes目录在缺省时不存在,必须在第一个要放到该路径中的类之前创建它。创建classes目录的DOS命令:C:\>mdc:\j2sdk1.4.1_02\jre\classes184

类的包外引用

1.import语句import语句的语法:import包名1[{.包名}].类名/*;

其中,import是关键字,包名1[{.包名}]为层次结构包名,用圆点.分隔每个包。*表示引入指定包中的所有的类。

2.直接使用类的访问名 直接使用类的访问名指出要引入,重用的类,类访问名包括层次结构包名和类名两部分:包名1[{.包名}].类名

包185例如,在定义Time类继承com.juj.Time1类时,用两种方法引入Time1类:

importcom.juj.Time1;classTimeextendsTime1;或classTimeextendscom.juj.Time1;186例7.5供重用的Point类,源程序在d:\jujava中,编译存放在com.juj包中。packagecom.juj;publicclassPoint{ private intx,y; //私有成员变量 //重载的构造方法 publicPoint() { } publicPoint(intx,inty) {this.x=x; this.y=y; } //其它成员方法

温馨提示

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

评论

0/150

提交评论