1、Java程序设计,第一章 计算机、程序和Java概述,什么是计算机、程序、操作系统 Java的诞生 Java的特点 Sun公司的SDK 一个Java application应用程序 一个Java applet应用程序,计算机、程序、操作系统,计算机是存储和处理数据的电子设备。 包括硬件和软件两部分。 硬件包括CPU、存储器(内存、存储设备)、I/O设备(如图所示) 程序是计算机上运行的、能完成某种特定功能的软件(指令集合)。包括系统程序和应用程序。 操作系统是指挥硬件运行的系统程序。包括进程调度、线程调度、存储器管理、I/O设备管理等功能。,磁盘、光盘、磁带,调制解调器、网卡,键盘、鼠标,显示
2、器、打印机,返回,编程语言的几个发展阶段,机器语言:二进制码 汇编语言:助记符取代二进制码 面向过程的高级语言: 面向对象的高级语言:,面向过程的高级语言,用更接近于自然语言的单词符号取代助记符。 程序独立于计算机 采用自顶向下的方法分析问题,把复杂的问题分解成小的、简单的问题。 用称为函数或子程序的独立的功能模块解决小的问题,有利于代码重用。 程序由这些功能模块组成。 数据和操作它们的方法(函数)分离。,面向对象的高级语言,通过抽象、封状、继承、多态等技术把数据和操作它们的方法封装在类中,增强了代码重用的功能。 通过访问限制,增加了数据的安全性。 程序模型更接近于现实中的事物。,Java的诞
3、生,C语言、Visual Basic和 Java语言,是当今世界上最为流行三大计算机语言; Java语言在网络编程方面占有主流的地位。Java语言产生于1991年,当初的开发设计目的是以设计消费电子产品(如电视机、电话机、电烤厢、手机)上的操作系统和程序为主的,当时这个语言叫Oak;但自1994万维网出现后, James Gosling 意识到万维网上需要一种跨平台的计算机语言,于是他把oak加以改造并用于网络编程,取得巨大成功。1995年5月23日Sun 公司正式推出Java语言.java的出现,是计算机信息交换的一个重要里程碑。Java 语言的开发者James Gosling 使Java语
4、言成为一个非常具有特色且功能强大的计算机语言。他的设计灵感起源于C+,在Java语言中我们可以看到C+语言的身影,虽然Java语言和C+语言有很相似,但本质上却大不相同,它不是C+的延伸和扩展,它可以说是一个专为Internet而设计开发出来的新一代计算机语言,它现在在因特网程序设计上占有如日中天的地位,它在因特网上的应用和蓬勃发展,是全世界所公认的。,Java的特点,简单的 面向对象的 解释型的 平台无关的 安全的 多线程的 动态的,普通编译型语言的编译过程,JAVA的编译执行过程,Sun公司的SDK,Java语言在万维网上的编程方面取得了广泛的应用,与此同时,Java语言本身也得到了快速的
5、发展,已从Java 1.0发展到 Java1.7 。 Java1.2 已与 Java 1.0有很大区别,所以Java1.2以后各版通称为 Java2。 本人使用的Java2开发软件: jdk-6u5-windows-i586-p.exe ,是从网站: WWW ,其体积大概有 71 兆 字节。该网站以及网站WWW 有很多关于java的说明资料,如 API (应用程序接口)的说明,也有很多关于 java 的软件供免费下载,大家可以去浏览。,一个Java application 应用程序,/ This application program prints Welcome to Java! publi
6、c class Welcome public static void main(String args)System.out.println(“Welcome to Java!“); ,一个Java applet 应用程序,/* WelcomeApplet.java: This is an example of Java applets */ import java.awt.*; public class WelcomeApplet extends java.applet.Applet public void paint(Graphics g)g.setColor(Color.red);g.d
7、rawString(“Welcome to Java!“, 30, 30); ,HTML Test PageWelcomeApplet will appear below in a Java enabled browser.,第二章 基本数据类型和基本操作,编写简单的程序 标识符 变量和常量 基本数据类型及其运算,一个简单的程序,public class ComputeArea public static void main(String args) double radius;double area;radius = 20;area = radius * radius * 3.14159;S
8、ystem.out.println(“The area for the circle of radius “ +radius + “ is “ + area); ,下一页,标识符,标识符:标识符是以字母(包括汉字)、下划线、美元符号开头,后跟字母、数字、下划线或美远符号组成的字符串。用来命名编程实体,如变量、常量、方法、类、包等。标识符区别大小写字母,没有固定长度,中间不能插入空格。 标识符用作变量名、方法名、接口名、类名等。例如: 关键字(保留字):关键字是系统预定义的、具有特殊意义和用法的符号,不得用它们做标识符。例如:,变量和常量,变量用来存储数据,程序运行过程中,值可以改变。 变量使用
9、前要先定义。 变量定义后,可以用赋值语句给它赋值。 任何表达式都有一个值。赋值表达式的值就是赋值号右边的表达式的值。 常量:是在程序的执行过程中,其值不能改变的量。包括数值字面量和符号常量。 Java使用关键字final定义符号常量。,int x; double radius; char a;,x=1; a=A; double radius=1.0;,i= j = k =1;,final double PI = 3.14159; area=radiu*radiu*PI;,数据类型,表2-1 数值数据类型,数值数据类型及其运算,算术运算符 + - * / % + - 数值直接量(数值字面量)是在
10、程序中直接出现的常量值。1. 整型直接量 默认为int型十进制数,后加L或l变为long型。以0开头为八进制常量,以0x或0X开头为十六进制常量。2. 浮点型直接量 默认为double型。后加F或f变为float型。例如100.2F。浮点型直接量也可以用科学记数法表示。例如1234E2相当于1234102 1234e-2相当于123410-2,数值数据类型及其运算,算术表达式 由算术运算符连接而成的表达式。例如 表达式(3+4*x)/5-10*(y-5)*(a+b+c)/x+9*(4/x+(9+x)/y)表示数学中的如下表达式简洁赋值运算符 += -= *= /= %=,数值类型转换,不同类型
11、的数值混合运算时,需进行数值类型转换。 数值类型转换分为自动类型转换和强制类型转换。 自动类型转换由系统自动进行,总是把相对比较低级的数据类型转换为比较高级的类型。转换规则如下 1.如果一个操作数是double型,则将另一个转换为double型; 2.否则,如果一个操作数是float型,则将另一个转换为float型; 3.否则,如果一个操作数是long型,则将另一个转换为long型; 4.否则,两个操作数都转换为int型。 强制类型转换可以把高级类型转换为低级的数据类型。例如: 赋值时的情况比较特殊,无论是否使用强制类型转换,都是把赋值号右边的值转换为左边变量的类型。例如:,float f =
12、 (float)10.1; int i = 10 + (int) f;,int i = 12.34 + 100.45,字符数据类型及其运算,字符类型char表示单个字符。字符直接量(字符字面量)是用单引号括住的单个字符。例如: Java使用Unicode码对字符进行编码。编码一个字符的Unicode码占两个字节,书写上用以u开头的4位十六进制数表示。例如: Unicode码包含ASCII码,对于属于ASCII码字符集中的字符既可以使用ASCII字符来表示,也可以使用Unicode码来表示。例如: 自增和自减运算符可以用于char型变量,得到后一个或前一个Unicode字符。例如:,char l
13、etter = A; char numChar = 4;,JOptionPane.showMessageDialog(null, “u5496u5561”, “Display coffee”, JOptionPane.INFORMATION_MESSAGE);,char letter = A; char letter = 65; char letter = u0041; /这3条语句是等价的,char ch=a; System.out.println(+ch);,字符数据类型及其运算,Java用转义字符序列表示一些无法显示的、具有特殊功能的字符。如下表所示:,表2-2 Java转义字符序列,字
14、符数据类型及其运算,char型数据可以转换成任何数值型数据,反之亦然。 一个整数转换成char型数据时,只使用整数的低16位,其余部分忽略。 一个浮点数要转换成char型时,首先转换成int型,然后将这个int型数据转换成char型。 char型数据转换成数值型时,就是把该字符的Unicode码值转换为指定类型的值。,布尔数据类型及其运算,布尔型数据(boolean)只能取两个值:true或false。 Java关系和逻辑表达式的值是一个布尔型的值。 Java的关系运算符包括: = = != Java的逻辑运算符用来连接两个关系表达式括: ! & | & | & | 称为条件与和条件或。对于&
15、,如果左边的关系表达式为false,则不计算右边的表达式的值。对于|,如果左边的关系表达式为true,则不计算右边的表达式的值。例如: & | 称为无条件与和无条件或。即不论运算符左边的关系表达式取何值,都要计算右边表达式的值。例如:,int i=10 , j=5 ; if(i0) ,int i=10 , j=5 ; if(i0) ,运算符的优先级,运算符的结合性,当两个优先级相同的运算符连续出现时,若左边的运算符先运算,则为自左向右结合;若右边的运算符先运算,则为自右向左结合。 除赋值运算符之外的所有双目运算符都是自左向右结合;赋值运算符为自右向左结合。 后置自增和自减运算符为自左向右结合;
16、前置自增和自减运算符为自右向左结合。 !、(按位取反)、+、-(正负号)为自右向左结合。,字符串类型String,String为Java预定义的类,表示字符串。例如: 出现在字符串操作中的+的作用是连接。 +=也可以用来连接字符串。,String message=“Welcome “ + “to “ + “Java“;,从输入对话框获取输入,可以使用JOptionPane类中的showInputDialog方法从输入对话框获取用户输入的字符串。例如:可以使用Integer类的parseInt方法把表示整数的字符串转换成对应的int型值。例如: 可以使用Double类的parseDouble方法
17、把表示实数的字符串转换成对应的double型值。例如:,String input = JOptionPane. showInputDialog(null, “Enter an input”, “Input Dialog Demo”,JOptionPane.QUESTION_MESSAGE);,int in=Integer.parseInt(inputstring);,double in=Double.parseDouble(inputstring);,例2.1 从对话框输入,第三章 控制语句,Java控制结构,顺序结构 分支结构 循环结构,分支语句分支语句根据一定的条件,动态决定程序的流程方向
18、,从程序的多个分之选取一个或多个来执行。分之语句有两种: if 语句和 switch 语句. 1、if 语句其语法是:if(逻辑表达式)语句序列1 else 语句序列2 /蓝色部分可选其含义是,若表达式为真,执行语句序列1,否则执行语句序列2,如:int x=3;if(x!=3) ,请看如下例子: If (grade=90)System.out.println(“A等”); else if(grade=80)System.out.println(“B等”); else if(grade=70)System.out.println(“C等”); else if(grade=60)System.o
19、ut.println(“D等”); else System.out.println(“不及格 !”); ,注意 :因为每对中只有一句,所以可以省去。若中有多句,则不能省去,条件语句例,switch语句,其格式为:switch(表达式)case c1: 语句组1;break; case c2:语句组2;break;.case ck:语句组k;break; default:语句组; ,其中表达式的值必须是byte型、short型、int型、或char 型的。不能是long型。break语句的作用是跳到switch 语句的 之后去执行其它语句。注意其中的break语句不可省去。若省去break语句,
20、那么,当某个语句组被执行后,它后面的所有语句组都会被执行 !,开关语句,class SwitchTest public static void main(String args)char ch=args0.charAt(0);switch(ch)case 0: case 1: case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:System.out.println(“The character is digit “+ch);break;case a:case b:case c:case d:case e:case f:case g:c
21、ase h:case i:case j:case k:case l:case m:case n:case o:case p:case q:case r:case s:case t:case u:case v:case w:case x:case y:case z:System.out.println(“The character is letter “+ch); break;,case A:case B:case C:case D:case E:case F:case G:case H:case I:case J:case K:case L:case M:case N:case O:case
22、P:case Q:case R:case S:case T:case U:case V:case W:case X:case Y:case Z:System.out.println( “The character is letter “+ch);break;/若省去此句,后果如何?default: System.out.println(“The character “+ch+ “is neither a digit nor a letter“); ,循环结构,while语句 do-while语句 for语句,While循环,while循环的语法格式为:while(逻辑表达式)语句序列(其中逻辑
23、表达式不能象C语言那样可用十进制数代替。) 例 3-16int i=0; While( i3) System.out.println(“Are you finished yet ?”);i+ ;System.out.println(“Finally !”); /输出为:Are you finished yet ?Are you finished yet ? Are you finished yet ? Finally !,do循环,do语句的语法格式为do statementswhile (logical expression)Example int i=0; do System.out.pr
24、intln(“Are you finished yet ?”);i+ ;while (i3);System.out.println(“Finally !”); /输出为:Are you finished yet ?Are you finished yet ? Are you finished yet ? Finally !,实际上 do statementswhile (logical expression) 等价于: while (logical expression)statements,do循环,。 1、 for语句 其语法格式为:for(初始语句;逻辑表达式;跌代语句) 语句序列例3-
25、13for(int i=0; i3; i+)System.out.println(“Are you finished yet ?”);System.out.println(“Finally !”); /输出为:Are you finished yet ?Are you finished yet ? Are you finished yet ? Finally !,例 for( ; ;) System.out.println(“Always print !”); /等价于:for( ;true ;) System.out.println(“Always print !”);它们将会不停地执行下去
26、,即死循环。 例3-15 初始语句和跌代语句皆不止一个的情形。int sumi=0 , sumj=0;for(int i=0, j=0; j10 ; i+, j+)sumi+=i; sumj+=j; ,初始语句、逻辑表达式、跌代语句都可以省略:,特殊的流控制语句。java语言中无goto 语句,而代之以 break语句和 continue语句。,1、标号 标号可放在for,while或do语句之前,其语法格式为:标号:语句; 2、break语句break语句可用在switch ,for,while或do语句之中,其语义是跳过本块中余下的所以语句,转到块尾(循环外)执行其后的语句。例for(in
27、t i=0;i100;i+)if(i=5)break;System.out.println(“i= ”+i); 实际上只执行了5次(i从0到4),特流控语句,break语句还可和标号结合起来使用,起语法格式为:break 标号; 其语法意义是跳出标号所标记的语句块,继续执行其后的语句。多用于嵌套块中,从内层跳到外层之后去执行。3、continue 语句。 continue 语句立即结束当次循环而进入下一次循环。语句continue 标号; 它立即结束标号所标记的那重循环的当次循环而进入下一次循环。多用于多重循环。,public class TestBreak public static voi
28、d main(String args) int sum = 0;int item = 0;while (item = 6) break;System.out.println(“The sum is “ + sum); ,public class TestContinue public static void main(String args) int sum = 0;int item = 0;while (item 5)item+;if (item = 2) continue;sum += item;System.out.println(“The sum is “ + sum); ,第4章 方
29、法,方法:是为了完成某个功能组合在一起的一组语句。,创建方法: 修饰符 返回值类型 方法名(形式参数列表) 语句组;(方法体) ,public static int max(int num1, int num2)if (num1 num2)return num1;elsereturn num2;,例:创建方法,调用方法: 例:int larger=max(3,4);System.out.plintln(“Welcome to java”);,参数传递,C+语言中的方法(函数),通过值传递或引用传递来传递参数。 当采用值传递时,将产生参数值的一个拷贝并把它传递给被调用的方法(函数)。形参的改变不
30、会影响实参。 采用引用传递参数时,形参是实参的引用,被调方法(函数)可通过实参直接访问形参;形参的改变影响实参。,参数传递,与C+不同,Java的参数传递方式就是值传递。 值传递的特点:形参和实参相互独立;参数传递时,实参把值复制给形参;修改形参的值不会影响实参的值。(参数为简单数据类型),public class TestPassByValue public static void main(String args) int num1 = 1;int num2 = 2;System.out.println(“Before invoking the swap method, num1 is “
31、+num1 +“ and num2 is “ + num2);swap(num1, num2);System.out.println(“After invoking the swap method, num1 is “ +num1 + “ and num2 is “ + num2);,例:值传递:,static void swap(int n1, int n2)System.out.println(“ Inside the swap method“);System.out.println(“ Before swapping n1 is “ + n1 + “ n2 is “ + n2);int
32、temp = n1;n1 = n2;n2 = temp;System.out.println(“ After swapping n1 is “ + n1+ “ n2 is “ + n2); ,方法重载,一个类中可以有多个方法具有相同的名字。 这些方法的参数必须不同,即或者是参数个数不同,或者是参数的类型不同。,public class TestMethodOverloading public static void main(String args)System.out.println(“The maximum between 3 and 4 is “ + max(3, 4);System.o
33、ut.println(“The maximum between 3.0 and 5.4 is “+ max(3.0, 5.4);System.out.println(“The maximum between 3.0, 5.4, and 10.14 is “+ max(3.0, 5.4, 10.14);,例:方法重载,static int max(int num1, int num2)if (num1 num2) return num1;else return num2;static double max(double num1, double num2)if (num1 num2) retur
34、n num1;else return num2;static double max(double num1, double num2, double num3)return max(max(num1, num2), num3); ,局部变量的作用域,变量作用域:指程序中,一个变量有效的范围。 局部变量的作用域:从变量的定义开始,到包含该变量的程序块结束(函数、复合语句)。 形式参数实际是局部变量,其作用域是整个函数体。,方法抽象,方法就象一个黑盒子,使用者不需了解方法的具体实现,只需知道如何调用方法即可。,数学类Math,ath类是Java系统预定义的类,其中包含了执行基本算术运算所需的方法。
35、如 、三角函数方法 public static double sin(double radius) 参数为弧度 public static double cos(double radius) public static double tan(double radius) public static double asin(double radius) public static double acos(double radius) public static double atan(double radius) public static double toRadians(double deg
36、ree) 角度 转弧度 public static double toDegrees(double radians) 弧度转角度,数学类Math,2、指数函数方法public static double exp(double a) /* 求e的a次方*/public static double log(double a) /*求ln(a)=loge(a)*/public static double pow(double a, double b) /*求ab*/public static double sqrt(double a) /*求 */3、取整方法public static double
37、 ceil(double x) /*以double返回向上与x最接近的整数*/ public static double floor(double x) /*以double返回向下与x最接近的整数*/public static double rint(double x) /*以double返回与x最接近的整数,如果x到 两个整数的距离相等,返回其中的奇数*/ public static int round(float x) /*返回(int)Math.floor(x+0.5) */public static long round(double x) /*返回(long)Math.floor(x
38、+0.5) */,数学类Math,、min、max和abs方法min和max是两个重载方法,用来返回两个数(int、long、float或double型)的最小值和最大值。abs是一个重载方法,用来返回一个数(int、long、float或double型)的绝对值。5、random方法生成大于等于0.0小于1.0的double型随机数。,例.,编写一个随机生成小写字母字符的方法,随机生成100个小写字母字符,并显示它们。 算法思想:随机生成小写字母字符,就是要随机生成小写字母字符的Unicode码值,该值应该大于等于 (int)a,小于等于(int)z,也就是要产生一个大于等于 (int)a并
39、且小于等于(int)z的随机整数。可用下面的表达式产生这个随机整数:a+Math.random()*(z-a+1) 从而生成的随机小写字母是:(char)(a+Math.random()*(z-a+1),递归方法,递归:一个数学概念,把规模大的、复杂的问题逐步化简为相同类型的小的、简单的问题,直到求得小问题的解,再回推出大问题的解。 递归的步骤: 、回朔。(逐步简化问题) 、到达递归终止条件。 、递推。(从小问题的解递推出大问题的解) 递归方法:如果一个方法内部直接或间接调用了方法本身,则该方法为递归方法。 实现递归方法的步骤: 、分析问题、得到递归定义。 、从递归定义直接得到递归方法。,例4
40、.5 计算整数n的阶乘,分析:factorial(n)=n!=n(n-1) (n-2) 10!=1 递归定义: factorial(n)= n factorial(n-1)factorial(0)=1 递归方法:public int factorial(int n) if(n=0) return 1;else return factorial(n-1)*n;,递归方法的调用过程,main方法 调用factorial(4),例4. 汉诺塔问题,递归定义: moveDisks(n, A, C, B)定义为如下3步:(n1) 、moveDisks(n-1, A, B, C)、将盘子从挪动到、move
41、Disks(n-1, B, C, A)如果n等于1,则将盘子从挪动到 递归方法:public void moveDisks (int n,char a,char b,char c) if(n=1) System.out.println(a+“move to”+b);else moveDisks(n-1, a, c, b);System.out.println(a+“move to”+b);moveDisks(n-1, c, b, a); ,第5章 数组,数组用于存放一组相同类型的数据。 Java将数组作为对象来处理。,声明和创建数组,第一步、声明数组的引用变量。语法格式如下:,数据类型 数组名
42、;或 数据类型 数组名; 例如: double myList; 或 double myList;,第二步、创建数组。语法格式如下:,数组名=new 数据类型数组大小; 例如: myList=new double10;,声明和创建可以合并在一个语句中进行。语法格式如下:,数据类型 数组名=new 数据类型数组大小; 例如: double myList=new double10;,double myList;,myList=new double10;,初始化和使用数组, 数组创建后,它的元素被赋予默认的值:* 数值类型数组:默认值为0;* char类型数组:默认值为u0000;* boolean类
43、型数组:默认值为false;* 对象型数组:默认值为null; 数组元素的个数存放在成员变量 数组名.length 中。 数组元素可通过下标访问,语法为:数组名下标 例如:myList2=20; 使用数组前需要对数组元素赋值。例如:for(int i=0; imyList.length; i+)myListi=i; 可以在创建数组的同时给数组元素赋值,叫做初始化数组。例如:double myList= 1.9, 2.9, 3.4, 3.5 ;,例5.1:读入6个整数,找出其中最大者,并统计它出现的次数。 例5.2:从键盘上输入学生的成绩(int),挑选最好的成绩并根据下表确定分数的等级:如果分
44、数=最高分数-10, 等级为A;如果分数=最高分数-20, 等级为B;如果分数=最高分数-30, 等级为C;如果分数=最高分数-40, 等级为D;其他情况等级为E。程序提示用户输入学生总数,然后输入成绩,最后显示等级。,数组的复制,由于数组是一个对象,所以不能使用赋值运算符将一个数组复制给另一个。例如 若list1和list2是两个同类型的数组,采用赋值运算符“=”复制数组的结果如下:,例:用赋值运算符赋值数组:,public class TestCopyArray public static void main(String args)int list1 = 0, 1, 2, 3, 4 ,5
45、;int list2 = new intlist1.length;list2 = list1;System.out.println(“Before modifying list1“);printList(“list1 is “, list1);printList(“list2 is “, list2);for (int i=0; ilist1.length; i+)list1i = 0;System.out.println(“nAfter modifying list1“);printList(“list1 is “, list1);printList(“list2 is “, list2);
46、 /end of main,public static void printList(String s, int list)System.out.print(s + “ “);for (int i=0; ilist.length; i+)System.out.print(listi + “ “);System.out.print(n); /end of class,运行结果:,复制数组的三种方法,用循环语句复制数组的每个元素。 使用System类中的静态方法arraycopy。 使用Object类的clone方法。,int sourceArray=2,3,1,5,10; int targetA
47、rray=new intsourceArray.length; for(int i=0;isourceArray.length;i+)targetArrayi= sourceArrayi;,System.arraycopy(sourceArray, 0, targetArray, 0, sourceArray.length);,targetArray=(int) sourceArray.clone();,例:用clone方法复制数组:,public class TestCopyArray public static void main(String args)int list1 = 0, 1,
48、 2, 3, 4 ,5;int list2 = new intlist1.length;list2 =(int) list1.clone();System.out.println(“Before modifying list1“);printList(“list1 is “, list1);printList(“list2 is “, list2);for (int i=0; ilist1.length; i+)list1i = 0;System.out.println(“nAfter modifying list1“);printList(“list1 is “, list1);printList(“list2 is “, list2); /end of main,