Java语言程序设计 上海大学春季学期
教学参考书 实践大师:JAVA 2 编程篇 JAVA 2 Programmer’s Interactive Workbook 电子工业出版社文字 JAVA 面向对象程序设计教程 清华大学出版社 Java语言导学 机械工业出版社
实验教学指导书 《JAVA与 面向对象程序设计实验指导与习题集》 清华大学出版社
教学安排 上课:周三下午1~2节 上机:周三下午3~4节 (第二周开始上机C420、421)
Not to study, But to learn. 少做笔记,多听、多动手。 学 习 方 法 Not to study, But to learn. 少做笔记,多听、多动手。
平时情况与考试情况相结合 书面考试与上机实验相结合 课 程 考 试 平时情况与考试情况相结合 书面考试与上机实验相结合
第一章 Getting Started 1. 关于Java技术 2 . Java开发工具包的安装与配置 3. Java程序的建立、编译与运行 4. 程序HelloWorld的分析
1.1 关于Java技术 IT 界到处都在谈论Java技术,但是Java技术到底是什么?下面我们介绍Java编程语言和Java平台。
1.1.1 Java编程语言 Java编程语言是一种高级编程语言,它具有如下性质: • 简单 Simple • 稳固 Robust • 高性能 High performance •安全 Secure • 面向对象 Object oriented • 多线程 Multithreaded •动态 Dynamic • 分布式 Distributed • 与平台无关 Platform independent • 解释 Interpreted •轻便 Portable
1.1.1 Java编程语言 对于大多数语言,要运行程序,要么编译程序要么解释程序;而Java语言的程序则既要被编译又要被解释。 编译程序将Java源程序翻译为字节码(bytecode)程序; 解释程序Java虚拟机分析并运行字节码程序。 一次编写,处处运行 Write once,run anywhere!
用Java源程序先被编译、后被解释
一次编写,处处运行
1.1.2 Java平台 • 平台(Platform)是程序在其中运行的硬件或软件环境。 • 最流行平台:Windows 2000, Linux, Solaris, MacOS • Java平台:一种运行在其它硬件平台上纯软件 平台,它有两个组件: Java虚拟机(Java VM)和 Java应用编程接口(Java API)
1.1.2 Java平台 • Java VM是Java平台的基础 • Java API是预先建立的软件组件的集合,提供丰富的功能,如GUI部件。 Java API被分为相关类和接口的库,这些库称为包(package)
Java API和Java VM将程序与硬件分离
1.1.3 Java技术可以做什么 • Java程序的常见类型是Applet和Application 基本内容:对象、字符串、线程、输入/输出、 数据结构、系统属性、日期、时间等; Applets:与Java applet使用的一组约定; 连网:URL、传输控制协议(TCP)、用户数据报协议(UDP)套接字和IP地址。 国际化:帮助进行本地化的程序。
1.1.3 Java技术可以做什么 (6) 安全:包括低层和高层安全性,如电子签名、 公共密钥和私有密钥管理、访问控制和证书。 (6) 安全:包括低层和高层安全性,如电子签名、 公共密钥和私有密钥管理、访问控制和证书。 (7) 软件组件:称为Java Beans的组件可以插入现有的组件体系结构。 (8) 对象串行化:通过远程方法调用(Remote Method Invocation, RMI)支持轻型的持久性和通信。 (9) Java数据库连接(JDBC):提供对各种关系数据库的统一访问。
Java 2 SDK
1.2 Java开发工具包的安装与配置 为了鼓励使用Java语言开发软件,Sun Microsystems公司提供了免费的软件开发工具包(SDK),其中包括编译器、虚拟机、调试器等开发工具,称为Java开发工具包或JDK。Windows版和Solaris版的JDK可以从如下站点下载: http://www.sun.com/products/jdk/1.2/index.html
1.2 Java开发工具包的安装与配置 安装:执行安装程序,按提示即可。
1.2 Java开发工具包的安装与配置 路径配置:加入路径C:\jdk1.3\bin SET PATH=%PATH; C:\jdk1.3\bin 环境变量: SET CLASSPATH=%CLASSPATH;.;C:\JDK1.3\Lib
1.3 Java程序的建立、编译与运行 • 创建第一个应用程序:程序HelloWorldApp将显示一句问候语“HelloWorld!”。 • 创建第一个小应用程序:程序HelloWorld也将显示一句问候语“HelloWorld!”。
1.3.1 创建第一个应用程序 Step1:创建源代码文件; Step2:将源代码文件编译为字节码文件; Step3:运行字节码文件
1.3.1.1 创建源代码文件 启动“记事本”,输入如下代码: public class HelloWorldApp { 1.3.1.1 创建源代码文件 启动“记事本”,输入如下代码: public class HelloWorldApp { public static void main(String[] args) { //Display the string. System.out.println("Hello World!"); } 注意:大小写敏感;文本文件;文件名为<类名>.java
1.3.1.2 编译源代码文件 注意:编译成功后将生成字节码文件 HelloWorldApp.class 1.3.1.2 编译源代码文件 进入DOS或Command提示符状态; 转到Java源程序所在目录,如C:\java 输入如下命令,并回车: javac HelloWorldApp.java 注意:编译成功后将生成字节码文件 HelloWorldApp.class
1.3.1.3 运行程序 在相同目录下输入如下命令,并回车: java HelloWorldApp
1.3.2 创建第一个小应用程序 Step1:创建源代码文件; Step2:配套的HTML文件; Step3:将源代码文件编译为字节码文件;
1.3.2.1 创建源代码文件 启动“记事本”,输入如下代码,并保存为HelloWorld.java import java.applet.Applet; import java.awt.Graphics; public class HelloWorld extends Applet { public void paint(Graphics g) { g.drawString("Hello world!", 50, 25); }
1.3.2.2 创建相应的HTML文件 在“记事本”,输入如下代码,并保存为Hello.html <HTML> <HEAD> <TITLE> A Simple Program </TITLE> </HEAD> <BODY> Here is the output of my program: <APPLET CODE="HelloWorld.class" WIDTH=150 HEIGHT=25> </APPLET> </BODY> </HTML>
1.3.2.3 编译源代码文件 注意:编译成功后将生成字节码文件 HelloWorld.class 进入DOS或Command提示符状态; 1.3.2.3 编译源代码文件 进入DOS或Command提示符状态; 转到Java源程序所在目录,如C:\java 输入如下命令,并回车: javac HelloWorld.java 注意:编译成功后将生成字节码文件 HelloWorld.class
1.3.2.4 运行程序 输入如下命令,并回车: appletviewer Hello.html
1.4 程序HelloWorld的分析 既然我们已经编译并运行了第一个Java程序,我们自然想知道它的工作原理。本节我们首先分析HelloWorldApp应用程序,然后再分析HelloWorld小应用程序。
1.4.1 对应用程序的分析 • 注释: /* 文本 */ /** 文本 */
1.4.1 对应用程序的分析(续) • 定义类: 类是面向对象语言的基本构件。类是一个“蓝图”,描述此的实例(instance)相关联的状态和行为。当你实例化(instantiate)一个类时,就是创建一个对象,它的状态和行为与此类的其它实例相同。状态由成员变量表示;行为则由方法表示。
1.4.1 对应用程序的分析(续) • main方法: 每个Java应用程序的入口点都是它的main方法。当运行Java应用程序时,指定要运行的类的名称,Java解释器调用该类中定义的main方法,由main方法控制程序的流程、分配所需资源并运行为此应用程序提供功能的其它方法。
1.4.1 对应用程序的分析(续) 每个Java应用程序必须声明一个mian方法: public static void main(String[] args) 修饰符: public:允许任何类调用main方法; static:表示main方法与HelloWorldApp类相关联, 而不是在这个类的一个实例上进行操作。 void: 表示main方法不返回任何值。 String:命令行参数。
1.4.1 对应用程序的分析(续) • 使用类和对象 该程序使用了System类。 System类提供的功能之一是标准输出流。System.out是System类中的out变量的完整名称。应用程序没有实例化System类,而是通过System类直接访问out,这是因为out是类变量,与类相关联,而不与对象相关联。类变量out引用PrintStream类的一个实例。当System类被载入时,它实例化PrintStream类,并为类变量out分配一个新的PrintStream对象,再调用其实例方法:System.out.println(“Hello World!”)
1.4.2 对小应用程序的分析 • 导入类和包 两条import语句分别导入Applet和Graphics类,从而可以引用其它包中的类。如果删除这两行,则须修改程序如下: public class HelloWorld extends java.applet.Applet { public void paint(java.awt.Graphics g) { g.drawString("Hello world!", 50, 25); }
1.4.2 对小应用程序的分析 • 定义Applet子类 public class HelloWorld extends Applet 关键字extends表示HelloWorld类是Applet类的一个子类。每个小应用程序applet都必须是Applet类的一个子类,从而继承Applet类的功能,从与浏览器通信到GUI。
1.4.2 对小应用程序的分析 • 实现applet的方法 HelloWorld applet只实现了一个方法paint。 与应用程序不同,applet不需要main方法。 Applet应包含在HTML页面中。
1.4.2 对小应用程序的分析 • 运行applet的方法 当支持Java的浏览器遇到<APPLET>标记时,为applet保留屏幕显示空间,将Applet子类装载进它所在的计算机,然后创建Applet子类的一个实例。
1.5 常见错误 编译时错误 路径设置错、文字输入错 运行时错误 源文件名与public类名不一致 类的数量 源文件格式
第二章 基本概念 2.1 注释与程序段 注释 // /* */ 分号 ; 程序段 { } 空白
第二章 基本概念(续) 2.2 标识符 字母、下划线或$开头的字母、数字、下划线和$构成的字符串。 2.3 Java语言的关键字 保留字
2.4 Java基本数据类型 分四大类:逻辑、字符、整数和浮点 共9种基本数据类型 逻辑类型:boolean 字符类型:char和string 整数类型:byte,short,int和long 浮点类型:float和double
2.6 Java 编程习惯 程序可读性 类、接口:通常使用名词,且每个单词的 首字母要大写 方法:可以是动词,首字母小写,其后用大写 字母分隔每个单词 常量:全部大写,单词之间用下划线分隔 变量:同方法,应该避免使用$符号
第二章 基本概念 2.1 注释与程序段 注释 // /* */ 分号 ; 程序段 { } 空白
第二章 基本概念(续) 2.2 标识符 字母、下划线或$开头的字母、数字、下划线和$构成的字符串。 2.3 Java语言的关键字 保留字
2.4 Java基本数据类型 分四大类:逻辑、字符、整数和浮点 共9种基本数据类型 逻辑类型:boolean 字符类型:char和string 整数类型:byte,short,int和long 浮点类型:float和double
2.6 Java 编程习惯 程序可读性 类、接口:通常使用名词,且每个单词的 首字母要大写 方法:可以是动词,首字母小写,其后用大写 字母分隔每个单词 常量:全部大写,单词之间用下划线分隔 变量:同方法,应该避免使用$符号
2.6 Java 编程习惯(续) 程序可读性 控制结构:if-then-else和for语句等中的 语句或语句组要用{} 间隔:每行一条语句,并且采缩进格式 注释:尽量多注释
2.7 对象概念 用一个下午学习,用一生去掌握 复合数据类型:多个不同类型变量的组合,如structure,record 2.7 对象概念 用一个下午学习,用一生去掌握 复合数据类型:多个不同类型变量的组合,如structure,record 类:在OOP中将复合数据类型称为类(class) 对象:某个类的实例 成员:构成对象的基本元素 引用:其值为地址者
2.8 变量概述 Java“类”定义对象,对象就是数据和处理,或表示这些数据的操作。变量是类中数据的“容器”,也被称为“域”(field)。 变量声明:在使用变量之前,类必须定义变量的类型和名字,即先定义,后使用。 例如: String myOutPut;
2.8 变量概述(续) 变量赋值:<变量名> = <表达式>; 变量作用域:变量起来作用的范围,即在那里存在和在那里不存在。 作用域判断:变量只在声明它的代码块中以及该块内所包含的任何块中。在此区域之外该变量既不存也不能被引用。
2.8 变量概述-Eample import java.applet.Applet; public class scopeTest extends Applet { String myString = "Hello"; public void init() doPrintSomething(); doPrintSomethingElse(); } public void doPrintSomething() String notPrinted; notPrinted = "Hi!"; String localString = "World!"; System.out.println(myString + " " + localString); } public void doPrintSomethingElse() { String localString = "Everybody!";
2.9 方法概要 方法(method):定义类能够执行的动作和如何执行这些动作。 方法分为三类: 转换器:接受修改内部变量值的方 法; 访问器:获取内部变量值的方法; 效果器:执行某个动作的方法。
2.9 方法概要(续) public void doPrintSomething(String something) { System.err.println(foo); } 调节器 返回类型 名称 参数列表
2.9 方法命名参考 方法名体现其所完成的任务 方法名以小写字母开头,将划分单词界线的字母大写 对转化器,加前缀“set”;对访问器,加前缀“get”;对效果器,加前缀“do”。
第三章 数据类型 你和我不是同一种人 委婉的拒绝 第三章 数据类型 你和我不是同一种人 委婉的拒绝 物以类聚,人以群分 计算机的世界,即数据的世界,用数据表达信息,不同种类的信息以类型表征。
第三章 数据类型 你和我不是同一种人 委婉的拒绝 第三章 数据类型 你和我不是同一种人 委婉的拒绝 物以类聚,人以群分 计算机的世界,即数据的世界,用数据表达信息,不同种类的信息以类型表征。
3.1 原始数据类型 类型 含义 Byte 8位整数 Short 16位整数 Int 32位整数 long 64位整数 类型 含义 Byte 8位整数 Short 16位整数 Int 32位整数 long 64位整数 float 单精度浮点数 double 双精度浮点数 char 16为Unicode字符 boolean 布尔型
数据类型int 举例: int x; x = 5; System.out.println(x);
数据类型int(续) 举例: int x = 5; System.out.println(x); --------------------- x= x+1;
数据类型float、double 举例: float price = (float) 7.25*5; System.out.println(x); double val1 = 7.0/9.0; double val2 = 2.0/9.0; double val3 = val1+val2; System.out.println(val1); System.out.println(val2); System.out.println(val3);
数学运算符 + 加 - 减 * 乘 / 除 % 取模(余)
3.2 String类 类:对象的描述,正如设计图是住宅的描述一样,你可以按照设计图建造许多住宅,设计图是“类”的定义,而住宅则是设计图的实例化,即按照定义建造出的对象。
String构造 String firstName = “George”; String lastName = new String(“Washington”); System.out.println(firstName); System.out.println(lastName); 构造器 Class variableName = new Class(); Class variableName = new Class(parameters);
String构造 String firstName = “George”; String lastName = new String(“Washington”); System.out.println(firstName); System.out.println(lastName); 构造器 Class variableName = new Class(); Class variableName = new Class(parameters);
String合并 String firstName = “George”; String lastName = new String(“Washington”); String fullName = firstName + lastName; System.out.println(fullName); String fullName = firstName + “ ” + lastName;
String方法----Length() String title = “Java 2 Programming”; int len = title.Length(); System.out.println(len); 注意:字符串长度为其中所含字符的个数,包括 空格。
String方法----IndexOf() String title = “Java 2 Programming”; int index= title. indexOf(“2”); System.out.println(index); 5 注意:字符串索引自左到右,从0开始编号。
String方法----Substring() String title = “Java 2 Programming”; int firstHalf= title. substring(0,7); int lastHalf= title. substring(7); System.out.println(firstHalf); System.out.println(lastHalf);
String方法小结 public int length() public int indexOf(String findme) public String substring(int startIndex) public String substring(int srartIndex, int srartIndex+subLength)
3.3 数 组 数组:相似元素的有序集合 同一数组中的元素必须类型相同,如int数组、double数组、String数组和char数组等。
数组定义 举例 int firstArray[]; int secondArray[] = new int[10]; int thirdArray[] = {10,12,-10,100}; firstArray为整型空(null)数组,secondArray为10个元素整型数组,thirdArray有4个int值(分别为10,12,-10,100)的数组
数组访问 数组访问方法:<数组名>[index] 数组元素索引:从0开始递增 例如: System.out.println(thirdArray[0]); System.out.println(thirdArray[1]); thirdArray[2]=168; //数组元素赋值 System.out.println(thirdArray[2]);
数组长度 length域 数组中的元素个数称为数组长度,所有数组均有一个length域记录数组长度。 举例 Char letters[] = {‘a’,’b’,’c’}; System.out.println(letters.length); 3 System.out.println(letters);//作为字符串输出
数组使用举例 String names[]={“John”, “Mary”, “Robert”}; String people[]; people = names; System.out.println(names[0]); System.out.println(people[2]); System.out.println(names);//无效
3.4 向量 向量:对象的集合。 其中,各元素可以不必同类型,元素可以增加和删除,不能直接加入原始数据类型
向量使用 首先必须在程序开始处加入: import java.util.Vector; ================== Vector v = new Vector(); String s = new String(“Hello”);
向量使用(续) v.add(s); v.add(“Goodbye”); System.out.println(v); System.out.println(v.size()); [Hello, Goodbye] 2
向量使用(续2) boolean success = v.remove(s);//v.remove(“Hello”) System.out.println(v); System.out.println(success); System.out.println(v.size()); [Goodbye] True 1
Vector方法 public boolean add(object o) public boolean remove(object o) public int size() public Enumeration element()
在向量中使用封装器 由于Java不把原始数据类型当作对象来处理,向量中就不允许存储原始数据类型的数据,为此,Java又引入如下新的类以封装原始数据类型: Integer Float Double Character Boolean
在向量中使用封装器(续) 举例 Integer I = new Integer(211); Int i = I.intValue(); System.out.println(i);
封装器类小结 Integer new Integer(int i) intValue() Float new Float(float f) floatValue() Double new Double(double d) doubleValue() Character new Character(char c) charValue() Boolean new Boolean(boolean b) booleanValue()
封装器使用举例 String name = new String(“John Smith”); Integer age = new Integer(30); Double salary = new Double(8675.88); Vector record = new Vector(); record.add(name); record.add(age); record.add(salary);System.out.println(record);
枚举 Enumeration(枚举)类允许列举向量元素, 通过elements()方法得到Enumeration对象。 public boolean hasMoreElements() public Object nextElement()
枚举举例 import java.util.*; Vector dogs = new Vector(); dogs.add(“Rambo”);dogs.add(“Feisy”); Enumeration names = dogs.elements(); System.out.println(names.hasMoreElements()); System.out.println(names. nextElement());
枚举举例(续) 显示结果 true Rambo Feisy false
枚举举例(续2) public class ThreeStoogesExample { public static void main(String args[]) // ThreeStoogesExample Vector stooges = new Vector(); stooges.add("Larry"); stooges.add("Curly"); stooges.add("Moe");
枚举举例(续3) stooges.remove("Curly"); stooges.add("Shemp"); System.out.println("The " + stooges.size()+ "Stooges"); Vector actors = new Vector(); actors.add("Bob"); actors.add("Ted"); actors.add("Alice"); actors.add(stooges); System.out.println(actors.size()); System.out.println(actors);}}
枚举举例(续4) The 3Stooges 4 [Bob, Ted, Alice, [Larry, Moe, Shemp]]
nextElement()返回类型 nextElement()返回类型是Object类 如需将该值赋给变量,必须强制类型转换 String name = (String) names.nextElement();
补充实例1 public class IsLowerCaseExample { public static void main(String args[]) { // IsLowerCaseExample char letter= 'f'; boolean lowerCase = Character.isLowerCase(letter); System.out.println("Is letter lower case? " + lowerCase); letter = ' F'; boolean upperCase = Character.isUpperCase(letter); System.out.println("Is letter upper case? " + upperCase); }
补充实例2 public class UseSubString { public static void main(String args[]) // UseSubString String source= "abcdefghijklmnop"; String s; int len; s=source.substring(4,7); len=s.length(); System.out.println(s); System.out.println(len); }
补充实例3 public class UseTheForceExample{ public static void main(String args[]){ // UseTheForceExample String force = "Use the force, Luke!"; String findString = "Luke"; int findStringLength = findString.length(); int startIndex = force.indexOf(findString); int endIndex = startIndex + findStringLength; String subStr = force.substring(startIndex, endIndex); System.out.println(startIndex); System.out.println(endIndex); System.out.println(findStringLength); System.out.println("Substring is " + subStr);}}
第四章 流程控制 生活中充满着选择、充满着决定, 流程控制就是Java语言用于选择和决定的机制。
4.1 布尔检验 目的:如何比较两个对象 相等比较 格式:A == B 说明:如A等于B,表达式A==B的值为true; 否则为false。
4.1 布尔检验(续) 举例 System.out.println(“The expression 2==4 is ”); 显示结果: The expression 2==4 is false
4.1 布尔检验(续2) Equals()方法 对于String、Integer和Float的对象类型,用Equals()方法判断是否相等。 Integer I1=new Integer(2); Integer I2=new Integer(2); System.out.println(“Does I1 equals I2?”); System.out.println(I1.Equals(I2));
4.1 布尔检验(续3) 注意:比较两个对象时用Equals()方法,比较原始数据类型时用==运算符。 大于/小于 A>B
4.2 IF-THEN-ELSE If-Then语句: if (<条件表达式>) <语句>; 说明:如果<条件表达式>为真,就执行<语句>;否则,不执行<语句>。
4.2 IF-THEN-ELSE(续) 举例 int temperature = 38; if (temperature>35) System.out.println(“It’s too hot!”); System.out.println(“Have a nice day.”);
4.2 IF-THEN-ELSE(续2) 举例 int temperature = 38; if (temperature>35){ System.out.println(“It’s too hot!”); System.out.println(“I want to go home!”); } System.out.println(“Have a nice day.”);
IF-THEN-ELSE if (<条件表达式>) <语句1>; else <语句2>; 说明:……
IF-THEN-ELSE举例 int temperature = 38; if (temperature>35){ System.out.println(“It’s too hot!”); System.out.println(“I want to go home!”); } else { System.out.println(“Have a nice day.”); System.out.println(“Let’s stay here.”);
If语句的嵌套 If (<条件1>) {… if (<条件2>) <语句2>; … }
If语句的嵌套举例 行李费问题 随身免费携带20kg行李,40kg以内每kg收费1元,40kg以上每kg收费2元。
4.3 while 语句 格式: while (<条件>) <语句>; 说明:当<条件>为真时反复执行<语句>,直到<条件>为假时为止。
4.3 while 语句举例 int x=0; While (x<5) { System.out.println(x); x=x+1; }
4.3 while 语句举例(续) int x=0,s=0; While (x<5) { System.out.println(x); x=x+1; s=s+x; } System.out.println(s);
4.3 while 语句举例(续2) String s=“x”; while (x.length()<4) System.out.println(s+”is too short.”); s=s+ “x”; } System.out.println(“All done!”);
4.3 while 语句举例(续3) int x =100; int y=0; while (x>0){ y++; x=x-10; } System.out.println("x="+x); System.out.println("y="+y);
4.4 for循环 格式: for (<初始化表达式>;<条件表达式>;<修改表达式>) <语句>;
4.4 for循环举例 S=0; for (int i =1; i<5; i++){ s=s+i; System.out.println(“i=”+i); } System.ou.println(“s=”+s);
4.4 for循环举例(续) String colors[] = {"red", "yellow", "blue", "purple"}; for (int i = 0; i < colors.length; i++) { System.out.println(colors[i]); }
4.4 for循环举例(续2) String colors[] = {"red", "yellow", "blue", "purple"}; for (int i = 0; i < colors.length; i++) { if (colors[i].equals("blue")){ System.out.println("name = " + colors[i]); System.out.println("index = " + i); }
4.4 for循环举例(续3) int maximum=10; for(int i=0; i<=maximum;i++){ int square = i*i; System.out.println(i+" square is "+square); }
4.5 switch 语句 int choice = 1; switch (choice) { case 0: System.out.println("Zero"); break; case 1: System.out.println("One"); break; case 2: System.out.println("Two"); break; default: System.out.println("Unknown"); }
4.5 switch 语句举例 char choice = 'c'; switch (choice) { case 'a': System.out.println("alpha"); break; case 'b': System.out.println("beta"); break; case 'c': System.out.println("charlie"); break; default: System.out.println("Unknown"); }
4.5 switch 语句举例(续) int x = 2; switch (x) { case 0: case 2: case 4: System.out.println("small"); case 6: case 8: System.out.println("even"); break; default: System.out.println("odd"); }
4.5 switch 语句举例(续2) char grade; String rating; grade = 'B'; switch (grade) { case 'A': rating = "Excellent"; break; case 'B': rating = "Good"; break; case 'C': rating = "Average"; break; case 'D': rating = "Poor"; break; case 'F': rating = "Failure"; break; default: rating = "Confused"; } System.out.println("Grade is " + grade); System.out.println("Rating is " + rating); }
二重循环例 public class testArray { public static void main(String args[]) int x[][] = new int [2][3]; int i,j; for (i=0;i<2;i++) for (j=0;j<3;j++) x[i][j]=i+j; for (i=0;i<2;i++) { System.out.println(); for (j=0;j<3;j++) System.out.print(x[i][j]); }
二重循环例(续1) public class Findmax { public static void main(String args[]) int a[][]={{8,4,2,1},{9,0,7,5},{-10,12,-5,3}}; int i,j,row=0,col=0,max; max=a[0][0]; for (i=0;i<3;i++){ for (j=0;j<4;j++) if (a[i][j]>max){max=a[i][j];row=i;col=j;} } System.out.println("max="+max);
二重循环例(续2) public class sortbubble { public static void main(String args[]) // sortbubble int a[]={8,4,2,9,0,7,5,3,6,1}; int i,j,k,t; for (i=9;i>0;i--) for(j=0;j<i;j++) if (a[j]>a[j+1]) {t=a[j];a[j]=a[j+1];a[j+1]=t;} for (i=0;i<10;i++) System.out.println(a[i]); }
二重循环例(续3) public class sortbubble2 { public static void main(String args[]) // sortbubble int a[]={8,4,2,9,0,7,5,3,6,1}; int i,j,k,t; for (i=0;i<=9;i++) for(j=9;j>i;j--) if (a[j]<a[j-1]) {t=a[j];a[j]=a[j-1];a[j-1]=t;} for (i=0;i<10;i++) System.out.println(a[i]); }
二重循环例(续4) public class sortbubble3 { public static void main(String args[]) // sortinsert int a[]={8,4,2,9,0,7,5,3,6,1}; int i,j,k,t; for (i=9;i>0;i--) for(j=0;j<i;j++) if (a[j]>a[j+1]) {t=a[j];a[j]=a[j+1];a[j+1]=t;} for (i=0;i<10;i++) System.out.println(a[i]); }
二重循环例(续5) public class sortselect { public static void main(String args[]) int a[]={8,4,2,9,0,7,5,3,2,1}; int i,j,k,t, len=a.length; for (i=0;i<len-1;i++){ k=i; for (j=i+1;j<len;j++) if (a[j]<a[k]) k=j; t=a[k];a[k]=a[i];a[i]=t; } for (i=0;i<10;i++) System.out.println(a[i]);
二重循环例(续6) public class sortinsert { public static void main(String args[]) int a[]={8,4,2,9,0,7,5,3,6,1}; int i,j,t; for (i=1;i<10;i++){ t=a[i]; for (j=i-1;j>=0;j--) if (a[j]<=t) break; else a[j+1]=a[j]; a[j+1]=t; } for (i=0;i<10;i++) System.out.println(a[i]);
排序方法Arrays.sort() import java.util.*; class sortmethod { public static void main(String arguments[]){ int numbers[]={9,2,7,5,3,6,4,0,1,8}; System.out.println("The original order:"); for (int i = 0;i<numbers.length;i++) System.out.println(i+":"+numbers[i]); Arrays.sort(numbers); System.out.println("The new order:"); }
排序方法Arrays.sort(续) import java.util.*; class Name { public static void main(String arguments[]){ String names[]={"Akbar","Umberto","Percival","Zemo","Diego"}; System.out.println("The original order:"); for (int i = 0;i<names.length;i++) System.out.println(i+":"+names[i]); Arrays.sort(names); System.out.println("The new order:"); }
第5章 布尔逻辑 To be or not to be is a problem. ————Shakespeare 布尔运算: AND运算符——Java表示:&& 规则:当X和Y均为真时,X&&Y才为真 OR 运算符——Java表示:|| 规则:当X或Y为真时,X || Y就为真 NOT 运算符——Java表示:! 规则:!X取X的“相反值”
布尔逻辑举例 int temperature = 36,humidity=95; if ((temperature>35) && (humidity >90)) { System.out.println(“It’s not just hot,it’s humid”); }
布尔逻辑举例(续) if ((miles>3000) && (month > 3)) { System.out.println(“Your car warranty has expired!”); }
布尔逻辑举例(续2) if ((miles>3000) || (month > 3)) { System.out.println(“Your car warranty has expired!”); }
布尔逻辑举例(续3) string password; //Later If(!password.equals(“open sesame”)) { System.out.println(“Sorry,incorrect password”); }
布尔逻辑举例(续4) String days[] ={"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}; String today; // The day of the week. e.g. "Monday" int timeHour; boolean isSaturday = today.equals("Saturday"); boolean isSunday = today.equals("Sunday"); boolean afterTen = timeHour >= 10; boolean beforeFour = timeHour < 16; if ((isSaturday || isSunday) && (afterTen && beforeFour)) System.out.println("Mow the lawn."); else System.out.println("Do not mow the lawn!");
布尔逻辑举例(续4) int x=0,y=10; While ((x<5)&&(y>5)){ System.out.println(“x=”+x); System.out.println(“y=”+y); x++; y=y-5; }
布尔逻辑举例(续5) int x=0,y=10; While ((x<5)||(y>5)){ System.out.println(“x=”+x); System.out.println(“y=”+y); x++; y=y-5; }
布尔逻辑举例(续6) int x=0,y=10; While (!(x<5)||!(y>5)){ System.out.println(“x=”+x); System.out.println(“y=”+y); x++; y=y-5; }
5.2 布尔表达式 优先级:!、&&、|| 从左到右 括号改变优先级
布尔表达式例 boolean b1, b2, b3; b1 = true; // Change as needed. if (b1 && (b2 || b3)) System.out.println("Yes"); else System.out.println("No");
布尔表达式例(续) boolean isAthlete; int SAT,int familyIncome; isAthlete = true; // Change as needed. SAT = 1200; // Change as needed. familyIncome = 100000; // Change as needed. if (isAthlete || (SAT > 1400) || (familyIncome < 30000)){ System.out.println("Scholarship"); }
第六章 图形用户界面GUI 如果不和人打交道,计算机的效率会更高 Java GUI由部件(component)和容器(container)组成 部件:与用户交互的项,如按钮、滚动条 和文本输入域。 容器:用于装载部件,如程序的启动封面、顶层窗口、弹出对话框。
简单GUI例 程序见SimpleGUI.java
构造SimpleGUI的步骤 构建一个顶层容器(JFrame); 构建一个部件(JLabel); 用容器的add方法将部件加入该容器; 设置顶层容器大小; 显示顶层容器。
6.2 标签的使用 Swing的标签类JLabel public JLabel(String text) public JLabel(String text,int horizontalAlignment) horizontalAlignment的取值 SwingConstants.LEFT (缺省值) SwingConstants.CENTER SwingConstants.RIGHT
6.2 标签的使用(续) 水平对齐方式修改方法 public void setHorizontalAlignment(int alignment) 垂直对齐方式修改方法 public void setVerticalAlignment(int alignment) 垂直对齐方式取值 SwingConstants.TOP SwingConstants.CENTER(缺省值) SwingConstants.BOTTOM
6.2 标签的使用例 Jlabel rightLabel = new Jlabel(“I lean to the right”); rightLabel.setHorizontalAlignment(SwingConstants.RIGHT); rightLabel.setVerticalAlignment(SwingConstants.TOP);
6.3 按钮的使用 没有按钮的GUI就像没有鲜花的春天 Javax.swing.AbstractButton为标准按钮类型定义基本功能,所有按钮都能显示文本、图标。 JButton JButton okButton = new JButton(“ok”); JPanel panel = new Jpanel(); panel.add(okButton);
开关按钮—复选框checkbox、单选钮radiobutton (1) Jcheck(String text,boolean selected) 其中,text表示复选框右边显示的文字, selected表示该复选框是否默认为被选择,如果缺省selected,表示默认为不被选择。 (2) JRadioButton(String text,boolean selected)
按钮使用举例 参见程序ButtonApplet.java 参见程序ButtonsApplet.java
ButtonApplet JButton button; JCheckBox checkbox; public void init() { JPanel contentPane = (JPanel)getContentPane(); contentPane.setLayout(new FlowLayout()); button = new JButton("OK"); checkbox = new JCheckBox("Beep when button is pressed", true); contentPane.add(checkbox); contentPane.add(button);
ButtonsApplet JButton button; ButtonGroup group; JRadioButton greenButton, blueButton, redButton; public void init() { JPanel contentPane = (JPanel)getContentPane(); contentPane.setLayout(new FlowLayout()); button = new JButton("OK"); greenButton = new JRadioButton("Green"); blueButton = new JRadioButton("Blue"); redButton = new JRadioButton("Red"); contentPane.add(greenButton); contentPane.add(blueButton); contentPane.add(redButton); contentPane.add(button); }
6.4 文本部件的使用 在GUI设计中,按钮和标签提供了极大的灵活性,但是很多时候GUI必须请求用户输入文字、密码、登录标识符、URL等。本节介绍几个最常见的文本输入部件。
6.5.1 文本域部件 JTextField和JPasswordField 构造器 JTextField(int colums) JTextField(String text) JTextField(String text,int colums) 方法 setText(String text) getText()
6.5.1 文本域部件(续) 方法 setHorizontalAlignment(int alignment) setVerticalAlignment(int alignment) 举例 程序TextApplet.java TextFieldApplet.java
TextApplet.java import javax.swing.*; import java.awt.*; public class TextApplet extends JApplet { JPanel contentPanel; JLabel label; JTextField textField; public void init() contentPanel = (JPanel)getContentPane(); contentPanel.setLayout(new FlowLayout()); label = new JLabel("Input text here: "); textField = new JTextField("A default value", 20); contentPanel.add(label); contentPanel.add(textField); }
TextFieldApplet.java import javax.swing.*; import java.awt.event.*; public class TextFieldApplet extends JApplet { JPanel contentPanel; JLabel label; JTextField textField; JButton button; public void init() contentPanel = (JPanel)getContentPane(); contentPanel.setLayout(new FlowLayout()); label = new JLabel("Input text here: "); textField = new JTextField("A default value", 20); button = new JButton("OK");
TextFieldApplet.java // You know the drill-- action handling will // be covered in a following chapter button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) doMyButtonAction(); } }); contentPanel.add(label); contentPanel.add(textField); contentPanel.add(button); public void doMyButtonAction() showStatus(textField.getText());
文本区域部件JTextArea JTextArea构造器 JTextArea(int rows,int colums) JTextArea(String text) JTextArea(String text, int rows,int colums) textArea.setLineWrap(boolean wrap) textArea.setWrapStyleWord(boolean word)
JTextArea举例 import javax.swing.*; import java.awt.event.*; public class TextAreaApplet extends JApplet { JPanel contentPanel; JTextArea textArea; JButton button; public void init() contentPanel = (JPanel)getContentPane(); contentPanel.setLayout(new FlowLayout()); textArea = new JTextArea("A default value", 20, 40); textArea.setLineWrap(true); button = new JButton("Clear");
JTextArea举例(续) // You know the drill-- action handling will // be covered in a following chapter button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) doMyButtonAction(); } }); contentPanel.add(textArea); contentPanel.add(button); } public void doMyButtonAction() // does nothing
第七章 布局管理器 Java中的容器如Panel、Frame、Applet,每个容器都有与之相关的“布局管理器”。布局管理器是与容器一起工作的一个对象,负责“管理”容器中内容的“布局”,布局管理器能够控制每个部件的大小(size)、形状(shape)和位置(position)。 在Java中,“布局”与“容器”相分离。
7.1 边框布局 网格布局(GridLayout) 将所有部件放置在一个网格中,所有东西均沿着整齐的行、列布局,每个部件大小相同。如果改变窗口大小,每个部件的大小都会相应改变,但仍然保持相同大小。 public BorderLayout() public Component add(Component comp, Object constarint)
7.1.1 边框布局例1 import javax.swing.*; import java.applet.Applet; import java.awt.*; import javax.swing.*; import java.applet.Applet; public class Fig7_1 extends Applet { public void init() setLayout(new BorderLayout()); add(new JButton("North"), BorderLayout.NORTH); add(new JButton("South"), BorderLayout.SOUTH); add(new JButton("East"), BorderLayout.EAST); add(new JButton("West"), BorderLayout.WEST); add(new JButton("Center"), BorderLayout.CENTER); resize(250, 150); }
7.1.1 边框布局例1之结果
7.1.2 边框布局例2 import java.awt.*; import javax.swing.*; import java.applet.Applet; public class Fig7_2 extends Applet { public void init() setLayout(new BorderLayout()); add(new JButton("North"), BorderLayout.NORTH); // add(new JButton("South"), BorderLayout.SOUTH); // add(new JButton("East"), BorderLayout.EAST); add(new JButton("West"), BorderLayout.WEST); add(new JButton("Center"), BorderLayout.CENTER); resize(250, 150); }
7.1.2 边框布局例2之结果
7.1.3 边框布局例3 import java.awt.*; import javax.swing.*; import java.applet.Applet; public class Fig7_3 extends Applet { public void init() setLayout(new BorderLayout()); JLabel title = new JLabel("You are at the Border!", JLabel.CENTER); add(title, BorderLayout.NORTH); JLabel label = new JLabel("Passport #", JLabel.RIGHT); add(label, BorderLayout.WEST); JTextField text = new JTextField("1234567890"); add(text, BorderLayout.CENTER); resize(250, 50); }
7.1.3 边框布局例3之结果
7.1 网格布局 网格布局(GridLayout) 将所有部件放置在一个网格中,所有东西均沿着整齐的行、列布局,每个部件大小相同。如果改变窗口大小,每个部件的大小都会相应改变,但仍然保持相同大小。 public GridLayout(int rows, int cols) public GridLayout(int rows, int cols, int hgap,int vgap) public Component add(Component comp)
7.2 网格布局例1 import java.applet.Applet; import java.awt.*; import javax.swing.*; public class Fig7_5 extends Applet { /** * Initializes the applet. You never need to call this directly; it is * called automatically by the system once the applet is created. */ public void init() { String labels[] = {"One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine"}; setLayout(new GridLayout(3, 3)); for (int i=0; i<labels.length; i++) add(new JButton(labels[i])); resize(240, 180); }
7.2 网格布局例1之结果
7.2 网格布局例2 public class Fig7_6 extends Applet { /** * Initializes the applet. You never need to call this directly; it is * called automatically by the system once the applet is created. */ public void init() { String labels[] = {"One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine"}; setLayout(new GridLayout(3, 3, 10, 10)); /*部件之间加了间隙 */ for (int i=0; i<labels.length; i++) add(new JButton(labels[i])); resize(240, 180); }
7.2 网格布局例2之结果
7.2 网格布局例3 import java.awt.*; public class Fig7_8 { /** * Constructor. */ public Fig7_8 () { } public static void main(String args[]) JFrame f = new JFrame("Exercise 7.2.1 c"); Container c = f.getContentPane(); c.setLayout(new GridLayout(4, 4, 5, 5)); for (int i=0; i<10; i++) Integer I = new Integer(i); c.add(new JButton(I.toString())); f.pack(); f.show();
7.2 网格布局例3之结果
7.2 网格布局例3之结果 在这种4X4网格布局中,如果只在该容器中加入10内容,就会出现以上未能填满4X4网格布局的结果。 信条:永远填满布局! 如果必须有一个“空白”单元格,可以加入一个空标签以填满,如: add(new Label(“”))
7.3 组合布局管理器 在Java中,可用的布局管理器有几十种,但没有一种是“完美的”。Java提供了能将各种布局管理器组合在一起的能力。 GUI布局有时比编程更需要创造力。
7.3.1 将容器置于容器之中 两个容器:Applet、Jpanel 两个布局管理器:边框布局、网格布局 Applet是边框布局
7.3.1 组合布局例
7.3.1 组合布局例 setLayout(new BorderLayout()); JPanel panel = new JPanel(); String message = "Drive C: is not responding"; add(new TextArea(message), BorderLayout.CENTER); panel.setLayout(new GridLayout(1, 3, 10, 5)); panel.add(new JButton("Abort")); panel.add(new JButton("Retry")); panel.add(new JButton("Fail")); add(panel, BorderLayout.SOUTH); resize(250, 100);
7.3.1 组合布局例 setLayout(new BorderLayout()); JPanel panel = new JPanel(); String message = "Drive C: is not responding"; add(new TextArea(message), BorderLayout.CENTER); panel.setLayout(new GridLayout(1, 3, 10, 5)); panel.add(new JButton("Abort")); panel.add(new JButton("Retry")); panel.add(new JButton("Fail")); add(panel, BorderLayout.SOUTH); resize(250, 100);
7.3.2 组合布局例(续)
import java.awt.*; import javax.swing.*; public class Fig7_10 extends Panel { /** * Constructor. */ public Fig7_10 () { super(); setLayout(new BorderLayout()); // Create new panels Panel top = new Panel(); Panel middle = new Panel(); Panel bottom = new Panel(); // Set layouts of panels top.setLayout(new BorderLayout()); middle.setLayout(new GridLayout(6, 7)); bottom.setLayout(new GridLayout(1, 3));
// Add calendar components // Top top.add(new JButton("Previous Month"), BorderLayout.WEST); JLabel month = new JLabel("October", JLabel.CENTER); top.add(month, BorderLayout.CENTER); top.add(new JButton("Next Month"), BorderLayout.EAST); add(top, BorderLayout.NORTH); // Middle // Add days names String days[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; for (int i=0; i<days.length; i++) middle.add(new JButton(days[i])); // Add days for (int day=1; day<=31; day++) { Integer Day = new Integer(day); middle.add(new JButton(Day.toString())); } add(middle, BorderLayout.CENTER);
// Bottom bottom.add(new JButton("Edit")); bottom.add(new JButton("Save")); bottom.add(new JButton("Quit")); add(bottom, BorderLayout.SOUTH); } public static void main(String args[]) { Frame f = new Frame("Exercise 7.3.1 c"); Fig7_10 figure = new Fig7_10(); f.add(figure, BorderLayout.CENTER); f.pack(); f.show();
7.4 GridBagLayout布局管理器 GridBagLayout的工作方式类似于网格布局,有可以放置部件的“网格”,但GridBagLayout中的部件可以填充一个以上的网格单元,网格单元不必大小相同,可以相对另一个部件或用固定点来确定一个部件的位置。
7.4 GridBagLayout布局管理器
7.4 GridBagLayout布局管理器例 setLayout(new GridBagLayout()); JButton buttons[] = new JButton[7]; for (int i=0; i<buttons.length; i++) buttons[i] = new JButton("Button " + i); GridBagConstraints gbc = new GridBagConstraints();
7.4 GridBagLayout布局管理器例 // First row. // Add first row of buttons, all evenly spaced // and expanded both horizonally and vertically. gbc.fill = GridBagConstraints.BOTH; gbc.weightx = 1; //Spread out horizontally gbc.weighty = 1; // Spread out vertically add(buttons[0], gbc); add(buttons[1], gbc); gbc.gridwidth = GridBagConstraints.REMAINDER;//End row! add(buttons[2], gbc);
7.4 GridBagLayout布局管理器例 // Second row // One double-width button, and one double-height button gbc.gridwidth = 2; //Double width add(buttons[3], gbc); gbc.gridwidth = 1;//Reset to single width gbc.gridheight = 2;//Double height add(buttons[4], gbc);
7.4 GridBagLayout布局管理器 // Third row. // Two single width buttons and bottom of button4. gbc.gridx = 0;// Start new row gbc.gridheight = 1;//Reset to single height add(buttons[5], gbc); gbc.gridx = 1;//Place in column 1 add(buttons[6], gbc);
Thanks for your reading! To be continued Thanks for your reading!