• 1. Java程序设计系列讲座-1 关于Java…黄绍辉 hsh@xmu.edu.cn
  • 2. 推荐参考书Thinking in Java,Bruce Eckel 中文译名:Java编程思想 网上很容易搜到电子书,中英文都有。 The JavaTM Tutorial,SUN SUN公司自己维护的Java入门,不过好像没有中文版。 Introduction To Java Programming (core/comprehensive version),Y. Daniel Liang 中文译名:Java程序设计导论
  • 3. 推荐网络资源http://java.sun.com/ SUN公司Java语言官方支持站点。
  • 4. Java的个人简历从Oak到Java,无心插柳的典范 1995年,美国Sun Microsystems公司正式向IT业界推出了Java语言,同年Java入选PC Magazine当年十大优秀科技产品 Java?What is Java? 因为它活泼,有生气,快速,交互…… 这个名字不是一个缩写,但它是一个暗示,许多程序员都喜欢喝很多这种热的,芬芳的东西。
  • 5. Java的设计目标创建一种面向对象的程序设计语言,而不是面向过程的语言; 提供一个解释执行的程序运行环境,使程序代码独立于平台; 吸收C和C++的优点,使程序员容易掌握; 去掉C和C++中影响程序健壮性的部分,使程序更安全,例如指针、内存申请和释放; 实现多线程,使得程序能够同时执行多个任务 提供动态下载程序代码的机制; 提供代码校验机制以保证安全性;
  • 6. Java语言的执行原理Java只能被编译成字节码文件(.class),然后由Java虚拟机负责解释执行。换句话说,Java不能直接生成可执行文件(例如exe)。 Java不直接生成exe的原因,在于不同平台的exe是不兼容的。为了移植性,只好牺牲一下执行速度了(exe执行方式比解释执行方式快)。 显然,不同的平台,对应的JVM是不同的。
  • 7. Java的工作原理(I)Java虚拟机(Java Virtual Machine) Java虚拟机是软件模拟的计算机,可以在任何处理器上安全并且兼容地执行保存在.class文件中的字节码。Java Development KitJava Runtime Environment
  • 8. Java的工作原理(II)无用内存自动回收机制 在C++语言中是由程序员进行内存回收的,程序员需要在编写程序的时候把不再使用的对象内存释放掉。 在Java运行环境中,始终存在着一个系统级的线程,专门跟踪内存的使用情况,定期检测出不再使用的内存,并进行自动回收,避免了内存的泄露,也减轻了程序员的工作量。
  • 9. Java的工作原理(III)代码安全性检查机制 字节码的执行需要经过三个步骤 类装载器(class loader)负责把类文件(.class文件)加载到Java虚拟机中,在此过程需要检验该类文件是否符合类文件规范; 字节码校验器(bytecodeverifier)检查该类文件的代码中是否存在着某些非法操作; Java解释器负责把该类文件解释成为机器码进行执行。 Java虚拟机采用的是“沙箱”运行模式,即把Java程序的代码和数据都限制在一定内存空间里执行,不允许程序访问该内存空间外的内存;如果是applet程序,还不允许访问客户端机器的文件系统。
  • 10. 认识几个名字application program interface (API) 应用程序接口。用于Java开发的一大堆预定义的类和接口,由sun公司发布,不同版本的Java,API略有不同 Java Development Toolkit (JDK) Java开发包,目前最新版本是6(也称为1.6版);此外每一次的小升级,都会有一个子版本号出来。 比如jdk-6u14-windows-i586.exe的JDK,主版本号是6,u14表示update 14,即第14次的小升级版 integrated development environment (IDE) 集成开发环境,用于开发Java程序的著名IDE有NetBeans、Eclipse等等
  • 11. JDK的一家J2EE:Java2 Enterprise Edition J2SE:Java2 Standard Edition J2ME:Java2 Micro Edition
  • 12. Java开发环境的安装1. 下载JDK,下载地址:http://java.sun.com/ 2. 安装JDK(没啥技术含量,一直next就可以了 ) 3. 设置三个环境变量(在我的电脑点右键→属性→高级→环境变量,最好设置在系统变量中) 变量名:JAVA_HOME(一般不存在,要自己添加) 变量值:JDK的实际安装目录,如C:\jdk1.6.0_02 变量名:path(一般已存在,请修改原值) 变量值:在原值的最前面加%JAVA_HOME%\bin; 变量名:classpath(一般已存在,请修改原值) 变量值:在原值的最前面加.;%JAVA_HOME%\lib;友情提醒:这是个英文 句号,表示当前目录
  • 13. Java的开发工具身出名门的IDE 正派 netBeans(推荐指数:★★★★★) JBuilder(推荐指数:★★★) VisualAge(推荐指数:★★) 旁门 Visual J++ (推荐指数:☆) 开源的IDE(http://www.eclipse.org/) Eclipse (推荐指数:★★★★★) 命令行开发方式 UltraEdit/EditPlus + JDK (推荐指数:★★★★)
  • 14. Java的注释/* 第一种格式注释,块注释 */ public class HelloJava { public static void main(String args[ ]) { System.out.println("Hello Java!"); } // 第二种格式注释,行注释 } /** 第三种格式注释,块注释,用于自动生成程序的帮助文档 */
  • 15. 一个简单的Java程序下面程序是在屏幕上输出一行文字。 小结: 1. 一个Java程序至少有一个类class 2. 一个类可以拥有一个main函数,这个main函数是程序运行的入口
  • 16. Java开发步骤(3步) 编辑源文件(.java) 编译成字节码文件(.class) 启动虚拟机运行.class文件
  • 17. 一个例题用Java很容易在对话框上显示文字: import javax.swing.JOptionPane; public class Welcome { public static void main(String[] args) { System.out.println("dos output"); System.out.print("123\t456\t789\n你好,Java!"); JOptionPane.showMessageDialog(null, "Welcome to Java!", "Display Message", JOptionPane.INFORMATION_MESSAGE); } }
  • 18. 运行一下上面那个程序打开记事本,贴上那些代码,然后,千万千万,要把源文件命名为: Welcome.java 进入DOS,爬到Welcome所在目录,然后编译它(javac表示java compile): javac Welcome.java 然后运行它: java Welcome
  • 19. 关于Java的源文件命名规则Java源文件不能随便取名,它一定要取这个文件中public class的那个class名,包括大小写也必须是一样的!例如上面的例子,源文件名一定要叫Welcome.java。 所以每一个Java源文件至少有一个class,可以有很多个class,但是只能有一个public class。 为什么有这么奇怪的规定?因为每一个class都可以有自己的main函数,而main函数就是程序的入口,因此JVM只会进入public class所拥有的那个main函数开始运行。
  • 20. 开始学习Java语法
  • 21. 学写简单程序我们用下面的算法来完成一个面积计算的程序: 读入半径radius 利用公式计算面积area: area = radius * radius * pi 3. 输出面积
  • 22. 第一步搭一个框架 public class ComputeArea { // Data and methods to be given later } 细化一下 public class ComputeArea { public static void main(String[] args) { // Step 1: Read in radius // Step 2: Compute area // Step 3: Display the area } }
  • 23. 第二步我们需要存储半径和面积,所以引入两个变量: public class ComputeArea { public static void main(String[] args) { double radius; double area; // Step 1: Assign a radius // Step 2: Compute area // Step 3: Display the area } }
  • 24. 完整版程序
  • 25. 标识符命名规则 字符集:字母、数字、下划线_、美元符$ 不能以数字开头 不能用关键字 不能用 true、false和null 可以是任意长度 注意:Java是大小写敏感的, 因此X和x是不同的变量名。
  • 26. 变量变量是用来存储数据的,声明方式如下: 变量类型 变量名1, 变量名2, ... ,变量名n; 例如: int x; // 声明 x是整型变量 double radius; // 声明radius是浮点型变量 char a; // 声明a是字符型变量 可以同时声明几个变量,例如: int i, j, k; // 声明i, j,k都是整型变量
  • 27. 赋值语句和赋值表达式Java用等号表示赋值,赋值的语法如下: 变量名=表达式; 例如: int x = 1; double radius = 1.0; x = 5 * (3 / 2) + 3 * 2; x = x + 1; area = radius * radius * 3.14159;
  • 28. 常量如果在程序运行期间,都需要保持某一个值不变,可以将其定义为常量。定义常量的语法如下: final 数据类型 常量名=常量值; 例如:final double PI = 3.14159; 常量名的命名规则和变量名是一样的,只不过为了醒目,常量名一般是全大写,例如:PI, MAX_INTEGER, STU_NAME
  • 29. 数值类型和运算Java里表示一个数有多种类型可选,如: byte 1字节整数 short 2字节整数 int 4字节整数 long 8字节整数 float 4字节IEEE 754标准浮点数 double 8字节IEEE 754标准浮点数
  • 30. 算术运算符共有5种,如下: +加法 –减法 *乘法 /除法 %取余 取余在某些地方很好用,例如今天是星期六,那么过10天后是星期几?这个问题可以用取余运算来实现:
  • 31. 数值常量-1整型 默认的数值类型是int型,如 int a=100; 如果类型不同,Java会自动转换,但是要注意越界问题,如 byte b=1000; 就有问题。 可以让数值变成long型的,只要加一个L或者l,如 long c=123456L; 可以让数值以16进制的形式书写,如: short d=0XFF;
  • 32. 数值常量-2浮点数 普通写法,默认类型是double,如 float f=12.3; 可以用F来指定类型为float,如 float f=12.3F; 科学记数法,如 double g=1.23E2; E表示10的次方,可以大写也可以小写 E前面必须有一个数,带不带小数点无所谓 E后面必须有一个整数,可正可负
  • 33. 算术表达式算术表达式的书写只要注意: 当不清楚优先级的时候,多用() 一定不能省略乘号,如3y这种数学写法,要写成3*y 例如: 写成Java表达式是: (3 + 4 * x) / 5 – 10 * (y - 5) * (a + b + c) / x + 9 * (4 / x + (9 + x) / y)
  • 34. 复合运算符+= 如 i += 8 相当于 i = i + 8 -= 如 f -= 8.0 相当于 f = f - 8.0 *= 如 i*= 8 相当于 i = i * 8 /= 如 i /= 8 相当于 i = i / 8 %= 如 i %= 8 相当于 i = i % 8 ++ 如 i++和++i 都相当于 i = i + 1 -- 如 i--和--i 都相当于 i = i - 1
  • 35. 前置++与后置++后置++:先用旧值,然后自增 前置++:先自增,然后用新值 一个例子: int x = 1; int y = 5; int z = x-- + (++y); //z=???
  • 36. 类型转化不同的数值类型可以混合运算;Java会对不同类型进行自动类型转化,以便运算符两边的类型相同,然后才开始计算。 例如:double d = 6 * 3.0 + 7 / 2; //d=31.0 低级到高级的转化是自动的: 反之要强制转化,如: float f = (float)10.1; int i = (int)f;
  • 37. 强制类型转换的应用假设商品税率是6%,价格是197.55,计算应缴的税款(截留两位小数)。 1 public class SalesTax { 2 public static void main(String[] args) { 3 double purchaseAmount = 197.55; 4 double tax = purchaseAmount * 0.06; 5 System.out.println((int)(tax * 100) / 100.0); 6 } 7 }
  • 38. 字符类型和运算Java用的是Uniode字符集,需要两个字节才能表示一个字符,所以它可以用一个char存储一个汉字。 字符必须用单引号' '修饰;字符串用" "。 例如: char letter = 'A'; char numChar = '4'; char huan='\u6B22';//汉字“欢”
  • 39. 单个字符可以用来拼成一个字符串输出,例如: 上面的例子用汉字直接写在" "中也是可以的,但是当你的机器没有安装汉字库的时候,你也只能写成如例子那样才行。Unicode字符的例子
  • 40. 转义字符转义字符是由\引导的特殊字符,它和后续的一个字符合起来表示一个新的含义,例如: \b Backspace \t Tab \n Linefeed \f Formfeed \r Carriage Return \\ Backslash \' Single Quote \" Double Quote 例如要输出He said "Java is fun",必须写成: System.out.println("He said \"Java is fun\"");
  • 41. char和数值类型char的存储形式和整数(byte,short,int,long)是一样的,所以它可以跟整数混合运算。 char实质上相当于unsigned short,即无符号双字节整数。 几个例子: char c = (char)0XAB0041; char c = (char)65.25; int i = (int)'A'; byte b = (byte)'\uFFF4';
  • 42. 布尔类型和运算布尔运算取值只有两个:true和false,记住要全小写,例如: boolean lightsOn = true; 比较运算符都能够得到布尔类型的结果,例如:<, <=, >, >=, ==, != 布尔值之间可以进行布尔运算,例如: ! 逻辑非,&& 逻辑与,||逻辑或,^逻辑异或
  • 43. 一个例子 1 import javax.swin ptionPane; 2 3 public class TestBoolean { 4 public static void main(String[] args) { 5 int number = 18; 6 7 JOptionPane.showMessageDialog(null, 8 "Is " + number + 9 "\n divisible by 2 and 3? " + 10 (number % 2 == 0 && number % 3 == 0) 11 + "\n divisible by 2 or 3? " + 12 (number % 2 == 0 || number % 3 == 0) + 13 "\n divisible by 2 or 3, but not both? " 14 + (number % 2 == 0 ^ number % 3 == 0)); 15 } 16 }
  • 44. 运算优先级和结合性优先级指的是不同的运算符在一起的时候,哪个先算的问题。 例如:a+b/c,由于/的优先级比+高,先算b/c 结合性指的是运算符的级别相同时(运算符本身可能不同),从哪个方向算起的问题。 例如:a*b/c,由于*和/优先级相同,按照结合性是从左到右,所以先算a*b 记不住优先级和结合性没有关系,因为括号()的优先级最高,你随时可以用()来决定运算的顺序。
  • 45. 字符串类型 String并不是一种基本类型,它是一个引用类型。严格说来,String只是一个类,不是类型。 String用来表示字符串,支持+和+=运算符。例如: String message = "Welcome" + "to" + "Java"; String s = "Chapter" + 2; // s=Chapter2 String s = "Suppl" + 'B'; // s= SupplB System.out.println("" + 1 + 2); //输出12 System.out.println("" + (1 + 2)); //输出3
  • 46. 从输入对话框中获取输入上图是Java常见的输入手段,这时用户所有的输入会通过input这个字符串传回来。如果用户直接关闭或者取消,input会得到null,表示空串。 换句话说,这种方式下,无论用户输入何内容,最后你都将得到一个String的返回值。
  • 47. 字符串类型转成数值类型可以把String转成int,这样就可以把用户的输入当作整数使用了,例如: int intValue = Integer.parseInt(input); 当然这里要求input是形如整数的字符串,例如"123",否则后果很严重。 也可以把String转成double。例如: double doubleValue = Double.parseDouble(input); 当然这里要求input是形如浮点数的字符串,例如"123.345",否则后果同样严重。
  • 48. 再来一个例子 1 import javax.swing.JOptionPane; 2 3 public class LeapYear { 4 public static void main(String args[]) { 5 // Prompt the user to enter a year 6 String yearString = JOptionPane.showInputDialog(“输入年份"); 7 8 // Convert the string into an int value 9 int year = Integer.parseInt(yearString); 10 11 // Check if the year is a leap year 12 boolean isLeapYear = 13 (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0); 14 15 // Display the result in a message dialog box 16 JOptionPane.showMessageDialog(null, 17 year + “ 是闰年吗? " + isLeapYear); 18 } 19 }
  • 49. 从控制台(DOS)输入从JDK1.5开始,控制台输入终于简化了,以前输入一个int要这样: BufferedReader in=new BufferedReader(new InputStreamReader(System.in)); try{ int i = Integer.parseInt(in.readLine()); }catch (IOException e){ } 现在是这样: Scanner scanner = new Scanner(System.in); int i = scanner.nextInt();
  • 50. 一个例子 1 import java.util.Scanner; // Scanner is in java.util 2 3 public class TestScanner { 4 public static void main(String args[]) { 5 // Create a Scanner 6 Scanner scanner = new Scanner(System.in); 7 8 // Prompt the user to enter an integer 9 System.out.print(“给个整数int? "); 10 int intValue = scanner.nextInt(); 11 System.out.println(“你输入了 " + intValue); 12 13 // Prompt the user to enter a double value 14 System.out.print(“给个浮点数double? "); 15 double doubleValue = scanner.nextDouble(); 16 System.out.println(“你输入了 " 17 + doubleValue); 18 19 // Prompt the user to enter a string 20 System.out.print(“给个字符串?别带空格: "); 21 String string = scanner.next(); 22 System.out.println(“你输入了 " + string); 23 } 24 }
  • 51. 开始学习控制结构
  • 52. 选择语句-11. 简单的if语句 if (booleanExpression) { statement(s); }例如: if (radius >= 0) { area = radius * radius * PI; System.out.println("The area for the circle of radius " + radius + " is " + area); }
  • 53. 选择语句-22. if...else语句 if (booleanExpression) { statement(s)-for-the-true-case; } else { statement(s)-for-the-false-case; }
  • 54. 选择语句-33. 嵌套的if语句 嵌套if语句的原则是“就近匹配”,也就是先从第一个else找起(因为else总是和if成对出现,但是if可以单独出现,所以从else找起),向上找离它最近的if,这个if就是跟它匹配的if
  • 55. 一个例子10以内减法自测器,运行结果如图: 解题思路: 1. 随机生成两个10以内整数 2. 如果第一个数比较小,交换两个数 3. 提示用户输入结果 4. 判断结果,并输出
  • 56. 1 import javax.swing.JOptionPane; 2 3 public class SubtractionTutor { 4 public static void main(String[] args) { 5 // 1. Generate two random single-digit integers 6 int number1 = (int)(Math.random() * 10); 7 int number2 = (int)(Math.random() * 10); 8 9 // 2. If number1 < number2, swap number1 with number2 10 if (number1 < number2) { 11 int temp = number1; 12 number1 = number2; 13 number2 = temp; 14 } 15 16 // 3. Prompt the student to answer "what is number1 – number2?" 17 String answerString = JOptionPane.showInputDialog 18 ("What is " + number1 + " - " + number2 + "?"); 19 int answer = Integer.parseInt(answerString); 20 21 // 4. Grade the answer and display the result 22 String replyString; 23 if (number1 - number2 == answer) 24 replyString = "You are correct!"; 25 else 26 replyString = "Your answer is wrong.\n" + number1 + " - " 27 + number2 + " should be " + (number1 - number2); 28 JOptionPane.showMessageDialog(null, replyString); 29 } 30 }
  • 57. 选择语句-44. switch语句 switch (switch-expression) { case value1: statement(s)1; break; case value2: statement(s)2; break; … case valueN: statement(s)N; break; default: statement(s)-for-default; }
  • 58. switch表达式只能取值为char, byte, short, int value1, . . ., and valueN表示对应的入口 break是可选的,但是没有它的话可能会有些惊喜,例如: switch (ch) { case 'a': System.out.println(ch); case 'b': System.out.println(ch); case 'c': System.out.println(ch); }选择语句-4
  • 59. 选择语句-55. 条件表达式 先看下面这些代码: if (x > 0) y = 1 else y = -1; 它有一个等价写法: y = (x > 0) ? 1 : -1; 条件表达式语法: booleanExpression ? expression1 : expression2;
  • 60. 循环语句-11. while循环 while (loop-continuation-condition) { // Loop body Statement(s); }例如: int count = 0; while (count < 100) { System.out.println("Welcome to Java!"); count++; }
  • 61. 整数求和工具执行效果如图:
  • 62. 1 import javax.swing.JOptionPane; 2 3 public class SentinelValue { 4 /** Main method */ 5 public static void main(String[] args) { 6 // Read an initial data 7 String dataString = JOptionPane.showInputDialog( 8 "Enter an int value:\n(the program exits if the input is 0)"); 9 int data = Integer.parseInt(dataString); 10 11 // Keep reading data until the input is 0 12 int sum = 0; 13 while (data != 0) { 14 sum += data; 15 16 // Read the next data 17 dataString = JOptionPane.showInputDialog( 18 "Enter an int value:\n(the program exits if the input is 0)"); 19 data = Integer.parseInt(dataString); 20 } 21 22 JOptionPane.showMessageDialog(null, "The sum is " + sum); 23 } 24 }
  • 63. 循环语句-22. do...while循环 do { // Loop body; Statement(s); } while (loop-continuation-condition); 例题: 用do...while改写上一个例子
  • 64. 1 import javax.swing.JOptionPane; 2 3 public class TestDoWhile { 4 /** Main method */ 5 public static void main(String[] args) { 6 int data; 7 int sum = 0; 8 9 // Keep reading data until the input is 0 10 do { 11 // Read the next data 12 String dataString = JOptionPane.showInputDialog(null, 13 "Enter an int value:\n(the program exits if the input is 0)", 14 "TestDo", JOptionPane.QUESTION_MESSAGE); 15 16 data = Integer.parseInt(dataString); 17 18 sum += data; 19 } while (data != 0); 20 21 JOptionPane.showMessageDialog(null, "The sum is " + sum, 22 "TestDo", JOptionPane.INFORMATION_MESSAGE); 23 } 24 }
  • 65. 循环语句-33. for循环 for (initial-action; loop-continuation-condition; action-after-each-iteration) { // Loop body; Statement(s); }int i; for (i = 0; i < 100; i++) { System.out.println("Welcome to Java!"); }
  • 66. for循环的例子 1 import javax.swing.JOptionPane; 2 3 public class TestSum { 4 public static void main(String[] args) { // Initialize sum 6 float sum = 0; 7 8 // Add 0.01, 0.02, ..., 0.99, 1 to sum 9 for (float i = 0.01f; i <= 1.0f; i = i + 0.01f) 10 sum += i; 11 12 // Display result 13 JOptionPane.showMessageDialog(null, "The sum is " + sum); 14 } 15 }
  • 67. 循环语句-44. 嵌套循环 做一个9*9乘法表
  • 68. 1 import javax.swing.JOptionPane; 2 3 public class MultiplicationTable { 4 /** Main method */ 5 public static void main(String[] args) { 6 // Display the table heading 7 String output = " Multiplication Table\n"; 8 output += "------------------------------------------------\n"; 9 10 // Display the number title 11 output += " | "; 12 for (int j = 1; j <= 9; j++) 13 output += " " + j; 14 15 output += "\n"; 16 17 // Print table body 18 for (int i = 1; i <= 9; i++) { 19 output += i + " | "; 20 for (int j = 1 j < = 9; j++) { 21 // Display the product and align properly 22 if (i * j < 10) 23 output += " " + i * j; 24 else 25 output += " " + i * j; 26 } 27 output += "\n"; 28 } 29 30 // Display result 31 JOptionPane.showMessageDialog(null, output); 32 } 33 }
  • 69. 使用哪种循环 其实循环都是等价的,具体使用哪种循环纯属个人爱好……
  • 70. break和continuebreak:结束包含此break的这个循环 continue:结束本次循环(注意整个循环还没有结束)
  • 71. break的例子 1 public class TestBreak { 2 /** Main method */ 3 public static void main(String[] args) { 4 int sum = 0; 5 int number = 0; 6 7 while (number < 20) { 8 number++; 9 sum += number; 10 if (sum >= 100) break; 11 } 12 13 System.out.println("The number is " + number); 14 System.out.println("The sum is " + sum); 15 } 16 }
  • 72. continue的例子 1 public class TestContinue { 2 /** Main method */ 3 public static void main(String[] args) { 4 int sum = 0; 5 int number = 0; 6 7 while (number < 20) { 8 number++; 9 if (number == 10 || number == 11) continue; 10 sum += number; 11 } 12 13 System.out.println("The sum is " + sum); 14 } 15 }
  • 73. 几个例子-11. 求最大公约数的例子,关键代码: int gcd = 1; int k = 1; while (k <= n1 && k <= n2) { if (n1 % k == 0 && n2 % k == 0) gcd = k; k++; }
  • 74. 几个例子-22. 显示一个数字金字塔 算法思想: for (int row = 1; row <= numberOfLines; row++) { Print (numberOfLines - row) * 3 leading spaces; Print leading numbers row, row - 1, ..., 1; Print ending numbers 2, 3, ..., row - 1, row; Start a new line; }
  • 75. 关键代码 for (int row = 1; row <= numberOfLines; row++) { // Print NUMBER OF LINES – row) leading spaces for (int column = 1; column <= numberOfLines - row; column++) System.out.print(" "); // Print leading numbers row, row - 1, ..., 1 for (int num = row; num >= 1; num--) System.out.print((num >= 10) ? " " + num : " " + num); // Print ending numbers 2, 3, ..., row - 1, row for (int num = 2; num <= row; num++) System.out.print((num >= 10) ? " " + num : " " + num); // Start a new line System.out.println(); }
  • 76. 几个例子-3求素数 判断一个数是否素数,关键代码: // Assume the number is prime boolean isPrime = true; // Is the current number prime? // Test if number is prime for (int divisor = 2; divisor <= number / 2; divisor++) { if (number % divisor == 0) // the number is not prime isPrime = false; // Set isPrime to false break; // Exit the for loop } }
  • 77. 开始学习函数(方法)
  • 78. 创建一个函数创建方法的语法如下: modifier returnValueType methodName(list of parameters) { // Method body; } 下面是创建一个方法和调用的例子:
  • 79. 调用一个函数如果方法有返回值,可以选择接收这个值或者忽略这个值,如: int larger = max(3, 4); 或者 max(3, 4); //返回值被丢弃 如果方法没有返回值(void),那么直接调用就可以了,如: System.out.println("Welcome to Java!");
  • 80. 一个例子 1 public class TestMax { 2 /** Main method */ 3 public static void main(String[] args) { 4 int i = 5; 5 int j = 2; 6 int k = max(i, j); 7 System.out.println("The maximum between " + i + 8 " and " + j + " is " + k); 9 } 10 11 /** Return the max between two numbers */ 12 public static int max(int num1, int num2) { 13 int result; 14 15 if (num1 > num2) 16 result = num1; 17 else 18 result = num2; 19 20 return result; 21 } 22 }
  • 81. 函数参数的值传递通过函数参数,可以控制函数的行为,如: public static void nPrintln(String message, int n) { for (int i = 0; i < n; i++) System.out.println(message); } 通过给nPrintln函数传递不同的n值,可以打印出不同次数的message
  • 82. 值传递并不修改实参的值 /** Swap two variables */ public static void swap(int n1, int n2) { System.out.println("\tInside the swap method"); System.out.println("\t\tBefore swapping n1 is " + n1 + " n2 is " + n2); // Swap n1 with n2 int temp = n1; n1 = n2; n2 = temp; System.out.println("\t\tAfter swapping n1 is " + n1 + " n2 is " + n2); } 这样去调用: int num1 = 1; int num2 = 2; swap(num1, num2); /*不难发现,调用之后,这两个数不变*/
  • 83. 值传递,相当于给实参做一个副本上面的例子中,n1和n2就是num1和num2的副本,所以无论这么折腾n1和n2,都不会影响num1和num2的值
  • 84. /** Return the max between two int values */ public static int max(int num1, int num2) { if (num1 > num2) return num1; else return num2; } /** Find the max between two double values */ public static double max(double num1, double num2) { if (num1 > num2) return num1; else return num2; } /** Return the max among three double values */ public static double max(double num1, double num2, double num3) { return max(max(num1, num2), num3); }方法重载重载的特征: 1. 函数名完全相同 2. 参数要么个数不同,要么类型不同 3. 返回值不作为重载依据,所以参数完全相同但是返回值不同的两个函数,会有编译错误
  • 85. 变量作用域变量作用域是从定义的地方开始,到包含它的最近的'}'为止。 循环变量仅仅在本循环有效。
  • 86. 作用域的例子注意这个用法是错误的: for (int i = 0; i < 10; i++) { } System.out.println(i);
  • 87. 生成随机字符-1Java的字符是双字节的,所以取值范围是0~65535,为了生成随机字符,可以这样分析: Math.random() ==> [0,1) Math.random()*65535 ==> [0,65535) Math.random()*65535+1 ==>[0,65536) 然后只要最后结果取整即可
  • 88. 生成随机字符-2生成随机小写字母 (int)(Math.random()*26) ==>0,1,2,...,25 'a'+(int)(Math.random()*26)==>'a','b','c',...,'z' 生成ch1和ch2之间的字母 (char)(ch1 + Math.random() * (ch2 – ch1 + 1)) 推广之,生成[a,b]之间的整数 (int)(a+ Math.random() * (b – a + 1))
  • 89. 什么是包( package )包的作用类似于C的函数库,但是C的函数库很容易出现重名的问题,包在一定程度上解决了这个问题。 一个包通常包含很多个功能相近的类。 JDK里面已经包含了N个功能强大的包,所以当你要实现一个功能,首先记得去查一下JDK的文档,看看有否对应功能的包。 编程语言的优劣都是相对而言的,大家觉得Java功能很强大,其实是因为SUN公司的JDK免费赠送了众多功能强大的包。
  • 90. 包-1包的命名 SUN公司建议用域名的逆序,因为域名是唯一的。如:cn.edu.xmu 包的结构 一个包被映射为一个目录,包里面的每个类,则映射到目录中的某一个文件,如:com.prenhall.mypackage这个包被展开后,就是
  • 91. 包-2打包 package packagename; 上面这一行一般出现在Java源文件的第一行,表示这个文件的所有类,都将被打包到packagename中。 不同源文件的packagename可以相同,Java会根据packagename将相同包的class压缩在一起,生成一个扩展名为jar的包。 顺便说一下,jar包其实是zip格式的压缩文件
  • 92. 包-3使用包 要使用一个包里的某个类,必须首先导入 import javax.swing.JOptionPane; 如果要使用一个包里的多个类,用这个 import javax.swing.*; *表示导入这个包的所有类 注意包之间没有嵌套关系,例如java.awt和java.awt.geom是两个完全独立的包。这个其实很好理解,因为java.awt这个包,仅仅包含java/awt这个目录下的class文件,而java/awt/geom则是另外一个目录了。
  • 93. THE END