《Java程序设计》 Java建设小组 2012
教材和参考书 清华大学出版社 自建课程网站:http://202.202.5.145:8000/ibmjava/ http://202.202.5.145:8000/javaweb 教务处网站http://eol.cqu.edu.cn/eol/jpk/course/layout/page/index.jsp?courseId=1160
其他参考书 《Java 编程思想》 Sun公司出版的《Java核心技术》 《Java设计模式》 JDK文档和演示程序 《Java深度历险》 《精通Eclipse》
实验环境 Eclipse JDK6 www.eclipse.org 3.6, 已发布3.7 刚出JDK7(2011年7月28日) Sun》Oracle java.oracle.com
集成的开发环境
课程安排 学时 教学方式 成绩组成 上课40学时 课堂理论知识学习, 课堂(课后)练习 广泛阅读参考资料(WWW) 考试复习 , 平时答疑 考试(60)+实验(20)+平时(20)(中期测试+考勤+作业)
本课程主要内容 Java基础知识 中级编程技术 高级应用技术 语言概述,简单数据类型,运算符和表达式 异常处理,输入输出处理,线程,图形用户界面设计,Socket网络通信 高级应用技术 JDBC技术, Java安全技术, Java Beans, Web编程:Jsp,Servlet, 打包和部署 J2ME,Android编程介绍
以教材为基础,在教学过程中,对部分内容作适当的调整。 通过课程的 学习 能够 以Java语言为工具,运用 面向对象的 思想,解决现实生活中的问题 。 要求同学们 做到: 在上课时认真听讲,把疑难问题 记下,课后和老师交流。课前预习,课后复习。认真完成课后作业和上机实习作业。 勤学好问,多看书,多练习,把握重点,克服难点。
具体学习方法,同学们可以把握下面的四点: 持续进行知识积累,不要急功近利,掌握每个知识点,特别是重点。 课前预习,温故知新。 博彩众长,多看参考资料,扩大知识范围。 平时注意记笔记,记录重点问题,疑难问题,及自己的体会。
第一章 Java语言概述 Java语言发展简史 Java的特点(为什么要学习java) Java与C++的比较 JDK文档
Java发展简史 Java前传(1991 ~ 1995) Java的幼年时期(1995~1998) 2004年 1991年 1995年 1998年
Java前传-1 1991年,当初Sun公司的 James Gosling领导开展了一个名为“Green”的项目 主要目为家用电子产品开发一个分布式代码系统,开拓消费类电子产品市场 发明OAK语言,后改名为Java ,希望用于控制嵌入在有线电视交换盒、PDA等的微处理器. 17个月后,即1993 年,整个系统完成了,但是,交互式电视和 PDA 市场开始滑坡,该项目没有取得成功。
Java前传-2 转机 新发明的Java语言获得了sun的总裁McNealy 的赏识 1994年下半年,Internet迅猛发展,工业界对适合在网络异构环境下使用的语言有一种非常急迫的需求 James Gosling决定改变Green项目的发展方向,对Java语言进行了改造 1995年编写了互动性及强的Applet程序 从此就乘着互联网的快车迅猛发展
Java的幼年时期(1995~1998) 1995年5月23日在SunWorld‘95大会上正式发布Java和HotJava浏览器。 有很多公司先后获得了Java许可证 ,如Netscape,Oracle等,Sun也成立了专门的部门——JavaSoft 1996年1月23日发布了JDK1.0 ,包括开发环境和运行环境 1997年2月18日发布了JDK1.1,增加JIT(即时编译 )编译器,提升了性能。 受硬件环境和技术原因,应用领域有限。
Java的青少年时期(1998~2004) 1998年,Java已经走过了3个年头,开始走出摇篮,去独闯世界了 1998年12月4日,发布了JDK1.2,标志Java 2时代的开始,Java发生了革命性的变化 1999年,被分成了Java SE, Java EE, Java ME三大块,提供了丰富的API(JSP,Servlet,EJB等),走向了企业级计算 2000年5月8日,又发布了JDK 1.3,在此基础上,应用服务器得到了广泛的应用 2002年,发布了JDK 1.4,性能有了质的飞跃,很多大公司都参与了进来,如IBM,HP,Oracle,Adobe,Applet,DEC,Toshiba,Microsoft
Java的壮年时期(2004~至今) 至此,Java对一些高级的语言特性(如泛型、增强的for语句)不支持 2004年10月,Sun发布了JDK1.5(外号叫Tiger),增加了易用性和新语言特性,产品版本号改为了5.0,增加了新的API(如并发)和更新了企业级规范(如EJB3,JSF等)。 2006年,发布了JDK6(外号“野马”),提高了性能、易用性。 2008年又发布了JavaFX,Java又回到了 “桌面” 2011年发布JDK 7.0, 增强多核并行计算,开源。
2011年8月份编程语言排行榜 http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html
编程语言长期发展趋势
James Gosling
JEE JSE JME JSE目前的版本是7 Java平台-不断扩展的计算平台 企业计算:Java(2)Enterprise Edition 桌面计算:Java(2)Standard Edition 嵌入计算:Java(2)Micro Edition JEE JSE JME JSE目前的版本是7
不同版本直接的关系
Java的基本特点-1 简单 面向对象 Java的风格类似于C++,因而对C++程序员而言非常容易掌握Java编程技术 更简洁优美(引起了一些同学的困惑) Java摒弃了C++中容易引发程序错误的地方,如指针操作和内存管理 面向对象 在 Java 中任何东西都是对象,因此,重点集中在数据以及对数据的操作方法 完全面向对象(分析问题、解决问题)
Java的基本特点-2 分布式 Java提供了包容广泛的API库,可处理像HTTP和FTP这样的TCP/IP协议。Java应用程序可通过一个特定的URL来打开并访问对象,就像访问本地文件系统那样简单,直接支持Socket编程、RMI 健壮性 Java在编译和运行程序时都要对可能出现的问题进行检查 它提供自动垃圾收集来进行内存管理 面向对象的异常处理机制
Java的基本特点-3 安全 解释执行 Java语言提供的安全 编译器提供的安全 类加载器(划分名称空间,装载类) 字节码校验器(代码符合JVM规范、 代码不破坏系统完整性、 代码不会引起操作数栈上溢或下溢、 所有操作代码的参数类型的准确性、无非法数据转换(整数到指针的转换)) 解释执行 编译器 javac 将处理.java源文件生成类文件 类文件可通过名称为 java 的加载实用程序解释执行,将Java 字节码转换为机器可执行代码。
Java的基本特点-4 体系结构中立 Java 程序被编译成一种与体系结构无关的字节代码 应用程序层 Java平台层 操作系统层 硬件层 Java应用程序 Java虚拟机 UNIX Linux SPARC Java应用程序 Java虚拟机 Windows X86 Java应用程序 Java虚拟机 RTOS MIPS PPC
Java的基本特点-5 可移植性 高性能 源代码级(数据类型等,编译规则) 目标代码级 通过JIT编译器首先将字节码编译成原生代码,将结果缓存下来,然后在需要时调用它们。 (启动时比较慢,自动内存管理) Google Android虚拟机进一步优化字节码
Java的基本特点-6 多线程 动态 Java语言内置支持多线程的功能 Java 类库提供了 Thread 类 执行的动态性,根据需要载入
Java与C++的比较 全局变量 无条件转移指令 指针 内存管理 数据类型的一致性 类型转换 头文件 结构和联合 预处理 面向对象的特性
Java vs. C++ 性能 http://kano.net/javabench/index
Java vs. C++ 性能
Java 程序的运行环境(JRE) Java是解释执行的高级编程语言 编译型源程序 字节码程序 Java源程序 可执行程序EXE 裸机 操作系统 解释器 编译 连接 执行 解释 .java .class Java虚拟机
JDK、JRE、JVM关系 JDK Java 开发工具,辅助程序 Java.exe,javac.exe等 JRE(JDK的一个子目录) Java API Jvm.dll 其他*.dll
Java的三个实现机制 Java虚拟机(JVM) 垃圾收集机制( GC ) 代码安全性检测
Java虚拟机(5-1) 在一台计算机上由软件模拟的假想的计算机。基于下层的操作系统和硬件平台,可以在上面执行Java的字节码程序。 Java程序的代码存储在class文件中(也称为字节码文件)。 Java编译器针对Java虚拟机产生class文件,因此是独立于平台的。 Java解释器负责将Java程序的代码在特定的平台上运行。
Java虚拟机(5-2) Java虚拟机的建立需要针对不同的软硬件平台做专门的实现: 应用程序层 Java平台层 操作系统层 硬件层 UNIX Linux SPARC Java应用程序 Java虚拟机 Windows X86 Java应用程序 Java虚拟机 RTOS MIPS PPC
Java虚拟机(5-3) Java虚拟机定义了: 指令集 寄存器集 类文件结构 堆栈 垃圾收集堆 内存区域
Java虚拟机(5-4) Java 虚拟机的执行过程有三个典型特点:
Java虚拟机(5-5)-实时编译器 使用“实时 (Just In Time)” 编译器,也称为JIT编译器。可以提高 Java 代码的执行速度。 SUN公司在Java 2 发行版中提供了JIT编译器,JIT编译器是Java虚拟机的一部分。 JIT 的主要用途是将字节码指令集转换为针对某一特定微处理器的机器代码指令。
自动垃圾收集(GC) 在其他语言中,由程序员负责无用空间的回收,如C++; Java语言提供了一个系统级线程对内存使用进行跟踪,定期检测出不再使用的内存,并自动回收。
垃圾收集2-1 Java 虚拟机使用两个独立的堆内存,分别用于静态内存分配和动态内存分配。 其中一个是非垃圾收集堆内存,用于存储所有类定义、常量池和方法表。 另一个堆内存再分为两个可以根据要求往不同方向扩展的小块。 用于垃圾收集的算法适用于存放在动态堆内存中的对象。
垃圾收集 2-2 垃圾收集器将在收集对象实例之前调用 finalize() 方法。 即使显式调用垃圾收集 (System.gc( ) ) 方法,它也不能保证立即运行。 垃圾收集线程的运行优先级很低所以可能经常会被中断。
代码安全性 字节码的运行要经过三步: 加载代码:由class loader 完成; 校验代码:由bytecode verifier 完成; 执行代码:由 runtime interpreter 完成。
Java 运行时环境 编译时 运行时 .java .class 类加载器 网络 (源代码) 字节码校验器 JIT代码 解释器 生成器 (字节码) 运行时 类加载器 字节码校验器 解释器 JIT代码 生成器 硬件 网络
Java应用程序接口(Java API) 基本部分: 对象,字符串,线程,数组,输入和输出,系统属性,日期与时间等。 Math,反射,集合框架,并发,Jar,JAXP,JDBC AWT,Swing,多媒体,Java2D, Applet 网络:URLs,TCP和UDP套接字,IP地址。 国际化:帮助世界各地用户编写本地化的程序。 安全性:包括电子签名、公用/私用键字管理、访问控制和认证。 软件组件:即JavaBeans,可插入到现存的组件中. 对象序列化:通过远程方法调用(RMI)维持对象的持久性和通讯。
Java 的开发编辑环境 JDK是有助于程序员开发Java 程序的 Java 开发工具包包括: 开发类 (Lib) 编译器 (javac.exe) Java 运行时环境( JRE ) 解析器 (java.exe) 运行类 动态链接库
JDK(JRE)下载和安装 http://www.oracle.com/technetwork/java/javase/downloads/index.html
JDK安装后
JDK 提供的常用工具 Javac.exe 是用来编译源代码的命令。 Java.exe 是用于执行类文件的命令,而类文件将在 Java 虚拟机中运行类。 Jar.exe 把类打包 Javadoc.exe 提取文档
Java开发工具 命令行开发环境 简单图形开发环境 复杂图形开发环境 Jdk提供的,Javac,java,Jdb,javadoc Gel,JCreator,Jpadpro 复杂图形开发环境 Eclipse (v3.7), Jbuilder , Netbeans ( v7) IntelliJ IDEA (10.5) IBM Rational系列开发工具
常见的Java产品类型 桌面应用程序 Applet Web应用程序 应用服务器 数据库 嵌入式: J2ME Android Eclipse NetBeans 等开发工具 Applet 在浏览器中执行,jdk提供了很多例子 Web应用程序 基于网络的应用程序,ICBC网上银行,电子商务 应用最广的就是这一块 应用服务器 使用java技术提供服务的软件,一般是web程序,中间件,组件的运行环境。 Tomcat,Resin,Websphere,Weblogic等 数据库 Oracle ,DB2 , Cloudscape,HSQL等。 嵌入式: J2ME Android
Java 程序分类 Java Application 以main()方法作为程序入口,由Java解释器加载执行。 Java Applet 没有main()方法作为程序入口,由浏览器或appletviewer加载执行。 Java Servlet (JSP) 由服务器调用Service()方法执行 EJB,J2ME等
Java Application程序基本结构 import语句 class { public static void main(String[ ] args) } 主类名称 方法体
Java 应用程序(Application)举例 public class HelloWorldApp { public static void main (String args[]) System.out.println("Hello World!"); }
HelloWorldApp 应用程序分析 main()方法 Java Application程序的入口是main()方法。它有固定的书写格式: public static void main(String args[]) { …… } 除了这个,没有其他形式。注意辨别
HelloWorldApp 应用程序分析 程序内容 由方法体实现程序要完成的功能,方法体由一条条语句组成,本例中只有一条语句: System.out.println("Hello World!");
HelloWorldApp 应用程序分析 注释 与C++相同,一行中‘//’后的内容为注释,‘/*’和‘*/’中的内容也是注释,例如: public class HelloWorldApp { //公共类 public static void main(String args[]) { /*这是 主方法*/
Java Application 的编译 在命令行中使用 Javac 命令, 例如: C:\java>javac HelloWorldApp.java 源文件名为HelloWorldApp.java,注意:文件名必须与公共类名相同;由javac编译器编译源程序,产生字节码文件(.class文件)。本例中产生HelloWorldApp.class文件。
Java Application 的运行 此命令将启动Java虚拟机,由java解释器解释执行。 在命令行中使用 Java命令, 例如: C:\java> java HelloWorldApp 此命令将启动Java虚拟机,由java解释器解释执行。
Java 小应用程序(Applet)举例 public String s; public void init(){ import java.awt.Graphics; import java.applet.Applet; public class HelloWorldApp extends Applet{ public String s; public void init(){ s = new String(“Hello World”); } public void paint(Graphics g) { g.drawString(s,25,25);
HelloWorldApp Applet 结构分析 类定义 所有的Java Applet也都是类(class),而且必须是Applet类的子类;用关键字extends来实现继承: public class HelloWorldApp extends Applet { …… }
HelloWorldApp Applet 结构分析 方法定义 在Java Applet中没有main()方法,这是Java Applet 与 Java Application之间的主要区别之一。Applet 类实现了许多方法,构造了一个窗口程序的主要框架,用户只须重写所需的方法即可,系统将自动调用,例如init(),start(),stop()等方法。
HelloWorldApp Applet 结构分析 类库支持 程序中用到了类库中的一些方法,因此必须在程序中进行声明。在Java中,用import来输入包或类,本例中便输入了java.awt.Graphics和java.applet.Applet 类: import java.awt.Graphics; import java.applet.Applet;
编译Java Applet 在命令行中使用 Javac 命令, 例如 C:\java> javac HelloWorldApp.java 源文件名为HelloWorldApp.java,注意:文件名必须与公共类名相同;由javac编译器编译源程序,产生字节码文件(.class文件)。本例中产生HelloWorldApp.class文件。
运行Java Applet Java Applet不能直接执行,需要编写HTML文件,把Applet嵌入其中,例如编辑example.html 文件: <HTML> <applet code=”HelloWorldApp.class” width=200 height=200 > </applet> </HTML>
运行Java Applet 用appletviewer来运行,在命令行中敲入如下命令: C:\java>appletviewer example.html 在支持Java的浏览器上运行,例如在IE或Netscape中浏览example.html文件
Java 程序结构 命名 如果.java 文件包含一个public 类,它必需按该类名命名。 类个数
Java 程序结构 结构 package 语句 //0或1个,必须放在文件开始 import语句 //0或多个,必须放在所有类定义之前 public class Definition //0或1个 //文件名必须与该类的类名完全相同 classDefinition //0或多个 interfaceDefinition //0或多个
Java 程序结构示例 package javawork.helloworld; import java.awt.*; import javawork.newcentury; public class HelloWroldApp { ……} //0~1个 class TheFirstClass {……} class TheSecondClass {……} …… interface TheFirstInterface {……}
package语句 包对应于文件系统中的目录, 目的是把编译生产的.class文件放入该目录,例如: package edu.cqu; 对应于目录 “ ${classpath} \edu\cqu” , 如果“edu\cqu”不存在,则创建该目录,例如: C:\java> javac -d c:\java HelloWorldApp.java 则生成的HelloWorldApp.class文件将放在“c:\java\edu\cqu”中
package语句 如果程序中没有package语句,或者有package语句但是在编译时不用-d选项,则生成的.class文件放入当前目录. 一般叫做“default package”
import语句 在程序中用到了标准类库或自定义包中的类,需要用import语句来声明. 可以声明导入一个类,例如: import java.util.Date; 但是需要在 环境变量中设置类路径: classpath=.;c:\jdk6\lib\rt.jar; 或者在开发环境中设置构建路径 也可以声明导入一个包的所有类: import java.util.*; 理解classpath
Java编码规范 包名:全小写,一般为名词,如 : package edu.cqu 类名:首字母大写,每个单词的首字母大写, 如: class HelloWorldApp 接口名:同类名,如: interface AccountBook 方法名:一般为动词,小写字母开头,每个单词的首字母大写,如:balanceAccount 变量名:一般为名词 如length,bigMouse 常量名:基本类型的常量名全大写,如: HEAD_COUNT
简单Java程序举例1 从控制台读入数据
代码1(传统版) import java.io.*; //引入该程序需要的类所在的包 public class SimpleInput{ public static void main(String args[]) throws IOException{ String s; BufferedReader ir=new BufferedReader( new InputStreamReader(System.in)); s=ir.readLine(); System.out.println("Input value is:"+s); double d=Double.parseDouble(s); //将s 转换成double型 System.out.println("Input value changed after doubled:"+Math.sqrt(d)); }
代码2(改进版) 在JDK5.0中提供了java.util. Scanner类,可以直接从输入流读取简单数据。例如 import java.util.Scanner; public class TestScanner { public static void main(String[] args) { Scanner cin = new Scanner(System.in); int a = cin.nextInt(), b = cin.nextInt(); System.out.println(a + b); System.out.printf(""+ Math.PI); System.out.format("%4d%4d",a,b); System.out.format("Pi is approximately %f", Math.PI); }
简单Java程序举例2 从m个数中抽出n个数,试计算中奖的概率。该例演示如何从可视化组件输入数据并转换成整形数据,然后从命令窗口输出数据。
代码 // Proba.java import javax.swing.*; public class Proba{ public static void main(String[] args){ String input= JOptionPane.showInputDialog("你希望抽取多少个数?"); int k=Integer.parseInt(input); input=JOptionPane.showInputDialog(“一共有多少个数? "); int n=Integer.parseInt(input); int result=1; for(int i=1;i<=k;i++){ result=result*(n-i+1)/i; } System.out.println("你中奖的几率是1/"+result+""); System.exit(0);
Java API 文档1
Java API 文档2
Java API 文档3 选择 包 可查看相应帮助 选择包中的 接口或类