版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java大学实用教程(第3版)第1章
Java语言概述
本章导读
Java语言的诞生学习Java的必要性
Java的特点及与C/C++之关系
Java程序开发JDK1.6编译器的新规定2012-2-52Java的先导知识与后继技术
2012-2-531.1
Java语言的诞生Java诞生于1995年,是Sun公司组织开发的一编程语言,主要贡献者是JamesGosling。1990年Sun公司成立了由JamesGosling领导的开发小组,开始致力于开发一种可移植的、跨平台的语言,该语言能生成正确运行于各种操作系统、各种CPU芯片上的代码。他们的钻研和努力促成了Java语言的诞生。Java的发展得利于Internet和Web的出现,Internet上有各种不同的计算机,它们可能使用完全不同的操作系统和CPU芯片,但仍希望运行相同的程序,Java的出现标志着真正的分布式系统的到来。2012-2-541.2学习Java的必要性
Java不仅可以用来开发大型的桌面应用程序,而且特别适合于Internet的应用开发。目前,Java语言不仅是一门正在被广泛使用的编程语言,而且已成为软件设计开发者应当掌握的一门基础语言。Java语言是面向对象编程,并涉及到网络、多线程等重要的基础知识,而且很多新的技术领域都涉及到了Java语言,因此,学习和掌握Java已成为共识,国内外许多大学已将Java语言列入了本科教学计划,IT行业对Java人才的需求正在不断的增长,一些软件公司对其开发人员周期地进行Java的基础培训工作。在IT行业发达的北美洲,有将近60%的软件开发人员在使用Java完成他们的工作,EvansData公司在2002年做的一项调查中发现,在北美洲,Java的使用率已经接近
C/C++。2012-2-551.3Java的特点
1.平台无关性
Java语言和其他语言相比,最大的优势就是能够在所有的计算机上运行,这也是Java风靡全球的主要原因。2.面向对象面向对象编程是一种先进的编程思想,更加容易解决复杂的问题。3.多线程
Java的特点之一就是内置对多线程的支持。多线程允许同时完成多个任务。4.安全5.动态
2012-2-561.4Java与C/C++之关系
如果你学习过C++语言,你会感觉Java很眼熟,因为Java中许多基本语句的语法和C++一样,像常用的循环语句、控制语句等和C++几乎一样,但不要误解为Java是C++的增强版,Java和C++是两种完全不同的语言,他们各有各的优势,将会长期并存下去,Java语言和C++语言已成为软件开发者应当掌握的语言。
2012-2-571.5Java运行平台
1.三种平台简介
目前Java运行平台主要分为下列3个版本:
JavaSE(曾称作J2SE)——Java标准版或Java标准平台。JavaSE提供了标准的JDK开发平台,利用该平台可以开发Java桌面应用程序和低端的服务器应用程序,也可以开发JavaApplet。JavaEE(曾称作J2EE)——Java企业版或Java企业平台,可以构建企业级的服务应用。JavaEE平台包含了JavaSE平台,并增加了附加类库,以便支持目录管理、交易管理和企业级消息处理等功能。JavaME(曾称作J2ME)——Java微型版或Java小型平台。JavaME是一种很小的Java运行环境,用于嵌入式的消费产品中,如移动电话、掌上电脑或其他无线设备等。
返回2012-2-582.安装JavaSE平台
学习Java必须从JavaSE开始,因此,本书基于JavaSE来学习Java。目前Sun公司已发布了JDK的1.6版本。如果安装JDK选择安装到E:\jdk1.6目录下,则会生成如图1.5的目录结构。
2012-2-59(1)系统环境Path值的设置JDK平台提供的Java编译器(javac.exe)和Java解释器(java.exe)位于Java安装目录的bin文件夹中,为了能在任何目录中使用编译器和解释器,应在系统特性中设置Path。对于Windows2000、Windows2003、WindowsXP,用鼠标右键点击“我的电脑”,弹出菜单,然后选择属性,弹出“系统特性”对话框,再单击该对话框中的高级选项,然后点击按钮“环境变量”,添加如下的系统环境变量(如图1.6所示)。2012-2-510(2)系统环境ClassPath值的设置
编辑系统环境变量ClassPath的值。对于Windows2000、Windows2003、WindowsXP,用鼠标右键点击“我的电脑”,弹出菜单,然后选择属性,弹出“系统特性”对话框,再单击该对话框中的高级选项,然后点击按钮“环境变量”,添加如下的系统环境变量(如图1.7所示)。如果曾经设置过环境变量:ClassPath,可点击该变量进行编辑操作,将需要的值加入即可。对于Win9x,用记事本编辑Autoexec.bat文件,将如下的设置语句加入即可,setclasspth=E:\jdk1.6\jre\lib\rt.jar;.;
也可以在命令行窗口,如MS-DOS窗口键入命令:
setclasspth=E:\jdk1.6\jre\lib\rt.jar;.;2012-2-5111.6Java程序开发
开发一个Java应用程序需经过三个步骤:编写源文件、编译源文件生成字节码、加载运行字节码。1编写源文件
(1)
源文件的结构使用一个文字编辑器,如Edit或记事本,来编写源文件。不可使用Word编辑器,因它含有不可见字符。
Java是面向对象编程,Java应用程序的源文件是由若干个书写形式互相独立的类组成。见例子1
2012-2-512(2)应用程序的主类
一个Java应用程序必须有一个类含有publicstaticvoidmain(Stringargs[])方法,称这个类是应用程序的主类。args[]是main方法的一个参数,是一个字符串类型的数组(注意String的第一个字母是大写的),以后会学习怎样使用这个参数。返回2012-2-513(3)源文件的命名规则
源文件的命名规则是:如果源文件中有多个类,那么只能有一个类是public类;如果有一个类是public类,那么源文件的名字必须与这个类的名字完全相同,扩展名是java;如果源文件没有public类,那么源文件的名字只要和某个类的名字相同,并且扩展名是java就可以了。
(4)良好的编程习惯在编写程序时,一行最好只写一条语句,类体的以方法的大括号最好也独占一行,并有明显的缩进。本书在编写代码时,尽量遵守良好的编程习惯。返回2012-2-5142编译Java源程序
当创建了Hello.java这个源文件后,就要使用编译器(javac.exe)对其进行编译:需要打开MS-DOS命令行窗口,进入C盘,然后进入到1000目录中,如图1.8所示。返回2012-2-5153运行Java程序Java应用程序必须通过Java虚拟机中的Java解释器(java.exe)来解释执行其字节码文件。Java应用程序总是从主类的main方法开始执行。因此,必须如下运行Java应用程序:
C:\1000\>javaHello
运行效果如图1.9所示。2012-2-516当Java应用程序中有多个类时
java命令执行的类名必须是主类的名字例子
page9
必须把源文件保存起来并命名为Tom.java。假设保存Tom.java在C:\1000下。
(1)编译源文件
c:\1000\>javacTom.java
如果编译成功,目录c:\1000下就会有Tom.class和Example.class这两个字节码文件了。(2)
执行
c:\1000\>javaExamplejava命令后的名字必须是主类的名字,运行效果如图1.10所示。返回2012-2-5171.7JDK1.6编译器的兼容性
JDK1.6的编译器javac.exe和以前版本的编译器有了一个很大的不同,不再向下兼容,也就是说,如果在编译源文件时没有特别约定的话,用JDK1.6的编译器生成的字节码只能在安装了高于JDK1.6或JRE1.6的Java平台环境中运行。返回2012-2-5182012-2-519第2章基本数据类型和数组
本章导读标识符和关键字基本数据类型基本数据类型的转换数据的输入与输出数组202.1标识符和关键字
1.标识符用来标识类名、变量名、方法名、类型名、数组名、文件名的有效字符序列称为标识符。简单地说,标识符就是一个名字。
Java语言规定标识符由字母、下划线、美元符号和数字组成,并且第一个字符不能是数字。标识符中的字母是区分大小写的,Beijing和beijing是不同的标识符。
2.关键字
关键字就是Java语言中已经被赋予特定意义的一些单词,它们在程序上有着不同的用途,不可以把关键词作为名字来用。212.2基本数据类型
基本数据类型也称作简单数据类型。Java语言有8种简单数据类型,分别是:boolean、byte、short、int、long、
float、double、char。这8种数据类型习惯上可分为4大类型:逻辑类型:boolean整数类型:byte、short、int、long字符类型:char浮点类型:float、double221.逻辑类型常量:true,false。变量的定义:使用关键字boolean来定义逻辑变量,定义时也可以赋给初值。例:
booleanx,ok=true,关闭=false;
232.整数类型
常量:123,6000(十进制),077(八进制),0x3ABC(十六进制)。
整型变量的定义分为4种。(1)int型使用关键字int来定义int型整型变量,定义时也可以赋给初值,例如:intx,平均=9898;对于int型变量,内存分配给4个字节(byte)。
int型变量的取值范围是:-231~
231-1。(2)byte型使用关键字byte来定义byte型整型变量。对于byte型变量,内存分配给1个字节,占8位,byte型变量的取值范围是-27~27-1。(3)short型使用关键字short来定义short型整型变量。对于short型变量,内存分配给2个字节,short型变量的取值范围是-215~215-1。(4)long型使用关键字long来定义long型整型变量,对于long型变量,内存分配给8个字节,long型变量的取值范围是-263~263-1。243.字符类型常量:
Uincode表中的字符就是一个字符常量,例如'A','?','9','好','き’'
等。
Java还使用转意字符常量,如:'\n'表示换行,'\b'表示退格
'\t'表示水平制表'\''表示单引号变量的定义:使用关键字char来定义字符变量,例如:
charx='A',漂亮='假',jiafei;char类型变量内存分配给2个字节,占16位,最高位不是符号位,没有负数。Char类型变量的取值范围是0~65535。对于charx='a';内存中存储的是97,97是字符
'a'在Unicode表中的排序位置。因此,允许将上面的语句写成
charx=97;
下面的例子2-1中,用显示转换来显示一些字符在Unicode表中的位置,以及某些位置上的字符。效果如图2-1所示.25例子2-1效果图264.浮点类型
浮点型分两种
(1)float型
常量:
453.5439f,21379.987F,2e40f(2乘10的40次方,科学计数法)
变量的定义:
使用关键字float来定义float型变量。对于float型变量,内存分配给4个字节,其取值范围是10-38~1038和-1038~-10-38。
(2)double型
常量:
21389.5439d(d可以省略),23189908.987,123.0,6e-140(6乘10的-140次方,科学计数法)。变量的定义:使用关键字double来定义double型变量。double型变量,内存分配给8个字节,double型变量的取值范围大约是10-308~10308
和-10308
~-10-308。272.3基本数据类型的转换
基本数据类型的转换就是把一种基本数据类型变量转变成另一种基本类型变量。下列基本类型会涉及数据转换,不包括逻辑类型和字符类型。我们将这些类型按精度从“低”到“高”排列了顺序:
byteshortintlongfloatdouble
当把级别低的变量的值赋给级别高的变量时,系统自动完成数据类型的转换,如int型转换成long型。当把级别高的变量的值赋给级别低的变量时,必须使用显示类型转换运算。显示转换的格式:
(类型名)要转换的值;例如,intx=(int)34.89;longy=(long)56.98F;如果输出x和y的值将是34和56
例如,bytea=(byte)128;byteb=(byte)(
129);那么,a和b的值分别是
128和127。下面的例子2-2中,显示了类型转换的结果。效果如图2-2所示.28例子2-2效果图292.4数据的输入与输出
由于C语言出现的比较早,那个时候还没有图形用户界面的概念(GraphicsUserInterface),因此,C语言提供了许多用来输入、输出数据的函数,例如printf、scanf等。Java不象C,提供在命令行进行数据输入、输出的功能不多。关于输入、输出我们将在第九章详细介绍,现在只需知道它的作用是在命令行窗口(例如,MS-DOS窗口)输出数据即可。Sun公司新推出的JDK1.5又新增了一些在命令行进行数据输入、输出的功能。301数据输出System.out.printf
System.out.printf的功能完全类似C语言中的printf函数。pringf的一般格式:
printf(格式控制部分,表达式1,表达式2,…表达式n);
这里的用法与C语言相同,这里不再累述。下面的例子2-3中,来进一步了解System.out.printf数据输出。效果如图2-3所示。312数据的输入Scanner
Scanner是SDK1.5新增的一个类,可以使用该类创建一个对象:
Scannerreader=newScanner(System.in);
然后reader对象调用下列方法(函数),读取用户在命令行输入的各种数据类型,nextByte(),nextDouble(),nextFloat(),nextInt(),nextLine(),nextLong(),nextShort()。下面的例子2-4中,用户在键盘依次输入若干个数字,每输入一个数字都需要按回车键确认,最后在键盘输入一个非数字字符串结束整个输入操作过程。程序将计算出这些数的和以及平均值。。效果如图2-4所示。322.5数组
数组是相同类型的数据按顺序组成的一种复合数据类型。通过数组名加数组下标来使用数组中的数据。下标从0开始。
1.声明数组声明数组包括数组的名字、数组包含的元素的数据类型。
声明一维数组有下列两种格式:
数组元素类型数组名字[];数组元素类型[]数组名字;
声明二维数组有下列两种格式:
数组元素类型数组名字[][];数组元素类型[][]数组名字;332创建数组
声明数组仅仅是给出了数组名和元素的数据类型,要想使用数组还必须为它分配内存空间,即创建数组。
在为数组分配内存空间时必须指明数组的长度。格式如下:
数组名字=new数组元素的类型[数组元素的个数];
例如:
boy=newfloat[4];声明数组和创建数组可以一起完成,如
floatboy[]=newfloat[4];
intmytwo[][]=newint[3][4];
为数组分配内存空间后,数组boy获得4个用来存放float类型数据的内存空间,内存示意如图2.5所示。
343数组元素的使用
一维数组通过下标符访问自己的元素,如boy[0],boy[1]等。需要注意的是下标从0开始,因此,数组若是7个元素,下标到6为止,如果你将来使用下标超过6将会发生异常。二维数组也通过下标符访问自己的元素,如a[0][1],a[1][2]等。下标也是从0开始。354数组的初始化
创建数组后,系统会给每个数组元素一个默认的值,如,float型是0.0。我们在声明数组时同时也还可以给数组的元素一个初始值,如:
floatboy[]={21.3f,23.89f,2.0f,23f,778.98f};
365length的使用
对于一维数组,"数组名字.length"的值就是数组中元素的个数;对于二维数组"数组名字.length"的值是它含有的一维数组的个数。例如,对于float[]a=newfloat[12];int[][]b=newint[3][6];a.length的值12;而b.length的值是3。
376数组的引用
数组属于引用型变量,因此两个相同类型的数组如果具有相同的引用,它们就有完全相同的元素。例如,对于
int[]a={1,2,3},b={4,5};
如果使用了赋值语句:a=b;那么,a中存放的引用就和b的相同,这时系统将释放最初分配给数组a的元素,使得a的元素和b的元素相同,即a[0],a[1]就是b[0],b[1],而最初分配给数组a的三个元素已不复存在.
下面让我们结合例子2-5来看怎样使用数组。效果如图2-6所示。38例子2-5效果图3940第3章运算符、表达式与语句
本章导读算术运算符和算术表达式关系运算符与关系表达式逻辑运算符与逻辑表达式赋值运算符与赋值表达式移位运算符位运算符和条件运算符instanceof运算符一般表达式语句概述分支语句、循环语句和跳转语句413.1算术运算符和算术表达式(1)加减运算符加减运算的运算符号分别为+和
,是双目运算符。加减运算的结合性是从左到右。加减运算的操作元是整型或浮点型数据,加减运算符的优先级是4级。(2)乘、除和求余运算符乘、除和求余运算的运算符号为*、/、%,都是双目运算符。*、/、%运算符的结合性是从左到右,例如:2*3/8,先计算2*3,然后再将得到的结果除以8。乘、除和求余运算的操作元是整型或浮点型数据。*、/、%运算符的优先级是3级。
42(3)自增、自减运算符
自增、自减运算的运算符号为++、--,都是单目运算符,运算符的优先级是2级。运算符可以放在操作元之前,也可以放在操作元之后,但操作元必须是一个整型或浮点型变量(不能是常量或表达式)。运算符的作用是使变量的值增1或减1,如:
++x,--x表示在使用x之前,先使x的值加(减)1。
x++,x--表示在使用x之后,使x的值加(减)1。粗略地看,++x和x++的作用相当于x=x+1。但++x和x++的不同之处在于,++x是先执行x=x+1再使用x的值,而x++是先使用x的值再执行x=x+1。如果x的原值是5,则:对于y=++x;y的值为6。对于y=x++;y的值为5,然后x的值变为6。43(4)算术表达式
用算术符号和操作元连接起来的符合Java语法规则的式子,称为算术表达式。如
x+2*y-30+3*(y+5)-12+n+(--n)(5)算术混合运算的精度精度从“低”到“高”排列的顺序是:
byteshortintlongfloatdoubleJava将按运算符两边的操作元的最高精度保留结果的精度,例如:5/2的结果是2,要想得到2.5,必须写成5.0/2或5.0f/2。
char型数据和整型数据运算结果的精度是int。例如:bytek=18;
那么‘H’+k;
的结果是int型,因此下列写法是不正确的,
charch=’H’+k;
应当写成:
charch=(char)(’H’+k);443.2关系运算符与关系表达式
关系运算符用来比较两个值的关系,关系运算符的运算结果是boolean型数据,当运算符对应的关系成立时,运算结果是true,否则是false。
(1)大小关系运算符大小关系运算的符号分别是>、>=、<、<=,都是双目运算符,操作元是数值型的常量、变量或表达式。例如,10<9的结果是false,5>1的结果是true。大小关系运算符的级别是6级。(2)等与不等关系等与不等关系运算的符号分别是"=="和"!=",都是双目运算符。运算符的级别是7级。
(3)关系表达式结果为数值型的变量或表达式可以通过关系运算符形成关系表达式。例如,24>18,(x+y+z)>30+x等。453.3逻辑运算符与逻辑表达式
逻辑运算用来实现boolean型数据的逻辑“与”、“或”和“非”运算,运算结果是boolean型数据。
(1)逻辑“与”和逻辑“或”逻辑“与”和逻辑“或”运算的符号是"&&"、"||",是双目运算符,操作元是boolean型的变量或求值结果是boolean型数据的表达式。"&&"的运算法则是:当两个操作元的值都是true时,运算结果是true,否则是false。"||"的运算法则是:当两个操作元的值都是flase时,运算结果是false,否则是true。"&&"和"||"的级别分别是11和12级,结合性是左到右。短路逻辑运算符:
逻辑运算符"&&"和"||"也称做短路逻辑运算符。
进行op1&&op2运算时,如果op1的值是false,"&&"运算符在运算时不再去计算op2的值,直接就得出op1&&op2的结果是false。
当op1的值是true时,"||"运算符在运算时不再去计算op2的值,直接就得出op1||op2的结果是true。
46(2)逻辑“非”
逻辑“非”运算的符号是"!",是单目运算符,操作元在左面。当操作元的值是TURE时,运算结果是FALSE;反之为TURE。"!"的运算级别是2级,结合性从右到左。例如,!!X相当于!(!X)。(3)逻辑表达式结果为boolean型的变量或表达式可以通过逻辑运算符形成逻辑表达式。例如,24>18&&4<0,x!=0||y!=0。473.4赋值运算符与赋值表达式
赋值运算符:=。赋值运算符是双目运算符,左面的操作元必须是变量,不能是常量或表达式。设x是一个整型变量,y是一个boolean型变量,x=120和
y=false都是正确的赋值表达式,赋值运算符的优先级较低,是14级,结合方向右到左。赋值表达式的值就是“=”左面变量的值。注意不要将赋值运算符“=”与等号运算符“==”混淆。
483.5移位运算符
位运算符用来对二进制位进行操作,分为左移位操作和右移位操作。
(1)左移位运算符左移位运算的符号为<<,是双目运算符。左移位运算符左面的操作元称作被移位数,右面的操作数称作移位量,操作元必须是整型类型的数据。假设a是一个被移位的整型数据,n是位移量。
a<<n运算的结果是通过将a的所有位都左移n位,每左移一个位,左边的高阶位上的0或1被移出丢弃,并用0填充右边的低位。
例如int类型数据7的二进制表示是00000000000000000000000000000111
可以对整型数据进行移位运算:左移位或右移位运算。例如,7<<1得到的结果是:00000000000000000000000000001110
整数14
对于byte或short型数据,a<<n的运算结果是int型精度。当进行
a<<2
运算时,计算系统首先将a升级为int型数据,对于正数将高位用0填充;负数用1填充。
注:如果把a<<1的结果赋值给一个byte型变量就必须进行强制转换运算:
byteb=(byte)(a<<1);49(2)右移位运算符
右移位运算的符号为">>",是双目运算符。假设a是一个被移位的整型数据,n是位移量。
a>>n运算的结果是通过将a的所有位都右移n位,每右移一个位,右边的低阶位被移出丢弃,并用0或1填充左边的高位,a是正数用0填充,负数时用1填充。因此,a每右移一次,如果该数的每一计算有效位都没有从低位移出时,就相当于将a除以2并舍弃了余数。整数不断右移位的最后结果一定是0,而负数不断右移位的最后结果是-1。
对于byte或short型数据,a>>n的运算结果是int型精度。下面的例子3-1中,显示了类型转换的结果。效果如图3-1所示.50例子3-1效果图513.6位运算符
(1)“按位与”运算符
"&"是双目运算符,对两个整型数据a、b按位进行运算,运算结果是一个整型数据c。运算法则是:如果a、b两个数据对应位都是1,则c的该位是1,否则是0。如果b的精度高于a,那么结果c的精度和b相同。
(2)“按位或”运算符
"|"是双目运算符。对两个整型数据a、b按位进行运算,运算结果是一个整型数据c。运算法则是:如果a、b两个数据对应位都是0,则c的该位是0,否则是1。如果b的精度高于a,那么结果c的精度和b相同。
(3)“按位非”运算符
"~"是单目运算符。对一个整型数据a按位进行运算,运算结果是一个整型数据c。运算法则是:如果a对应位是0,则c的该位是1,否则是0。52(4)“按位异或”运算符"^"是双目运算符。对两个整型数据a、b按位进行运算,运算结果是一个整型数据c。运算法则是:如果a、b两个数据对应位相同,则c的该位是0,否则是1。如果b的精度高于a,那么结果c的精度和b相同。位运算符在操作逻辑型数据时,与逻辑运算符&&、||、!不同的是位运算要计算完a和b之后再给出运算的结果。在下面的例子3-2中,利用“异或”运算的性质,对几个字符进行加密并输出密文,然后再解密。运行结果见图3-2。
533.7条件运算符
条件运算符是一个3目运算符,它的符号是:"?:",需要连接3个操作元,用法如下:
op1?op2:op3
要求第一个操作元op1的值必须是boolean型数据。
运算法则是:当op1的值是true时,op1?op2:op3运算的结果是op2的值;当op1的值是false时,op1?op2:op3运算的结果是op3的值。例如,12>8?100:200的结果是100;
12<8?100:200的结果是200。543.8instanceof运算符
该运算符是双目运算符,左面的操作元是一个对象,右面是一个类。当左面的对象是右面的类创建的对象时,该运算的结果是true,否则是false。553.9一般表达式
Java的一般表达式就是用运算符及操作元连接起来的符合Java规则的式子,简称表达式。一个Java表达式必须能求值,即按着运算符的计算法则,可以计算出表达式的值。例如,假如intx=1,y=-2,n=10;
那么,表达式
x+y+(--n)*(x>y&&x>0?(x+1):y)
的值是int型数据,结果为17。563.10语句概述
Java里的语句可分为以下5类:
(1)方法调用语句在第4章将介绍类、对象等概念,对象可以调用类中的方法产生行为,例如:reader.nextInt();
(2)表达式语句一个表达式的最后加上一个分号就构成了一个语句,称作表达式语句。分号是语句不可缺少的部分。例如,赋值语句:x=23;(3)复合语句可以用“{”和“}”把一些语句括起来构成复合语句,一个复合语句也称作一个代码块。例如,
{z=23+x;System.out.println("hello");}
(4)控制语句
控制语句包括:条件分支语句、循环语句和跳转语句。
(5)package语句和import语句
package语句和import语句与类、对象有关,将在第4章讲解。573.11分支语句1.条件分支语句
(1)if-else语句.if-else语句是Java中的一条语句,由一个“if”、“else”和两个复合语句按一定格式构成,if-else语句的格式如下:
if(表达式){
若干语句
}else{
若干语句
}
一条if-else语句的作用是根据不同的条件产生不同的操作,执行法则如下:
if后面()内的表达式的值必须是boolean型的。如果表达式的值为true,则执行紧跟着的复合语句;如果表达式的值为false,则执行else后面的复合语句。58(2)多条件if-elseif-else语句
程序有时需要根据多条件来选择某一操作,这时就可以使用if-elseif-else语句。if-elseif-else语句是Java中的一条语句,由一个“if”、若干个“elseif”、一个“else”与若干个复合语句按一定规则构成。语句的格式如下:
if(表达式1){
若干语句
}elseif(表达式2){
若干语句
}……elseif(表达式n){
若干语句
}else{
若干语句
}59if-elseif-else语句的执行法则如下:
有时为了编程的需要,复合语句中可以没有任何语句。一条if-elseif-else语句的作用是根据不同的条件产生不同的操作,执行法则如下:
if以及elseif后面()内的表达式的值必须是boolean型的。该语句执行时,首先计算if后括号中的表达式的值,如果该表达式的值为true,则执行紧跟着的复合语句,然后就结束整个语句的执行;如果if后括号中的表达式的值为false,就依次再计算后面的elseif的表达式的值,直到出现某个表达式的值为true为止,然后执行该elseif后面的复合语句,结束整个语句的执行。如果所有的表达式的值都是false,就执行else后面复合语句,结束整个语句的执行。在下面的例子3中,用户在键盘输入3个数,程序判断这3个数能构成什么形状的三角形。运行结果见图3-3。
602.switch开关语句switch语句是多分支的开关语句,它的一般格式定义如下:switch(表达式){case常量值1:若干个语句
break;
case常量值2:若干个语句
break;
………case常量值n:若干个语句
break;
default:若干语句}
switch语句中表达式的值必须是整型或字符型;常量值1到常量值n必须也是整型或字符型。switch语句首先计算表达式的值,如果表达式的值和某个case后面的常量值相同,就执行该case里的若干个语句,直到碰到break语句为止。若没有任何常量值与表达式的值相同,则执行default后面的若干个语句。其中default是可有可无的,如果它不存在,并且所有的常量值都和表达式的值不相同,那么switch语句就不会进行任何处理。需要注意的是,在同一个switch语句中,case后的常量值必须互不相同。下面的例子4使用了switch语句,用户在键盘输入一个代表月份的整数,程序输出是该月是在年度的第几季度。运行结果见图3-4.61例子3-4效果图623.12循环语句
1.while循环
while语句的一般格式:
while(表达式){
若干语句
}
while语句由关键字while、括号中的一个求值为boolean型数据的表达式和一个复合语句组成,其中的复合语句称作循环体,循环体只有一条语句时,大括号“{}”可以省略,但最好不要省略,以便增加程序的可读性。表达式称作循环条件。
while语句的执行规则是:
(1)计算表达式的值,如果该值是true时,就进行(2),否则进行(3)。(2)执行循环体,再进行(1)(3)结束while语句的执行
while语句执行规则如流程图3-5所示。63while语句执行规则流程图3-5
do
while语句执行规则流程图3-6642.do-while循环
一般格式:
do{
若干语句
}while(表达式);
do-while循环和while循环的区别是do-while的循环体至少被执行一次,如图3.6所示。下面的例子5分别用while和do-while循环计算常数e的近似值e=1+1/1+1/2!+1/3!+……。
653.for循环
for语句的一般格式:
for(表达式1;表达式2;表达式3){
若干语句
}for语句由关键字for、括号中用分号分割的3个表达式,以及一个复合语句组成,其中的“表达式2”必须是一个求值为boolean型数据的表达式,而复合语句称作循环体。
for语句的执行规则是(流程图3-8):
(1)计算“表达式1”,完成必要的初始化工作(2)判断“表达式2”的值,若“表达式2”的值为true,则进行(3),否则进行(4)。(3)执行循环体,然后计算“表达式3”,以便改变循环条件,进行(2)。(4)结束for语句的执行.
一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如,6=1+2+3。下面的例子6使用for循环计算出1000内的全部完数.效果如图3-9.66for语句执行规则流程图3-867例子3-6效果图683.13跳转语句
跳转语句是指用关键break或continue加上分号构成的语句,例如:
break;
在循环语句的循环体中使用跳转语句。在一个循环中,比如循环50次的循环语句中,如果在某次循环体的执行中执行了break语句,那么整个循环语句就结束。如果在某次循环体的执行中执行了continue语句,那么本次循环就结束,即不再执行本次循环中循环体中continue语句后面的语句,而转入进行下一次循环。下面的例子7和例子8使用的跳转语句。6970
本章导读
类声明和类体及其构成
构造方法与对象的创建
对象的引用与实体
成员变量、方法和方法重载
关键字this包第4章
类与对象
本章导读import语句访问权限对象的组合基本类型数据的类包装反编译和文档生成器JAR文件的使用714.1面向对象编程
1.面向对象编程的三个特性
(1)封装:面向对象编程核心思想之一就是将数据和对数据的操作封装在一起。通过抽象,即从具体的实例中抽取共同的性质形成一般的概念,比如类的概念。人们经常谈到的机动车类就是从具体的实例中抽取共同的属性和功能形成的一个概念,那么一个具体的轿车就是机动车类的一个实例,即对象。一个对象将自己的数据和对这些数据的操作合理有效地封装在一起,例如,每辆轿车调用“加速”、“减速”改变的都是自己的运行速度。
(2)继承继承体现了一种先进的编程模式。子类可以继承父类的属性和功能,即继承了父类所具有的数据和数据上的操作,同时又可以增添子类独有的数据和数据上的操。
(3)多态多态是面向对象编程的又一重要特征。有两种意义的多态,一种是操作名称的多态,即有多个操作具有相同的名字,但这些操作所接收的消息类型必须不同。另一种多态是和继承有关的多态,是指同一个操作被不同类型对象调用时可能产生不同的行为。722.提出一个简单的问题
例题4-1能输出圆的面积,效果如图4-1所示。
通过运行上述Java应用程序注意到这样一个事实:如果其他Java应用程序也想计算圆的面积,同样需要知道计算圆面积的算法,即也需要编写和这里同样多的代码。现在提出如下问题:
能否将和圆有关的数据以及计算圆面积的代码进行封装,使得需要计算圆面积的Java应用程序的主类无需编写计算面积的代码就可以计算出圆的面积呢?
733.简单的Circle类
面向对象的一个重要思想就是通过抽象得到类,即将某些数据以及针对这些数据上的操作封装在一个类中,也就是说,抽象的关键点有两点一是数据,二是数据上的操作。我们对所观察的圆做如下抽象:
☃圆具有半径之属性。
☃可以使用半径计算出圆的面积。现在根据如上的抽象,编写出如下的Circle类。classCircle{doubleradius;//圆的半径
doublegetArea(){//计算面积的方法
doublearea=3.14*radius*radius;returnarea;}}(1)类声明:上述代码第一行中的classCircle称作类声明,Circle是类名。(2)类体:类声明之后的一对大括号“{”,“}”以及它们之间的内容称作类体,大括号之间的内容称作类体的内容。744.使用Circle类创建对象
在例子4-2的主类中使用Circle类创建对象,该对象可以完成计算圆面积的任务(主类不必知道计算圆面积的算法)
。由于类也是一种数据类型,因此可以使用类来声明一个变量,那么,在Java语言中,用类声明的变量就称之为一个对象。用Circle声明一个名字为circle的对象的代码如下:
Circlecircle;为Circle类声明的circle对象分配变量的代码如下:
circle=newCircle();对象通过使用“.”运算符操作自己的变量和调用方法。对象操作自己的变量的的格式为:对象.变量;
例如,circle.radius=100;调用方法的格式为:对象.方法;
例如,circle.getArea();在例子4-2中的Example4_2.java及编译得到的Circle类的字节码文件Circle.class保存在C:\ch4中,程序运行效果如图4.2。755.Java应用的程序的基本结构
一个Java应用程序是由若干个类所构成,但必须有一个主类,即含有main方法的类,Java应用程序总是从主类的main方法开始执行。在编写一个Java应用程序时,可以编写若干个Java源文件,每个源文件编译后产生每个类的字节码文件。因此,经常需要进行如下的操作。▲将应用程序涉及的Java源文件保存在相同的目录中,分别编译通过,得到Java应用程序所需要的字节码文件。▲运行主类注:如果应用程序的主类的源文件和其他的源文件在同一目录中,也可以只编译主类的源文件,Java系统会自动地先编译主类需要的其它源文件。Java程序以类为“基本单位”,即一个Java程序就是由若干个类所构成。一个Java程序可以将它使用的各个类分别存放在不同的源文件中,也可以将它使用的类存放在一个源文件中。一个源文件中的类可以被多个Java程序使用,从编译角度看,每个源文件都是一个独立的编译单位,当程序需要修改某个类时,只需要重新编译该类所在的源文件即可,不必重新编译其他类所在的源文件,这非常有利于系统的维护。764.2类声明和类体
类是组成Java程序的基本要素。类封装了一类对象的状态和方法。类是用来定义对象的模板。可以用类创建对象,当使用一个类创建了一个对象时,我们也说给出了这个类的一个实例。在语法上,类由两部分构成:类声明和类体。基本格式为:
class类名{
类体的内容……}
class是关键字,用来定义类。“class类名”是类的声明部分,类名必须是合法的Java标识符。两个大括号“{”、“}”以及之间的内容称作类体。例如
class机动车{
…
…}77类名的命名习惯
习惯上,类名的第一个字母大写,但这不是必须的。
类的名字不能是Java中的关键字,要符合标识符规定,即名字可以由字母、下划线、数字或美元符号组成,并且第一个字符不能是数字。但给类命名时,最好遵守下列习惯:(1)如果类名使用拉丁字母,那么名字的首字母使用大写字母,如Hello、Time、,People等。(2)类名最好容易识别、见名知意。当类名由几个“单词”复合而成时,每个单词的首写字母使用大写,如BeijingTime、AmericanGame、HelloChina等。
784.3类体的构成
写类的目的是为了描述一类事物共有的属性和功能,即将数据和对数据的操作封装在一起,这一过程由类体来实现。类体内容可以有两种类型的成员:
1.成员变量:通过变量声明定义的变量,称作成员变量或域,用来刻画类创建的对象的属性。
2.方法:方法是类体的重要成员之一。其中的构造方法是具有特殊地位的方法,供类创建对象时使用,用来给出类所创建的对象的初始状态,另一类方法,可以由类所创建的对象调用,对象调用这些方法操作成员变量形成一定的算法,体现对象具有某种功能。79类名为“机动车”的类
类体内容的变量定义部分定义了2个float类型的变量:“weight”、“height”和一个int型变量“speed”;方法定义部分定义了3个方法:“changSpeed”、“getWeight”和“getHeight”。class机动车{intspeed; //变量定义部分
floatweight,height; //变量定义部分
voidchangSpeed(intnewSpeed){ //方法定义
speed=newSpeed;}floatgetWeight(){ //方法定义
returnweight;}floatgetHeight(){ //方法定义
returnheight;}}80关于成员变量
成员变量的类型可以是Java中的任何一种数据类型,包括前面学习过的基本类型:整型、浮点型、字符型、数组以及后面要学习的对象及接口。成员变量在整个类内都有效,与它在类体中书写的先后位置无关(“机动车”)。在定义类的成员变量时可以同时赋予初值,表明类所创建的对象的初始状态。注意:对成员变量的操作只能放在方法中,方法可以对成员变量进行操作形成算法,见P41例子。814.4构造方法与对象的创建
类中有一部分方法称作构造方法,类创建对象时需使用构造方法,以便给类所创建的对象一个合理的初始状态。构造方法是一种特殊方法,它的名字必须与它所在的类的名字完全相同,并且不返回任何数据类型,即它是void型,但void必须省略不写。
Java允许一个类中有若干个构造方法,但这些构造方法的参数必须不同,即或者是参数的个数不同,或者是参数的类型不同。下面的Rect类有两个构造方法:
classRect{doublesizdA,siddB;Rect(){}//无参数构造方法。
Rect(doublea,doubleb){//有参数构造方法。
sideA=a;sideB=b;}doublecomputerArea(){returnsideA*sideB;}doublecomputerGirth(){return(sizeA+sideB)*2;}}821.对象的声明
一般格式为:类的名字
对象名字;
如:
RectrectangleOne;
声明对象变量rectangleOne后,rectangleOne的内存中还没有存放数据,也就是说该对象还没有“引用”任何实体,我们称这时的rectangleOne是一个空对象。
832.为声明的对象分配成员变量
使用new运算符和类的构造方法为声明的对象分配成员变量,如果类中没有构造方法,系统会调用默认的构造方法(默认的构造方法是无参数的,你一定还记得构造方法的名字必须和类名相同这一规定),上述的Rect类提供了两个构造方法,下面都是合法的创建对象的语句:
rectangleOne=newRect();
或
rectangleOne=newRect(10,20);
此代码会实现下述两件事:
(
1)为成员变量分配内存空间,然后执行构造方法中的语句。(2)给出一个信息,已确保这些成员变量是属于对象rectangleOne的。
对象的声明和分配成员变量两个步骤可以用一个等价的步骤完成,如
RectrectangleOne=newRect(10,20);
843.创建多个不同的对象
一个类通过使用new运算符可以创建多个不同的对象,这些对象将被分配不同的内存空间,因此,改变其中一个对象的状态不会影响其它对象的状态。例如,我们使用前面的Rect类创建两个对象:
RectrectangleOne,rectangleTwo;rectangleOne=newRect(10,20);rectangleTwo=newRect(33,66);
当创建对象rectangleOne时,Rect类中的成员变量sizeA、sizeB被分配内存空间,并返回一个引用给ectangleOne;当再创建一个对象rectangleTwo时,Rect类中的成员变量sizeA、sizeB再一次被分配内存空间,并返回一个引用给rectangleTwo。内存模型如图4-5所示。854.使用对象
对象不仅可以操作自己的变量改变状态,而且还拥有了使用创建它的那个类中的方法的能力,对象通过使用这些方法可以产生一定的行为。通过使用运算符“.”,对象可以实现对自己的变量访问和方法的调用。(1)对象操作自己的变量(对象的属性)(2)对象调用类中的方法(对象的功能)(3)体现封装当对象调用方法时,方法中出现的成员变量就是指该对象的成员变量。
下面例子4-3中,“Lader”类创建了2个对象laderOne,laderTwo.效果如图4-6所示.864.5对象的引用与实体
我们已经知道,当用类创建一个对象时,成员变量被分配内存空间,这些内存空间称做该对象的实体或变量,而对象中存放着引用,以确保这些变量由该对象操作使用。因此,如果两个对象有相同的引用,那么就具有同样的实体。假如使用例4-3中类Lader的构造方法创建了两个对象t1和t2(内存示意如图4.7所示):
t1=newLader(11,22,33);t2=newLader(6,12,18);若在程序中使用了下述赋值语句:
t1=t2;
它把t2的引用赋给了t1,那么t1和t2引用的实体就是一样的了。系统将取消原来分配给t1的实体,即分配给t1的成员变量的内存将被释放,内存示意如图4.8所示.874.6成员变量
1.类变量和实例变量
用关键字static修饰的成员变量称作静态变量或类变量,而没有使用static修饰的成员变量称作实例变量。例如,下述A类中,x是实例变量,而y是类变量。
classA{floatx;staticinty;}
类变量是与类相关联的数据变量,也就是说,类变量是和该类所创建的所有对象相关联的变量,改变其中一个对象的这个类变量就同时改变了其它对象的这个类变量。因此,类变量不仅可以通过某个对象访问也可以直接通过类名访问。
实例变量仅仅是和相应的对象关联的变量,也就是说,不同对象的实例变量互不相同,即分配不同的内存空间,改变其中一个对象的实例变量不会影响其它对象的这个实例变量。实例变量必须通过对象访问。下面例子4-4中,两个“Lader”对象共享bottom。效果如图4.988图4.9例子4-4效果图
图4.10对象共享类变量892.常量
如果一个成员变量修饰为final,就是常量,常量的名字习惯用大写字母,例如:
finalintMAX;final修饰的成员变量不占用内存,这意味着在声明final成员变量时,必须要初始化。对于final修饰的成员变量,对象可以操作使用,但不能做更改操作。下面的例子4-5给出了常量的用法。904.7方法
我们已经知道,类体内容可以有2种类型的成员:成员变量和方法。其中一部分方法称作构造方法,供类创建对象时使用,用来给出类所创建的对象的初始状态。另一部分方法可分为实例方法和类方法,类所创建的对象可以调用这些方法形成一定的算法,体现对象具有某种功能。当对象调用方法时,方法中出现的成员变量就是指分配给该对象的成员变量。对象不可以调用构造方法,构造方法是专门用来创建对象的。方法的定义包括两部分:方法声明和方法体。一般格式为:
方法声明部分{
方法体的内容
}911.方法声明和方法体
最基本的方法声明包括方法名和方法的返回类型,返回类型也简称作方法的类型。如:
floatarea(){….}
方法的名字必须符合标识符规定。在给方法起名字时应遵守以下习惯:名字如果使用拉丁字母,首写字母使用小写。如果由多个单词组成,从第2个单词开始的其它单词的首写字母使用大写。例如
floatgetTrangleArea()voidsetCircleRadius(doubleradius)
等。方法声明之后的一对大括号“{”、“}”以及之间的内容称作方法的方法体。类中的方法必须要有方法体,如果方法的类型是void类型,方法体中也可以不书写任何语句。922.方法体的构成
方法体的内容包括变量的定义和合法的Java语句。在方法体中声明的变量以及方法的参数称作局部变量,局部变量仅仅在该方法内有效。方法的参数在整个方法内有效,方法内定义的局部变量从它定义的位置之后开始有效。局部变量的名字必须符合标识符规定,遵守习惯:名字如果使用拉丁字母,首写字母使用小写。如果由多个单词组成,从第2个单词开始的其它单词的首写字母使用大写。
933.实例方法与类方法
除构造方法外,其他的方法可分为实例方法或类方法。方法声明中用关键字static修饰的称作类方法或静态方法,不用static修饰的称作实例方法。一个类中的方法可以互相调用:实例方法可以调用该类中实例方法或类方法;类方法只能调用该类的类方法,不能调用实例方法;例如:
(P49例子.txt)A类中的max方法和getMaxSqrt方法是类方法;sum和min方法是实例方法。实例方法可以操作成员变量,无论是实例变量或类变量;而类方法只能操作类变量不能操作实例变量,也就是说类方法中不能有操作实例变量的语句。二者为何有着这样的区别呢?(1)实例方法必须通过对象来调用(2)类方法可以通过类名调用无论类方法或实例方法,当被调用执行时,方法中的局部变量才被分配内存空间,方法调用完毕,局部变量即刻释放所占的内存。下面的例子4-6,通过类名调用类方法。944.参数传值
当方法被调用时,如果方法有参数,参数必须要实例化,即参数变量必须有具体的值。在Java中,方法的所有参数都是“传值”的,也就是说,方法中参数变量的值是调用者指定的值的拷贝。如果向方法的int型参数x传递一个int值,那么参数x得到的值是传递值的拷贝。方法如果改变参数的值,不会影响向参数“传值”的变量的值。
(1)基本数据类型参数的传值对于基本数据类型的参数,向该参数传递的值的级别不可以高于该参数的级别。
下面的例子7中,向一个方法的基本型参数传值。效果如图4.11
95(2)引用类型参数的传值Java的引用型数据包括我们以前学习过的对象、数组以及后面将要学习的接口。当参数是引用类型时,“传值”传递的是变量的引用而不是变量所引用的实体。图4-12引用类型参数的传值如果改变参数变量所引用的实体,就会导致原变量的实体发生同样的变化,因为,两个引用型变量如果具有同样的引用,就会用同样的实体。但是,改变参数的引用不会影响向其传值的变量的引用。下面的例子8向一个方法的引用型参数传值。效果如图4.13
96例题4-9在上述例4-8中,cat调用方法f把对象jerry的引用“传值”给参数mouse后,对象jerry和对象mouse就具有同样的成员变量,即同样的实体。因此,jerry和mouse就具有同样的功能,即mouse调用方法产生的行为和jerry
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 新品试产风险控制与管理反馈信件5篇范文
- 弘扬文明礼仪,守护美好心灵,几年级主题班会课件
- 年终客户服务团队绩效评定确认函(7篇)
- 5.1.1 任意角高一上学期必修一数学课件人教A版
- 临床妇产科三基三严考试题库及答案
- 2026年新业务项目合作意向书确认函3篇
- 第8章 齿轮传动-5.齿廓啮合基本定律
- 安全知识我知道:小学生安全教育主题班会课件
- 分层作业教学责任落实办法
- 2026全国特种作业操作证高压电工题及答案
- 注塑车间品质管理报告
- 车缝工艺基础知识培训课件
- 总工会干部培训课件
- 湖北77年高考数学试卷
- 2025年党史党建知识测试题库100题(含标准答案)
- 合同服务终止协议书范本
- 蔬菜大棚现场管理制度
- 剧毒化学品、放射源存放场所治安防范要求内容
- 钻探安全技术操作规程(2020新版)
- 《事业单位财务规则》专题培训
- 气管插管患者急救与护理
评论
0/150
提交评论