1、第1章 了解了解Java 什么是Java Java的特性 如何学习Java什么是Java 最早是Sun公司GreenProject中撰写Star7应用程序的一个程序语言 JamesGosling的窗外有颗橡树(Oak)全球信息网兴起,JavaApplet成为网页互动技术的代表 1995/5/23,Java DevelopmentKits(当时的JDK全名)1.0a2版本正式对外发表什么是Java Java是面向对象(Object-Oriented)程序语言,具有更高的跨平台可能性 在今日,更多时候代表了软件开发的架构 开发者版本发表时是以Java DevelopmentKits名称发表,简称J
2、DK J2SE 5.0(Java 2 Platform Standard Edition5.0)时的JDK称为J2SE Development Kit 5.0 什么是Java J2SE 5.0(Java 2 Platform Standard Edition5.0)时的JDK称为J2SE Development Kit 5.0 从JavaSE 6(Java Platform,Standard Edition6)开始的JDK6则称之为Java SE Development Kit 6 不再带有“2”这个号码,版本号6或1.6.0都使用 6是产品版本(productversion),而1.6.0是
3、开发者版本(developerversion)Java的特性 语言特性 简单(Simple)面向对象(Object-oriented)网络(Network-savvy)解译(Interpreted)坚固(Robust)安全(Secure)可携(Portable)高效能(High-performance)Java的特性 应用平台 Java SE Java Platform,Standard Edition Java EE Java Platform,Enterprise Edition Java ME Java Platform,Micro EditionJava Platform,Standa
4、rd Edition(Java SE)Java各应用平台的基础Java Platform,Standard Edition(Java SE)JVM Java虚拟机(Java Virtual Machine,JVM)JRE Java执行环境(Java SE Runtime Environment,JRE)JDK Java语言Java Platform,Enterprise Edition(Java EE)以JavaSE的基础,定义了一系列的服务、API、协定等 适用于开发分布式、多层式(Multi-tiered)、以组件为基础、以Web为基础的应用程序 技术像是JSP、Servlet、Enter
5、prise JavaBeans(EJB)、Java Remote Method Invocation(RMI)等Java Platform,Micro Edition(Java ME)作为小型数字设备上开发及部署应用程序的平台,像是消费性电子产品或嵌入式系统等 最为人所熟悉的设备如手机、PDA、股票机等活跃的社群与丰富的资源 开发工具 开放原始码的组件 容器 测试工具 各式各样的软件专案 各个社群所支持的讨论区 取之不尽的文件如何学习Java 奠定Java语法基础 运用基本的JavaSE API 字符串处理、例外处理、对象容器(Container)、输入输出(I/O)、线程(Thread)ht
6、tp:/ 使用搜索引擎 http:/ http:/.tw/学习地图 http:/ 入门准备入门准备 下载、安装、瞭解JDK 设定Path与Classpath 第一个Java程序 选择开发工具下载JDK JDK6发表日期为2006年12月11日 较新的修正版本将以Update名称,加上号码来表示修正的版本号 http:/ 公用JRE是给开发好的程序之执行平台 JDK本身也有自己的JRE 位于JDK安装目录的jre目录下 JDK本身所附的JRE比公用JRE多了个server的VM(VirtualMachine)执行选项了解JDKJDK的的JRE有有server选项选项了解JDK JDK的安装目录
7、bin目录 JDK的工具程序 demo目录 范例程序 jre目录 JDK自己附带的JRE db目录 ApacheDerby数据库,纯Java所撰写的数据库了解JDK JDK的安装目录 lib目录 工具程序实际上会使用的Java工具类别 JDK中的工具程序,大多也是由Java所撰写而成 bin文件夹下的工具程序,不过是个包装器(Wrapper)执行javac.exe等程序时,最后会呼叫lib目录中tools.jar中的对应类别了解JDK JDK的安装目录 src.zip Java提供的API类别之原始码文件压缩档设定Path 找不到javac工具程序 必须告诉操作系统,应该到哪些目录下尝试找到您
8、所想使用的工具程序 设定系统变量中的 Path环境变量设定Path 必须告诉操作系统,应该到哪些目录下尝试找到您所想使用的工具程序 直接设定目前的环境变量包括Path变数 Windows下安装JRE时,会将java.exe复制至C:WindowsSystem32路径之下,而这个路径在Path变量中是默认的路径set Path=C:Program FilesJavajdk1.6.0bin;%Path%设定Classpath Java执行环境本身就是个平台,执行于这个平台上的程序是已编译完成的Java程序 设定Path变量是为了让操作系统找到指定的工具程序(例如Windowsexe)设定Class
9、path目的就是为了让Java执行环境找到指定的Java程序(JVMclass)设定Classpath JDK6默认会到现行工作目录,以及JDK的lib目录中寻找Java程序 javac-classpath classpath1;classpath2 对于Windows操作系统来说,Path是让操作系统可以找到“.exe”执行档的存在 对于Java执行环境来说,ClassPath就是让JVM可以找到.class执行档的存在第一个Java程序第一个Java程序 新增一个文字文件 重新命名文件为HelloJava.java第一个Java程序 Java的源文件必须以扩展名.java作结束 主档名与类
10、别名称必须一致 注意每个字母的大小写 空白只能是半型空格符或是Tab字符第一个Java程序 javac HelloJava.java error:cannot read:HelloJava.java javac工具程序找不到您指定的.java档案 HelloJava.java:1:class HelloJava is public,should be declared in a file named HellJava.java 类别名称与主档名不符第一个Java程序 HelloJava.java:3:cannot find symbol 程序代码中某些部份打错了,最常发生的原因可能是没有注意到
11、字母大小写 javac不是内部或外部命令、可执行的程序或批处理文件 Path设定有误或没有在Path中加入JDK的bin目录第一个Java程序 java HelloJava Exception inthreadmain java.lang.NoClassDefFoundError java工具程序找不到您所指定的类别 Exceptionin thread main java.lan.NosuchMethodError:main 没有指定Java程序的进入点(Entrypoint),java工具程序指定的类别必须要有一个程序进入点,也就是必须包括main(String args)这个方法(met
12、hod)选择开发工具 从简单的文字编辑辅助工具开始 UltraEdit(http:/ JCreater(http:/ Eclipse(http:/www.eclipse.org/)NetBeans(http:/beans.org/)第3章 语法入门语法入门 第一个Java程序 文本模式下与程序互动 数据、运算 流程控制第一个Java程序 定义类别(Class)定义区块定义区块(Block)定义main()方法(Method)撰写陈述(Statement)public class HelloJava public static void main(String args)System.out.p
13、rintln(嗨!我的第一个嗨!我的第一个Java程序!程序!);给C使用者的第一個Java程序 给了C使用者类似printf()的功能public class HelloJavaForC public static void main(String args)System.out.printf(%s!这是您的第一个Java程序!n,C语言Fan);System.out.printf(%s!这是您的第二个Java程序!,C语言Fan).println();System.out.printf(%s!这是您的第%d 个Java程序!n,C语言Fan,3);为程序加入批注 原始码档案中被标注为批注的
14、文字,编译程序不会去处理它/*作者:良葛格作者:良葛格*功能:示范功能:示范printf()方法方法*日期:日期:2005/4/30*/public class ThirdJavaForC public static void main(String args)/printf()是是J2SE5.0的新功能,必须安的新功能,必须安裝裝JDK5.0才能编译才能编译 System.out.printf(%s!这是您的第这是您的第%d个个Java程序!程序!n,C语言语言Fan,3);为程序加入批注 不能用巢状方式来撰写多行批注 多行批注可以包括单行批注/*批注文字1blabla /*批注文字2bla
15、bla */*/*批注文字1blabla /批注文字2blabla*/使用Scanner取得输入 在J2SE 5.0中,可以使用java.util.Scanner类别取得使用者的输入 可以使用这个工具的next()功能,来取得用户的输入字符串Scanner scanner=new Scanner(System.in);System.out.print(请输入您的名字:);System.out.printf(哈啰!%s!n,scanner.next();System.out.print(请输入一个数字:);System.out.printf(您输入了%d!n,scanner.nextInt();
16、使用BufferedReader取得输入 BufferedReader建构时接受java.io.Reader物件 可使用java.io.InputStreamReaderBufferedReader bufferedReader=new BufferedReader(new InputStreamReader(System.in);System.out.print(请输入一列文字,可包括空白:);String text=bufferedReader.readLine();System.out.println(您输入的文字:+text);标准输入输出串流 System类别中的静态物件out 提供
17、标准输出串流(Stream)输出 通常对应至显示输出(终端机输出)可以将输出重新导向至一个档案 java HelloJava HelloJavaResult.txt System标准输入串流in 在程序开始之后它会自动开启,对应至键盘或其它的输入来源标准输入输出串流 标准错误输出串流err 在程序执行后自动开启,将指定的字符串输出至显示设备或其它指定的装置 err会立即显示错误讯息 err输出串流的讯息不会被重新导向 System.out.println(使用out输出讯息);System.err.println(使用err输出讯息);java ErrDemo ErrDemoResult.tx
18、t使用err输出讯息输出格式控制控制字符作用反斜杠单引号双引号uxxxx以16进位数指定Unicode字符输出xxx以8进位数指定Unicode字符输出b倒退一个字符f换页n换行r游标移至行首t跳格(一个Tab键)System.out.println(u0048u0065u006Cu006Cu006F);输出格式控制 若是使用J2SE5.0或更高的版本 /输出19的十进制表示 System.out.printf(%d%n,19);/输出19的八进制表示 System.out.printf(%o%n,19);/输出19的十六进制表示 System.out.printf(%x%n,19);格式字符
19、作用%在字符串中显示%d以10进位整数方式输出,提供的数必须是Byte、Short、Integer、Long、或BigInteger%f将浮点数以10进位方式输出,提供的数必须是Float、Double或 BigDecimal%e,%E将浮点数以10进位方式输出,并使用科学记号,提供的数必须是Float、Double或BigDecimal%a,%A使用科学记号输出浮点数,以16进位输出整数部份,以10进位输出指数部份,提供的数必须是Float、Double、BigDecimal%o以8进位整数方式输出,提供的数必须是Byte、Short、Integer、Long、或BigInteger%x,%
20、X将浮点数以16进位方式输出,提供的数必须是Byte、Short、Integer、Long、或BigInteger%s,%S将字符串格式化输出%c,%C以字符方式输出,提供的数必须是Byte、Short、Character或 Integer%b,%B将true或false输出(或TRUE、FALSE,使用%B)。另外,非null值输出是true,null值输出是false%t,%T输出日期/时间的前置,详请看在线API文件 输出格式控制 可以在输出浮点数时指定精度 System.out.printf(example:%.2f%n,19.234);example:19.23 可以指定输出时,至少
21、要预留的字符宽度 System.out.printf(example:%6.2f%n,19.234);example:19.23 补上一个空白在前端基本的数据型态(Primitivetype)整数 短整数(short)(占2个字节)整数(int)(占4个字节)长整数(long)(占8个字节)字节 专门储存位数据 占一个字节 浮点数 浮点数(float)(占4个字节)倍精度浮点数(double)(占8个字节)基本的数据型态(Primitivetype)字符字符 采Unicode编码 前128个字符编码与ASCII编码兼容 每个字符数据型态占两个字节 可储存的字符范围由u0000到uFFFF 布尔
22、数 占内存2个字节 可储存true与false两个数值基本的数据型态(Primitivetype)System.out.printf(short t数值范围:%d%dn,Short.MAX_VALUE,Short.MIN_VALUE);System.out.printf(int t数值范围:%d%dn,Integer.MAX_VALUE,Integer.MIN_VALUE);System.out.printf(long t数值范围:%d%dn,Long.MAX_VALUE,Long.MIN_VALUE);System.out.printf(byte t数值范围:%d%dn,Byte.MAX_V
23、ALUE,Byte.MIN_VALUE);System.out.printf(float t数值范围:%e%en,Float.MAX_VALUE,Float.MIN_VALUE);System.out.printf(double t数值范围:%e%en,Double.MAX_VALUE,Double.MIN_VALUE);变数、常数 在Java中要使用变量,必须先宣告变量名称与数据型态 使用int、float、double、char等关键词来宣告变量名称并指定其数据型态 不可以使用数字作为开头 不可以使用一些特殊字符,像是*&%之类 不可以與Java内定的关键词同名int age;/宣告一个整
24、数变量double scope;/宣告一个倍精度浮点数变量 变数、常数 鼓励用清楚的名称来表明变量的作用 不可以宣告变量后,而在未指定任何值给它之前就使用它 编译程序在编译时会回报这个错误int ageOfStudent;int ageOfTeacher;variable var might not have been initialized变数、常数 使用指定运算符=来指定变数的值 int ageOfStudent=5;double scoreOfStudent=80.0;char levelOfStudent=B;System.out.println(年級t得分t等級);System.ou
25、t.printf(%4dt%4.1ft%4c,ageOfStudent,scoreOfStudent,levelOfStudent);变数、常数 宣告变量名称的同时,加上“final”关键词来限定 这个变量一但指定了值,就不可以再改变它的值final int maxNum=10;maxNum=20;cannot assign a value to final variable maxNum算术运算 加(+)、减(-)、乘(*)、除(/)、余除运算符(%)System.out.println(1+2*3);System.out.println(1+2+3/4);System.out.printl
26、n(double)(1+2+3)/4);算术运算 这段程序会印出什么结果?使用下面的方法int testNumber=10;System.out.println(testNumber/3);int testNumber=10;System.out.println(testNumber/3.0);System.out.println(double)testNumber/3);算术运算 将精确度大的值指定给精确度小的变量时,由于在精确度上会有遗失,编译程序会认定这是一个错误int testInteger=0;double testDouble=3.14;testInteger=testDouble
27、;System.out.println(testInteger);possible loss of precisionfound :doublerequired:inttestInteger=testDouble 1 error算术运算 必须明确加上转换的限定字,编译程序才不会回报错误%运算符是余除运算符testInteger=(int)testDouble;count=(count+1)%360;比较、条件运算 大于()、不小于(=)、小于()、不大于(5结果+(10 5);System.out.println(10=5结果+(10=5);System.out.println(10 5结果+
28、(10 5);System.out.println(10=5结果+(10=60?是:否);System.out.println(是否为奇數?+(number%2!=0?是:否);逻辑、位运算 且(&)、或(|)、反相(!)&(AND)、|(OR)、(XOR)与(补码)int number=75;System.out.println(number 70&number 80|number 80|number 75);System.out.println(0 AND 0tt+(0&0);System.out.println(0 AND 1tt+(0&1);System.out.println(1 A
29、ND 0tt+(1&0);System.out.println(1 AND 1tt+(1&1);byte number=0;System.out.println(int)(number);逻辑、位运算 左移()、运算符 int number=1;System.out.println(2的0次:+number);number=number 1;System.out.println(2的1次:+number);number=number 1;System.out.println(2的2次:+number);number=number 1;System.out.println(2的3次:+numbe
30、r);00000001 100000010 200000100 400001000 8 递增、递减运算 递增、递减运算符 将递增或递减运算符撰写在变量之前或变量之后 int i=0;System.out.println(+i);System.out.println(-i);int i=0;int number=0;number=+i;/相当於i=i+1;number=i;System.out.println(number);number=-i;/相当於i=i-1;number=i;System.out.println(number);递增、递减运算 将递增或递减运算符撰写在变量之前或变量之后
31、int i=0;int number=0;number=i+;/相当於number=i;i=i+1;System.out.println(number);number=i-;/相当于number=i;i=i-1;System.out.println(number);递增、递减运算指定运算符范例结果+=a+=ba=a+b-=a-=ba=a-b*=a*=ba=a*b/=a/=ba=a/b%=a%=ba=a%b&=a&=ba=a&b|=a|=ba=a|b=a=ba=a b=a=ba=a=a=ba=a bif条件式 语法 复合陈述句if(条件式)陈述句一;else 陈述句二;if(条件式)陈述句一;陈
32、述句二;else 陈述句三;陈述句四;if条件式 Scanner scanner=new Scanner(System.in);System.out.print(请输入数字:);int input=scanner.nextInt();int remain=input%2;/求除2的余数 if(remain=1)/如果余数为1 System.out.println(input+为奇數);else System.out.println(input+为偶數);if条件式 if中再设定执行的条件 if(条件式一)陈述句一;if(条件式二)陈述句二;陈述句三;if(条件式一)陈述句一;/其它陈述句 el
33、se if(条件式二)陈述句二;if(条件式一)陈述句一;/其它陈述句 else if(条件式二)陈述句二;if条件式 Scanner scanner=new Scanner(System.in);System.out.print(输入分数:);int score=scanner.nextInt();if(score=90)System.out.println(得A);else if(score=80&score=70&score=60&score 70)System.out.println(得D);else System.out.println(得E(不及格);switch条件式 switc
34、h的语法架构 switch(变量名称或表达式)case符合数字或字符:陈述句一;break;case符合数字或字符:陈述句二;break;default:陈述三;Scanner scanner=new Scanner(System.in);System.out.print(请输入分數:);int score=scanner.nextInt();int level=(int)score/10;switch(level)case 10:case 9:System.out.println(得A);break;case 8:System.out.println(得B);break;case 7:Sys
35、tem.out.println(得C);break;case 6:System.out.println(得D);break;default:System.out.println(得E(不及格);for循环 基本语法for(初始式;判断式;递增式)陈述句一;陈述句二;for(int j=1;j 10;j+)for(int i=2;i 10;i+)System.out.printf(%d*%d=%2d,i,j,i*j);System.out.println();for循环 for括号中的每个陈述区块是以分号;作区隔,而在一个陈述区块中若想写两个以上的陈述句,则使用逗号,作区隔 for(int i=
36、2,j=1;j 10;i=(i=9)?(+j/j)+1):(i+1)System.out.printf(%d*%d=%2d%c,i,j,i*j,(i=9?n:);while循环 Scanner scanner=new Scanner(System.in);int score=0;int sum=0;int count=-1;while(score!=-1)count+;sum+=score;System.out.print(输入分数(-1结束):);score=scanner.nextInt();System.out.println(平均:+(double)sum/count)while循环
37、Scanner scanner=new Scanner(System.in);int input=0;int replay=0;do System.out.print(输入整数值:);input=scanner.nextInt();System.out.println(输入数为奇数?+(input%2=1)?Y:N);System.out.print(继续(1:继续0:结束)?);replay=scanner.nextInt();while(replay=1);break、continue break可以离开目前switch、for、while、dowhile的区块 continue只会结束其
38、之后区块的陈述句,并跳回循环区块的开头继续下一个循环for(int i=1;i 10;i+)if(i=5)break;System.out.println(i=+i);for(int i=1;i 10;i+)if(i=5)continue;System.out.println(i=+i);break、continue break与continue还可以配合标签使用 back:for(int i=0;i 10;i+)if(i=9)System.out.println(break);break back;System.out.println(test);break、continue break与c
39、ontinue还可以配合标签使用 back1:for(int i=0;i 10;i+)back2:for(int j=0;j 10;j+)if(j=9)continue back1;System.out.println(test);第4章 从从autoboxing、unboxing认识认识对象对象 关于对象 自动装箱、拆箱使用对象 想写一个程序取得现在的系统时间,您只要产生一个java.util.Date工具就可以了 Date实际上如何向系统取得时间,则无需您来操心 Date date=new Date();System.out.println(date.toString();Tue May
40、03 16:06:46 GMT+08:00 2005使用对象 字符串就是对象,是java.lang.String类别的一个实例 String text=Have a nice day!:);System.out.println(原文:+text);/传回全为大写的字符串内容 System.out.println(大写:+text.toUpperCase();/转回全为小写的字符串内容 System.out.println(小写:+text.toLowerCase();/计算字符串长度 System.out.println(长度:+text.length();/传回取代文字后的字符串 Syste
41、m.out.println(取代:+text.replaceAll(nice,good);/传回指定位置后的子字符串 System.out.println(子字符串:+text.substring(5);使用对象 简单的用户登入程序 System.out.print(使用者名称:);String username=scanner.next();System.out.print(用户密码:);String password=scanner.next();if(caterpillar.equals(username)&1975.equals(password)System.out.println(
42、秘密信息在此!);else System.out.println(username+您好,输入的登入数据有误,请重新输入!);包裹(Wrap)基本型态 Long、Integer、Double、Float、Boolean等类别是所谓的Wrapper类别 主要目的,就是让您提供一个对象实例作为壳,将基本型态包到这个对象之中 如此您就可以操作这个对象,就好像您将基本型态当作对象一样操作包裹(Wrap)基本型态 int data1=10;int data2=20;/使用Integer来包里int资料 Integer data1Wrapper=new Integer(data1);Integer dat
43、a2Wrapper=new Integer(data2);/直接除以3 System.out.println(data1/3);/转为double值再除以3 System.out.println(data1Wrapper.doubleValue()/3);/进行两个值的比较 System.out.println(data1WpareTo(data2Wrapper);包裹(Wrap)基本型态自动装箱、拆箱 在J2SE5.0之前,要如下才能将int包装为一个Integer物件 在J2SE5.0之后提供了自动装箱的功能Integer integer=new Integer(10);Integer i
44、nteger=10;自动装箱、拆箱 Integer data1=10;Integer data2=20;/转为double值再除以3 System.out.println(data1.doubleValue()/3);/进行两个值的比较 System.out.println(pareTo(data2);自动装箱、拆箱 自动装箱运用的方法还可以如下:更一般化的java.lang.Number类别自动装箱int i=10;Integer integer=i;Number number=3.14f;自动装箱、拆箱 自动拆箱(unboxing)在运算时,也可以进行自动装箱与拆箱Integer fooI
45、nteger=10;int fooPrimitive=fooInteger;Integer i=10;System.out.println(i+10);System.out.println(i+);Boolean boo=true;System.out.println(boo&false);小心使用boxing 自动装箱与拆箱的功能是编译程序来帮忙 自动装箱与拆箱的功能是所谓的编译程序蜜糖(Compilersugar)Integer i=100;Integer i=new Integer(100);Integer i=null;int j=i;Integer i=null;int j=i.in
46、tValue();NullPointerException小心使用boxing Integer i1=100;Integer i2=100;if(i1=i2)System.out.println(i1=i2);else System.out.println(i1!=i2);Integer i1=200;Integer i2=200;if(i1=i2)System.out.println(i1=i2);else System.out.println(i1!=i2);显示显示i1=i2显示显示i1!=i2小心使用boxing=也用于判断两个对象参考名称是否参考至同一个对象 在自动装箱时对于值从-1
47、28到127之间的值,它们被装箱为Integer对象后,会存在内存之中被重用 Integer i1=200;Integer i2=200;if(i1.equals(i2)System.out.println(i1=i2);else System.out.println(i1!=i2);第5章 阵阵 列列 一维数组、二维数组 进阶数组观念一维数组对象 宣告一个数组并初始数组内容 指定的索引值不可超出数组范围 会发生ArrayIndexOutOfBoundsException length为数组对象的属性成员 int score=90,85,55,94,77;for(int i=0;i score
48、.length;i+)System.out.printf(score%d=%dn,i,scorei);一维数组对象 当您宣告一个数组时,其实就是在配置一个数组对象 一个完整的数组宣告方式如下int arr=new int10;一维数组对象数据型态初始值byte0short0int0long0Lfloat0.0fdouble0.0dcharu0000booleanfalse一维数组对象 int arr=new int10;System.out.print(arr初始值:);for(int i=0;i arr.length;i+)System.out.print(arri+);arri=i;Sys
49、tem.out.print(narr设定值:);for(int i=0;i arr.length;i+)System.out.print(arri+);System.out.println();一维数组对象 在使用new新增数组时一并指定初始值 int score=new int 90,85,55,94,77;for(int i=0;i score.length;i+)System.out.printf(score%d=%dn,i,scorei);一维数组对象 int length=scanner.nextInt();float score=new floatlength;/动态配置长度动态配
50、置长度 for(int i=0;i score.length;i+)System.out.print(输入分数:);float input=scanner.nextFloat();scorei=input;可以使用动态的方式来宣告数组长度,而不用在程序中事先决定数组大小二维数组对象 二维数组使用名称与两个索引来指定存取数组中的元素 以对象的方式来配置一个二维数组对象 int arr=1,2,3,4,5,6;for(int i=0;i arr.length;i+)for(int j=0;j arr0.length;j+)System.out.print(arrij+);System.out.pr