第 2章 Java导论
2012年 3月 7日 10时 2分 Java面向对象程序设计教程 2
主要内容
? 2.1 Java语言的特点
? 2.1.1 简单的面向对象程序设计语言
? 2.1.2 健壮安全的分布式语言
? 2.1.3 结构中立、可移植性强的解释型语言
? 2.1.4 高效能
? 2.1.5 支持多线程的动态语言
? 2.1.6 Java与几种常用语言的比较
? 2.2 Java执行环境
? 2.2.1 JVM机制 ——Java平台的基础
? 2.2.2 自动垃圾收集
? 2.2.3 保护域机制与沙箱模型
? 2.2.4 类加载器 ——启动引擎的点火器
? 2.3 JDK的组成与安装设置
? 2.3.1 Java平台的组成结构
? 2.3.2 SET PATH和 SET CLASSPATH的作用
? 2.4 典型例子及常见问题
? 2.4.1 编译器、解释器、小程序观察器和反编译器
? 2.4.2 最简单的例子
? 2.4.3 应用程序的主方法
? 2.4.4 小程序的运行
2.1 Java语言的特点
2012年 3月 7日 10时 2分 Java面向对象程序设计教程 4
Java的由来
? 1991年初,Sun Microsystems公司设立一项较大规模
“消费者电子产品先进软件发展项目”,该项目是为
了发展小型、可靠、可移植、分布式、实时的嵌入式
系统。
? 项目小组开发了一种与平台无关的新语言,命名为
,Oak”。 其灵感来源于项目主持人 James Gosling办公
室外的一棵橡树( Oak),它就是 Java语言的前身。
? 但因 Oak名称与其它产品雷同,最后将开发的新语言
取名为,Java”。 据说是项目小组成员经常在公司附近
一家咖啡厅喝咖啡,因此把咖啡原产地 Java作为新语
言的名称。
? 1995年,Sun Microsystems公司正式发布 Java产品。
2012年 3月 7日 10时 2分 Java面向对象程序设计教程 5
与 Java有关的一些图片
Java的标识 Java的吉祥物
Duke
Java之父
James Gosling
2012年 3月 7日 10时 2分 Java面向对象程序设计教程 6
Java语言的特点
? 在 Java语言白皮书中,Java被描述为, 是一
种简单、面向对象、分布式、解释、健壮、
安全、结构中立、可移植、高效能、多线
程、动态的语言。
? A simple,object-oriented,network-savvy,
interpreted,robust,secure,architecture neutral,
portable,high-performance,multithreaded,
dynamic language。
—James Gosling,Henry McGilton,The Java? Language Environment,A White Paper,
2012年 3月 7日 10时 2分 Java面向对象程序设计教程 7
简单的面向对象程序设计语言
?, 爪哇, —— Java总给人以小巧玲珑
? 和 C++很相近,但删除许多极少被使用、不容易
理解和令人混淆的 C++功能,主要包括运算符重
载, 多重继承以及广泛的自动强迫同型 。
? 自动垃圾收集( Automatic garbage collection) 功
能,这不仅简化了 Java程序的内存分配与释放工
作,而且能大幅度减少程序中的漏洞。
? Java程序非常小,对于在嵌入式的系统中使用是
很重要的,同时也可以通过网络轻易下载。
2012年 3月 7日 10时 2分 Java面向对象程序设计教程 8
健壮安全的分布式语言
? Java拥有广泛的能轻易处理 TCP/IP协议(如
HTTP与 FTP等)的类库,更容易创建网络
连接。
? 除了运行时异常检查外,Java提供了广泛的
编译时异常检查,以便尽早的发现可能存
在的错误。同时,在 Java中对象的创建机制
(只能用 new操作符)和自动垃圾收集机制
大大减少了因内存管理不当引发的错误。
? Java的验证技术是以公钥加密算法为基础。
2012年 3月 7日 10时 2分 Java面向对象程序设计教程 9
结构中立、可移植性强的解释型语言
? 为了让 Java应用程序能够在网络上任何地方执行,
其编译器会产出一种结构中立的字节代码
( Bytecode)。 字节代码可以在提供 Java运行时系
统的多种不同处理器上面执行。
? Java严格定义了基本数据类型的大小和算术运算
符的行为,因此不存在软硬件平台不兼容的情况。
? Java系统本身具备相当好的移植性。它的编译器
用 Java写成,而 Java运行时程序则是参照 POSIX
( 一个可移植接口工业标准)规格使用 ANSI C写
成的。
2012年 3月 7日 10时 2分 Java面向对象程序设计教程 10
高效能
? 字节代码可以动态地为执行应用程序的特定 CPU
解释成机器码。字节代码格式在设计上即顾及机
器码的产生,因此实际的机器码产生程序相当简
单。
? 解释器运行时不需检查运行环境,自动垃圾收集
器设为优先级最低后台线程,以保证内存得到更
有效的应用。
? 对于运算量很大的程序可以采用原生代码编写,
再经由 Java平台转换。
? Just-In-Time编译技术更是让字节代码的执行速度
大幅度提升。
2012年 3月 7日 10时 2分 Java面向对象程序设计教程 11
支持多线程的动态语言
? 在 Java核心类库中包含 Thread类,同时 Java
运行时系统提供了线程监视器和同步锁定
机制。多线程的其它优点包括更好的交互
式回应能力与实时执行行为。
? Java是一种比 C或 C++更具动态特性的语言。
它在设计上强调为进化中的运算环境提供
支援。甚至可以在不中断网络服务的情况
下替换相关的组件。
2012年 3月 7日 10时 2分 Java面向对象程序设计教程 12
Java与几种常用语言的比较
2.2 Java执行环境
2012年 3月 7日 10时 2分 Java面向对象程序设计教程 14
Java执行环境
2012年 3月 7日 10时 2分 Java面向对象程序设计教程 15
Java虚拟机( JVM)
? 执行引擎 负责把字节代码导入虚拟机;
? 内存管理 负责分配内存给对象和数组,
并进行垃圾收集;
? 错误和异常管理 负责异常的捕获或抛出;
? 线程接口 负责对线程的支持;
? 对原生方法( Native Method) 的支持 支持
调用 C/C++等语言编写的方法。
2012年 3月 7日 10时 2分 Java面向对象程序设计教程 16
什么是 JVM?
? Java虚拟机( Java Virtual Machine,
JVM)实际上是一个类似于真实计算机系
统的抽象机( Abstract Computing
Machine),它拥有一组指令集,用来解
释,,class”字节代码;也就是说,JVM并
不认识所谓的 Java语言,而仅仅能够读懂
class文件中有限的指令、符号及其它一些
辅助信息。
2012年 3月 7日 10时 2分 Java面向对象程序设计教程 17
JVM类似于数控机床的数控系统
数控机床
数控机床抽象
数控机床可以加工各种形状的物体
原因在于它拥有一个可以能读懂指令
的核心系统
Machine
Virtual Machine
2012年 3月 7日 10时 2分 Java面向对象程序设计教程 18
解释
产品(问题域)
编程人员是熟悉的!
但数控系统 (JVM)是不认识的!!
编程人员根据自己的想法,
在相应的平台上编写出符合
产品形状要求的程序 (.java)
2012年 3月 7日 10时 2分 Java面向对象程序设计教程 19
解释
这是程序员可以理解的程序 (.java),因其是接近自然语言的。
但对数控系统 (JVM)来说太复杂,它是读不懂的!
2012年 3月 7日 10时 2分 Java面向对象程序设计教程 20
解释
于是程序员利用相应的平台把它编译成
数控系统 (JVM)可以理解的程序 (.class)
于是数控机床 (JVM)动起来啦! 产品也做出来啦!
可是最终数控机床 (JVM)
也没有明白它做出的产品是什么,只知道
走了许许多多的直线或圆弧 (JVM指令集 )!
2012年 3月 7日 10时 2分 Java面向对象程序设计教程 21
演示
虚拟的 真实的
2012年 3月 7日 10时 2分 Java面向对象程序设计教程 22
JRE
? JVM协同类加载器、字节代码校验器和 Java
类库一起,组成了整个 Java运行环境 JRE。
? 一次编写随处运行
( Write Once Run Anywhere,WORA)
2012年 3月 7日 10时 2分 Java面向对象程序设计教程 23
保护域机制与沙箱模型
? 保护域( Protection
domain) 是有关系
统安全的基本概念和
重要模块。域界定了
作为主体的系统实体
对各种对象集直接访
问的被许可程度。保
护域概念提供一种在
受保护单元中分组和
隔离不安全因素的便
利机制。
2012年 3月 7日 10时 2分 Java面向对象程序设计教程 24
类加载器 —— 启动引擎的点火器
? 加载 当 JVM加载类时,它寻找类或接口的
二进制表示,并从这个二进制表示(通常
是 Java编译器生成的类文件)生成 Class对
象。 Class对象封装类或接口的运行时状态。
? 链接 链接是取得加载的类或接口,并将其
与 JVM运行时环境结合起来,以准备执行
的过程。
? 初始化 初始化在 JVM调用类或接口初始化
方法时发生。
2012年 3月 7日 10时 2分 Java面向对象程序设计教程 25
类加载器 —— 启动引擎的点火器
? JVM在启动独立 Java应用程序时的第一步是
生成初始 Class对象,表示包含 public static
void main(String[] args)方法的 Java的类。
JVM链接与初始化这个类并调用 main()方法。
这个方法推动所需要的其他类和接口的加
载、链接与初始化。
2.3 JDK的组成与安装设置
2012年 3月 7日 10时 2分 Java面向对象程序设计教程 27
Java平台的组成结构
2012年 3月 7日 10时 2分 Java面向对象程序设计教程 28
JDK版本主要特点
2012年 3月 7日 10时 2分 Java面向对象程序设计教程 29
SET PATH的作用
? SET PATH = c:\j2sdk1.4.0\bin
? 含义是告诉操作系统到哪里可以找到 Java
的编译器等可执行文件的位置。
2012年 3月 7日 10时 2分 Java面向对象程序设计教程 30
SET CLASSPATH的作用
? SET CLASSPATH
=,;c:\j2sdk1.4.0\lib\tools.jar
? 含义是告诉操作系统到哪里可以找到编译
或解释运行时所需字节代码的位置。
2012年 3月 7日 10时 2分 Java面向对象程序设计教程 31
在运行环境中的设置方法
? 如果系统平台为 Windows 9X,则把以上
的设置内容加入系统根目录下的
autoexec.bat文件中;
? 如果系统平台为 Windows NT、
Windows2000及以后版本,则把以上的
设置内容加入 【 控制面板 】 |【 系统 】 |【 高
级 】 |【 环境变量 】 中。
2.4 典型例子及常见问题
2012年 3月 7日 10时 2分 Java面向对象程序设计教程 33
演 示
? 编译器 javac的使用
? 解释器 java的使用
? 小程序观察器 appletviewer的使用
? 反编译器 javap的使用
2012年 3月 7日 10时 2分 Java面向对象程序设计教程 34
应用程序编程举例
? //,HelloWorld.java
? //package g3ds.joop.ch2;
? public class HelloWorld { //an application
? public static void main (String[] args){
? System.out.println("Hello World!");
? }
? }
? 程序保存为 HelloWorld.java
? 编译时执行
? javac HelloWorld.java?
? 得到字节代码 HelloWorld.class。
? 运行时执行
? java HelloWorld ?
2012年 3月 7日 10时 2分 Java面向对象程序设计教程 35
小程序编程举例
? //,HelloWorldApplet.java
? //package g3ds.joop.ch2;
? import java.awt.Graphics;
? import javax.swing.JApplet;
? public class HelloWorldApplet extends JApplet {//an applet
? public void paint(Graphics g){
? g.drawString("Hello World!",150,50);
? }
? }
? <HTML> <!--HelloWorldShow.html-->
? <APPLET CODE="HelloWorldApplet.class" WIDTH=300 HEIGHT=100>
? </APPLET>
? </HTML>
? 保存为 HelloWorldShow.html或 HelloWorldShow.htm
? appletviewer HelloWorldShow.html?
进一步讨论
2012年 3月 7日 10时 2分 Java面向对象程序设计教程 37
反编译程序样式
? javap –c HelloWorld ?
? 则可以获得字节码的助记符版本,
? Compiled from HelloWorld.java
? public class HelloWorld extends java.lang.Object {
? public HelloWorld();
? public static void main(java.lang.String[]);
? }
? Method HelloWorld()
? 0 aload_0
? 1 invokespecial #1 <Method java.lang.Object()>
? 4 return
? Method void main(java.lang.String[])
? 0 getstatic #2 <Field java.io.PrintStream out>
? 3 ldc #3 <String "Hello World!">
? 5 invokevirtual #4 <Method void println(java.lang.String)>
? 8 return
2012年 3月 7日 10时 2分 Java面向对象程序设计教程 38
哪些类被加载了
2012年 3月 7日 10时 2分 Java面向对象程序设计教程 39
使用 Java的一些注意事项
? Java中规定,在一个, java的源文件中最多只能
有一个(另一个意思是可以没有) public class。
? 当这个 public class存在时,要求该类名必须与,
Java源文件的名字一致。
? 如果你想编写一个应用程序(通常被声明为
public class),在这一个类中必须定义一个
public static void main(String[] agrs)方法,
在这个方法中,除了变量名 agrs可以改变,其它
内容均不可改变,甚至排放的顺序都是几乎不可
改变的。
2012年 3月 7日 10时 2分 Java面向对象程序设计教程 40
应用程序的主方法
? JVM解释应用程序需要一个程序执行入口,也就
是程序中逻辑运行的启动模块,或者称为应用程
序的驱动器,这就是对应类中的 main方法,它的
声明 public static void main(String[] agrs)
也叫 main方法的标志性签名。
? JVM解释某个应用程序时,就会首先查找对应类
的这个 main方法,当无法匹配时就引发如上述的
异常报告,
Exception in thread "main" java.lang.NoSuchMethodError,main
2012年 3月 7日 10时 2分 Java面向对象程序设计教程 41
小程序的生命周期
2012年 3月 7日 10时 2分 Java面向对象程序设计教程 42
小程序的 HTML标记和属性
? <APPLET
? CODE=filename.class
? WIDTH=pixels HEIGTH=pixels
? [ARCHIVE=archiveList]
? [CODEBASE=codebaseURL]
? [ALT=alternateText]
? [NAME=appletInstanceName]
? [ALIGN=alignment]
? [VSPACE=pixels] [HSPACE=pixels]
? >
? [<PARAM NAME=appletAttribute1 VALUE=value>]
? [<PARAM NAME=appletAttribute2 VALUE=value>]
? …
? </APPLET>