Java语法基础北京理工大学计算机系 金旭亮第三讲
2009-7-29 2北京理工大学计算机系 (共 102页 )
Java语言规范
可以从以下网址获取最新的 Java语言规范,
http://java.sun.com/docs/books/jls/html/index.
html
2009-7-29 3北京理工大学计算机系 (共 102页 )
本讲内容
标识符、常量与变量
字串
运算符
控制结构
数组
结构化的编程原则
3.1 标识符、常量与变量
2009-7-29 5北京理工大学计算机系 (共 102页 )
标识符
Java对标识符的要求:
(1)开头:字母,_和 $
(2)不能以数字打头
(3)不能包含空白字符,制表,空格,回车,换行符
(4)不能用关键字
2009-7-29 6北京理工大学计算机系 (共 102页 )
Java对标识符的规范
规范标识符的重要性,
没有规范的命名不是一个科班出身的软件开发者应有的行为
Java标识符规范,
类名称,Mammal
函数名和变量名,getAge 与 C/C++不一样常量,MAX_HEIGHT
2009-7-29 7北京理工大学计算机系 (共 102页 )
常量
(10)10=(0xA)16=(012)8
常量的类型,独立于平台(不同于 C++)
整型,byte,short,int(32),long 独立于平台(不同于
C++)
浮点型,float(32),double(64)
123.456=1.23456e+2
布尔型,true,false
字符型,?a?,?A?
字符串,“Hello,China”
2009-7-29 8北京理工大学计算机系 (共 102页 )
定义常量
利用关键字 final声明常量
final int MAX_VALUE=512
类常量的定义
public static final int MAX_VALUE=512
2009-7-29 9北京理工大学计算机系 (共 102页 )
枚举类型
定义:
enum Size{SMALL,MEDIUM,LARGE}
使用:
Size s=Size.SMALL;
注意:适用于 JDK 5.0
2009-7-29 10北京理工大学计算机系 (共 102页 )
运算符
在许多程序中都用到了算术运算
*乘
/除
+,-加减
没有指数运算符
整除
7 / 5 = 1
取模
7 % 5 = 2
2009-7-29 11北京理工大学计算机系 (共 102页 )
Java运算符
2009-7-29 12北京理工大学计算机系 (共 102页 )
复合赋值运算符
2009-7-29 13北京理工大学计算机系 (共 102页 )
运算符优先级
操作符顺序
一些算术运算优先于其它 (例如,先乘除后加减)
必要时使用括号保证优先级别
示例,计算 a,b 和 c的平均值
错,a + b + c / 3
对 (a + b + c ) / 3
2009-7-29 14北京理工大学计算机系 (共 102页 )
等于和关系运算符
2009-7-29 15北京理工大学计算机系 (共 102页 )
逻辑组合运算符
!=:非
&&:与
||:或
2009-7-29 16北京理工大学计算机系 (共 102页 )
位运算符
&:与
|:或
^:异或
~:非
>>,<<:右移,左移运算符
使用位运算符时,操作数按二进制表示。
2009-7-29 17北京理工大学计算机系 (共 102页 )
运算符结合性
Precedence of operators(运算符结合性):
除了赋值运算符 =,所有的结合性都是从左到右
例如,x = y = z相当于 x = (y = z)
2009-7-29 18北京理工大学计算机系 (共 102页 )
示例:两数相加
源文件,Addition.java
使用两个输入框输入数据
用一个消息框显示计算结果
2009-7-29 19北京理工大学计算机系 (共 102页 )
变量类型
声明变量 number1,number2,和 sum 为
int类型
int类型可存放整数,0,-4,97
float 和 double 存放小数
char 存放单个字符,例如,x,$,\n,7
int number1; // first number to add
int number2; // second number to add
int sum; // sum of number1 and number2
2009-7-29 20北京理工大学计算机系 (共 102页 )
变量声明
能同时声明同一类型的多个变量
变量间以逗号间隔
推荐给变量加上注释以说明其用途
String firstNumber,secondNumber;
2009-7-29 21北京理工大学计算机系 (共 102页 )
变量
变量就是内存单元的名字
强类型语言,变量要先定义再使用
定义,int p;
注意:变量在使用前应保证它有确切的值!
2009-7-29 22北京理工大学计算机系 (共 102页 )
关于内存
变量
每个变量都有一个名字、数据类型、所占内存单元数和一个值
名字对应于内存中的位置
当新值被赋给变量老值将被取代
从内存中读数据不会破坏数据
2009-7-29 23北京理工大学计算机系 (共 102页 )
内存概念
Sum = 0; number1 = 1; number2 = 2;
sum 0
sum 3
Sum = number1 + number2; 执行之后:
2009-7-29 24北京理工大学计算机系 (共 102页 )
数据的读取
一般使用变量来存储用户在程序运行时输入的数据。
2009-7-29 25北京理工大学计算机系 (共 102页 )
在运行时读取用户输入( 1)
方法一:使用 JOptionPane类的
showInputDialog方法。
String firstNumber;
firstNumber =
JOptionPane.showInputDialog(,Enter," );
2009-7-29 26北京理工大学计算机系 (共 102页 )
在运行时读取用户输入( 2)
方法二:使用 Scanner类( JDK5.0)
Imports jva.util.*;
Scanner in=new Scanner(System.in);
System.out.print(“What is your name?”);
String name=in.next;
Scanner类有 nextInt,nextDouble等方法。
实例,InputTest.java
2009-7-29 27北京理工大学计算机系 (共 102页 )
原始数据类型与包装类
Primitive types(原始数据类型)
可用于构造更复杂的数据类型
Java 是一种强类型语言
Java程序中的所有变量都必须有一个类型
Java的原始数据类型使 Java成为了跨平台的语言
2009-7-29 28北京理工大学计算机系 (共 102页 )
变量的使用
变量在使用前应保证它有确切的值;
同名变量的屏蔽原则。
2009-7-29 29北京理工大学计算机系 (共 102页 )
类型转换
float f=(float) returnInt();
类型转换时可能会引起信息的损失
类型转换:
自动类型转换,强制类型转换(同 C)
2009-7-29 30北京理工大学计算机系 (共 102页 )
Java中的类型转换
byte Short int long
float double
char
无精度损失有精度损失
2009-7-29 31北京理工大学计算机系 (共 102页 )
字串转为数字
number1 = Integer.parseInt( firstNumber );
number2 = Integer.parseInt( secondNumber );
–Integer.parseInt方法
将 String 转为数字 ( int)
–类 Integer属于包 java.lang
Integer.parseInt方法返回的值被传给变量 number1
记住 number1 是 int类型的
2009-7-29 32北京理工大学计算机系 (共 102页 )
字串联接操作
"The sum is " + sum
使用运算符 + 连接字面量,The sum is”
和计算结果 sum
将 String 和其它数据类型相加
结果是一个新的 String
如果 sum= 117,那么,The sum is,
+ sum 得到一个新的字串 "The sum is
117"
注意字串,The sum is,间的空格
JOptionPane.showMessageDialog(
null,"The sum is " + sum,"Results",
JOptionPane.PLAIN_MESSAGE );
2009-7-29 33北京理工大学计算机系 (共 102页 )
小问题
以下代码的输出结果是什么?
Int X=100;
Int Y=200;
System.Out.Println(“X+Y=“+X+Y);
2009-7-29 34北京理工大学计算机系 (共 102页 )
使用有图标的消息框
另一个版本的 showMessageDialog
有四个参数 (前面的例子只有两个 )
第一个参数,null
第二个参数,要显示的字串
第三个参数:在标题栏上显示的字串
第四个参数,指明图标
无图标,JoptionPane.PLAIN_MESSAGE
JOptionPane.showMessageDialog(
null,"The sum is " + sum,"Results",
JOptionPane.PLAIN_MESSAGE );
2009-7-29 35北京理工大学计算机系 (共 102页 )
消息框图标
2009-7-29 36北京理工大学计算机系 (共 102页 )
课后实践
上机运行两数相加的程序 (Addition.java)
修改程序,使之能进行加减乘除运算
掌握显示对话框与输入框的方法
作业:
编写一个程序,用户输入三个数,求出其乘积,并用消息框显示结果
2009-7-29 37北京理工大学计算机系 (共 102页 )
更复杂的示例,浮点数相加源文件,AdditionApplet.java
下面将简单介绍此示例代码中需要掌握的知识。
2009-7-29 38北京理工大学计算机系 (共 102页 )
类的实例变量
public class AdditionApplet extends JApplet
{
double sum; // sum of values entered by user
….
}
声明类变量 sum
每个类的实例都有类变量的一个复制品
在类体中声明,但不是在类的方法体中
在方法中声明的变量是局部变量
只能在方法体中使用
类变量可以在类中任何地方使用
拥有缺省值 (在本例中是 0.0)
2009-7-29 39北京理工大学计算机系 (共 102页 )
Applet的初始化方法
public void init()
一般完成类的初始化工作(类变量和 applet类)
在 applet 中第一个被调用
第一行总是这样声明的
不返回任何值 (void),没有任何参数
2009-7-29 40北京理工大学计算机系 (共 102页 )
对象引用与普通变量
两种类型的变更
引用变量( Reference variables)
指向对象 (存放对象在内存中的位置 )
对象是由类定义克隆出来的
可以包含多个数据成员和方法成员
paint接受一个引用参数 g,代表一个 Graphics对象
引用用来调用 Graphics类对象的所有方法
原始数据类型 (称为变量 )
仅包含数据
String firstNumber; // first string entered by user
String secondNumber; // second string entered by user
double number1; // first number to add
double number2; // second number to add
2009-7-29 41北京理工大学计算机系 (共 102页 )
区分引用和变量
如果数据类型是一个类的名字,就是引用
String是个类
firstNumber,secondNumber是引用
如果数据类型是一个原始类型,就是变量
double是一个原始数据类型
number1,number2是变量
String firstNumber; // first string entered by user
String secondNumber; // second string entered by user
double number1; // first number to add
double number2; // second number to add
2009-7-29 42北京理工大学计算机系 (共 102页 )
字串转为数字
static 方法 Double.parseDouble
将 String 数据转为 double类型的
返回 double值
记住静态方法语法:
类名,方法名 ( 参数 )
number1 = Double.parseDouble( firstNumber );
number2 = Double.parseDouble( secondNumber );
3.2 控制结构与算法
2009-7-29 44北京理工大学计算机系 (共 102页 )
控制结构与算法
算法:
按特定顺序执行的动作序列,关键在于:
( 1)动作本身
( 2)动作执行的顺序
程序控制决定要执行哪个动作,程序控制结构可用于指定动作执行的顺序
2009-7-29 45北京理工大学计算机系 (共 102页 )
描述程序流程的伪码
Pseudocode(伪码)
用于描述算法的非正式语言
计算机无法执行
让开发者易于理解算法
2009-7-29 46北京理工大学计算机系 (共 102页 )
程序执行的顺序
Sequential execution(顺序执行)
程序语句执行顺序的转移
三种基本结构
Sequence structure(顺序结构)
Selection structure(选择结构)
Repetition structure(循环结构)
Flowchart流程图常用于描述程序执行顺序。
2009-7-29 47北京理工大学计算机系 (共 102页 )
add grade to total total = total + grade;
add 1 to counter counter = counter + 1 ;
Flowcharting Java’s sequence structure.
Flowlines
Action Symbols
Connector Symbols
程序流程图示例
2009-7-29 48北京理工大学计算机系 (共 102页 )
选择结构
单入口,单出口
当条件满足时执行某个语句
grade >= 60 true
false
print,Passed”
Decision Symbol
2009-7-29 49北京理工大学计算机系 (共 102页 )
grade >= 60
true
print,Failed”
false
print,Passed”
选择结构
2009-7-29 50北京理工大学计算机系 (共 102页 )
循环结构
当条件为 true时反复执行某个语句
( 1)计数器循环
( 2)次数不定的循环 (使用哨兵):
2009-7-29 51北京理工大学计算机系 (共 102页 )
For循环示例
for ( int i = 1; i <= 100; i++ )
for ( int i = 100; i >= 1; i-- )
for ( int i = 7; i <= 77; i += 7 )
Average1.java
循环指定次数
Average2.javar
选用特殊值结束输入。
2009-7-29 54北京理工大学计算机系 (共 102页 )
程序设计实践
Average1和 Average2两个程序设计得太蠢了,
请想办法设计出你自己的程序,实现同样的功能,尽量让别人觉得你这个程序不错。
2009-7-29 55北京理工大学计算机系 (共 102页 )
Interest.java
次数已知的循环,配上格式控制。
使用 JTextArea实现。
2009-7-29 56北京理工大学计算机系 (共 102页 )
Break和 continue
Break用于从 while,for,do/while或
switch语句中退出
Continue用于提前结束本次循环,用于
while,for或 do/while语句
Java支持跳转到标记处,请自学这一语法
(参看示例 BreakLabelTest.java和
ContinueLabel.java)
2009-7-29 57北京理工大学计算机系 (共 102页 )
BreakTest.java
2009-7-29 58北京理工大学计算机系 (共 102页 )
BreakLabelTest.java
2009-7-29 59北京理工大学计算机系 (共 102页 )
ContinueTest.java
2009-7-29 60北京理工大学计算机系 (共 102页 )
ContinueLabelTest.java
3.3 数组
2009-7-29 62北京理工大学计算机系 (共 102页 )
数组的特点
Arrays(数组)
一种简单的数据结构
元素具有相同的数据类型
尺寸保持不变
元素在内存中连续分布
2009-7-29 63北京理工大学计算机系 (共 102页 )
Fig,7.1 A 12-element array,
-45
6
0
72
1543
-89
0
62
-3
1
6453
78
c[ 1 ]
c[ 2 ]
c[ 4 ]
c[ 3 ]
c[ 5 ]
c[ 6 ]
c[ 7 ]
c[ 8 ]
c[ 9 ]
c[ 10 ]
c[ 11 ]
c[ 0 ]Name of array (Note
that all elements of
this array have the
same name,c)
Position number (index
of subscript) of the
element within array c
2009-7-29 64北京理工大学计算机系 (共 102页 )
数组的下标
Subscript(下标)
亦称为 index(索引),代表元素在整个数组中的位置
必须是整数或整数表达式,例如
a = 5;
b = 6;
c[ a + b ] += 2;
2009-7-29 65北京理工大学计算机系 (共 102页 )
数组名
从前面幻灯片所画的数组 c中
C代表数组名
c.length得到 c这个数组的长度
c有 12 个元素 ( c[0],c[1],… c[11] )
c[0]这个元素的值是 –45
[]在 java中拥有最高优先级
2009-7-29 66北京理工大学计算机系 (共 102页 )
在 Java中使用数组
声明
数组是对象,需要占用内存空间
声明并分配内存
int c[] = new int[ 12 ];
相当于
int c[]; // declare array
c = new int[ 12 ]; // allocate array
创建对象数组
String b[] = new String[ 100 ];
2009-7-29 67北京理工大学计算机系 (共 102页 )
数组初始化
使用初始化列表
int n[] = { 10,20,30,40,50 };
不需要使用 new操作符
2009-7-29 68北京理工大学计算机系 (共 102页 )
示例,InitArray.java
此例子展示
Declare array声明数组
Allocate array分配数组内存
Initialize array elements初始化数组元素注意,array在 Java中是个类,而不是个原始数据类型。
2009-7-29 69北京理工大学计算机系 (共 102页 )
两种不同类型的数组初始化
数组元素是基本类型,初始化为 0;
int carrot[]=new int[256];
carrot[6]=0
数组元素是引用类型,使用之前必须先创建对象。
Fruit carrot[]=new Fruit[256];
carrot[7].grams=32; //错!
2009-7-29 70北京理工大学计算机系 (共 102页 )
强调
对于数组元素是引用类型的数组,在访问数组中对象之前,需要创建相应的对象,
让数组元素指向它!
2009-7-29 71北京理工大学计算机系 (共 102页 )
课后练习
随机生成 10个数,填充一个数组,然后用消息框显示数组内容,并计算数组元素的和,
将结果也显示在消息框中。
2009-7-29 72北京理工大学计算机系 (共 102页 )
访问数组
int[ ] a=new int [100]
for (int i=0;i<a.length;i++)
System.out.println(a[i]);
2009-7-29 73北京理工大学计算机系 (共 102页 )
访问数组
当用循环遍历数组时
下标不能小于 0
下标必须小于最大的数组元素数目
否则
对于非法的数组下标,Java会抛出异常
ArrayIndexOutOfBoundsException
处理异常,使用 Try…Catch语句
2009-7-29 74北京理工大学计算机系 (共 102页 )
访问数组
JDK5.0新引入 for each循环
int[ ] a=new int [100]
for(int element,a)
System.out.println(element);
2009-7-29 75北京理工大学计算机系 (共 102页 )
数组拷贝
使用 arraycopy方法。
int[] from={0,1,2,3,4,5,6,7,8,9};
int[] to=new int[10];
System.arraycopy(from,0,to,0,10);
for(int element:to)
System.out.println(element);
2009-7-29 76北京理工大学计算机系 (共 102页 )
数组作为参数
两种参数传递方式
Pass-by-value(按值传送),用于原始数据类型)
Pass-by-reference(按引用传送),对象都按引用传送)
数组参数按引用传递,
2009-7-29 77北京理工大学计算机系 (共 102页 )
示 例
int hourlyTemperatures = new int[ 24 ];
modifyArray( hourlyTemperatures );
(记住:数组名代表数组全体)
2009-7-29 78北京理工大学计算机系 (共 102页 )
按引用传递与按值传送的最大关键在于前者如果更改了形参的值,将会影响到外界。
按引用与按值传递的示例
PassArray.java
2009-7-29 79北京理工大学计算机系 (共 102页 )
数组排序
数据结构是软件设计基础中的重中之重。
要高度重视这门课的学习。
示例,冒泡排序注意:这个例子是如何在类中进行模块划分的。
从这个例子中我们可以看到面向对象程序中结构化的编程原则(功能分解)仍然适用。
2009-7-29 80北京理工大学计算机系 (共 102页 )
在数组中查找数据
线性查找与二分查找可有同学能告诉我线性查找与二分查找是如何进行的?
查找是数据结构中的又一重要内容,查找算法在软件开发中几乎不可缺少,尤其在大型的数据库中。
简要介绍一下现代的数据库产品。
2009-7-29 81北京理工大学计算机系 (共 102页 )
线性查找的特点
Linear search
用于非有序的数组
对大型的数组不合适对于各种经典算法,一定要心中明白他们的优缺点,从而才能在程序开发实践中有的放矢。
2009-7-29 82北京理工大学计算机系 (共 102页 )
二分查找
BinarySearch.java示例分析
2009-7-29 83北京理工大学计算机系 (共 102页 )
多维数组定义,
int b[][] = { { 1,2 },{ 3,4 } };
int b[][] = { { 1,2 },{ 3,4,5 } };
注意,Java的数组可以是“不整齐”的。
C++的解决此问题方案之一,用 Vector
2009-7-29 84北京理工大学计算机系 (共 102页 )
多维数组
3*4 数组
int b[][];
b = new int[ 3 ][ 4 ];
不整齐的数组
int b[][];
b = new int[ 2 ][ ]; // allocate rows
b[ 0 ] = new int[ 5 ]; // allocate row 0
b[ 1 ] = new int[ 3 ]; // allocate row 1
2009-7-29 85北京理工大学计算机系 (共 102页 )
a[ 0 ][ 0 ]
a[ 1 ][ 0 ]
a[ 2 ][ 0 ]
a[ 0 ][ 1 ]
a[ 1 ][ 1 ]
a[ 2 ][ 1 ]
a[ 0 ][ 2 ]
a[ 1 ][ 2 ]
a[ 2 ][ 2 ]
a[ 0 ][ 3 ]
a[ 1 ][ 3 ]
a[ 2 ][ 3 ]
Row 0
Row 2
Row 1
Column 0 Column 1 Column 2 Column 3
Column subscript (or index)
Row Subscript (or index)
Array name
多维数组的内存分配方式
2009-7-29 86北京理工大学计算机系 (共 102页 )
课堂练习以下语句是否是正确的?
要访问数组的某一元素,需要指出数组名和元素的值,
数组声明为数组预留空间,
为了给整数数组预分配 100个单元,编程人员可以声明,
int p[100];
要把含 15个元素的数组所有元素初始化为 0,必须至少使用一个 for语句
2009-7-29 87北京理工大学计算机系 (共 102页 )
课堂练习
阅读程序 WhatDoesThisDo.java,解释程序所完成的功能
阅读程序 WhatDoesThisDo2.java,解释程序所完成的功能
3.5 结构化编程
2009-7-29 89北京理工大学计算机系 (共 102页 )
基本概念
什么是结构化编程?
什么是面向对象编程?
软件技术发展史
2009-7-29 90北京理工大学计算机系 (共 102页 )
结构化的编程原则
基本控制块
由基本模块组装成整个程序
2009-7-29 91北京理工大学计算机系 (共 102页 )
if/elsestructure
(double selection)
if structure
(single selection)
T
F
Sequence Selection
F T
T
F
break
T break
T break
F
F
switchstructure
(multiple selection)
2009-7-29 92北京理工大学计算机系 (共 102页 )
Repetition
T
F
whilestructure
T
F
do/while
structure
F
T
forstructure
2009-7-29 93北京理工大学计算机系 (共 102页 )
从最简单的流程图出发
2009-7-29 94北京理工大学计算机系 (共 102页 )
不断迭代替换
Rule 2 Rule 2 Rule 2
2009-7-29 95北京理工大学计算机系 (共 102页 )
Rule 3
Rule 3 Rule 3
2009-7-29 96北京理工大学计算机系 (共 102页 )
结构化编程的组织单位代码?函数?模块
|__?函数库
2009-7-29 97北京理工大学计算机系 (共 102页 )
模块的不同类型
Stacked building blocks Nested building blocks
Overlapping building blocks
(Illegal in structured programs)
2009-7-29 98北京理工大学计算机系 (共 102页 )
非结构化的程序流程引发无限麻烦的程序结构
2009-7-29 99北京理工大学计算机系 (共 102页 )
结构化编程的基本过程
调用已有模块的函数
开发自己的函数模块
将所有模块装配起来
2009-7-29 100北京理工大学计算机系 (共 102页 )
结构化编程实战
从一道 C上机题开始,
计算出 1995年 1月 1日到 2004年 3月 24日,一共有多少天。
2009-7-29 101北京理工大学计算机系 (共 102页 )
全面转向面向对象时代
结构化编程的基本单位 ---函数学会编写一个函数是程序员的基本功
面向对象编程的基本单位 ---类要开发一个类,首先要设计它的接口,所以,设计能力将成为当今程序员的必备素质请大家在上面两个方面打好基本功。
2009-7-29 102北京理工大学计算机系 (共 102页 )
小结
本讲介绍了 Java的基本语法,到此为止,Java中有关结构化编程的部分已经结束,从下一讲开始,
将介绍 Java的面向对象程序开发。请注意,进入面向对象编程部分学习以后,讲课内容的抽象程度将大大增加,应多上机实践才好理解。
学习完本部分,大家应能用 Java开发简单的应用程序和 Applet,并基本掌握 Java语法
请同学们系统地自学 Java中基本语法,并将本讲中的所有例题在计算机上调试运行一遍。