第12章 Java虚拟机

合集下载

尚硅谷_宋红康_第5章_高级类特性2

尚硅谷_宋红康_第5章_高级类特性2

关键字static
使用范围:
在Java类中,可用static修饰属性、方法、代码块、内部类
被修饰后的成员具备以下特点:
随着类的加载而加载 优先于对象存在
修饰的成员,被所有对象所共享 访问权限允许时,可不创建对象,直接被类调用
name:Lilei age:21 country:
类方法
因为不需要实例就可以访问static方法,因此static方法内部不 能有this。(也不能有super ? ) 重载的方法需要同时为static的或者非static的。
class Person { private int id; private static int total = 0; public static void setTotalPerson(int total){ this.total=total; //非法,在static方法中不能有this,也不能有super } public Person() { total++; id = total; }} public class TestPerson { public static void main(String[] args) { Person.setTotalPerson(3); } }
if(instance == null){ instance = new Singleton(); } return instance;
暂时懒汉式还存在线程 安全问题,讲到多线程 时,可修复
} }
举例:ng.Runtime
public class TestStatic { public static void main(String[] args) { Circle c1 = new Circle(2.0); Circle c2 = new Circle(3.0); c1.display(); c2.display(); } }

java语言程序设计郑莉第1章PPT课件

java语言程序设计郑莉第1章PPT课件

面 向
对于大多数常用的功能,有大量已经
对 编译好、经过测试的类,这些类的集
象 合就是Java类库。
的 程
Java类库主要是随编译器一起提供,
序 也有些类库是由独立软件开发商提供
设 的。

*
12
JAVA语言程序设计
1.2 Java程序概述
Java 开发环境 Application 举例 Applet举例 Servlet举例 JSP举例
安全性
– Java不支持指针 – Java的内部安全措施
平台无关性

– 编译后的字节码对应于Java虚拟机,因此可在

不同平台上运行
程 多线程

– Java是第一个在语言级提供内至多线程支持的

高级语言
计 内存管理
– Java对内存自动进行管理并进行垃圾回收
*
9
JAVA语言程序设计
清华大学 郑莉

– Java中禁用goto,但goto还是保留的关键字;

– Java中没有操作符重载;

– Java中没有全局变量,可以在类中定义公用、

静态的数据成员实现相同功能;
…...
*
11
JAVA语言程序设计
1.1.3 Java类库
清华大学 郑莉
Java

言 组成Java程序的最小单位是类,类封
与 装了数据与处理数据的方法。
Java
Java 平台

Java 程序


Java APIs

Java 虚拟机
计算机系统
Java APIs (应用 程序接口)

(精品)JavaSE知识点总结127

(精品)JavaSE知识点总结127

第1章Java程序设计概述1)开发Java语言的公司?Sun 公司2)Java的3个版本?J2SEJ2EEJ2ME3)Java的三大核心机制虚拟机机制垃圾回收机制代码安全性机制第2章Java语言的开发环境1)JDK是什么?Java开发工具包2)JRE是什么?Java运行环境3)JVM是什么?Java虚拟机4)Java文件的类型?.java文件.class文件第3章Java程序的基本结构1)Java语言区分大小写吗?区分2)main方法是作什么用处的?程序的入口3)语句必须用分号结束吗?必须4)Java中有几种注释,各自的功能单行注释多行注释文档注释5)Java语言的数据类型是强类型还是弱类型?强类型6)Java语言中数据类型的划分?有什么区别?基本数据类型引用数据类型7)基本类型都有哪8种类型?byte short int long float double char boolean8)布尔值可不可以用0或者非0数代替?不可以9)直接写个整数10默认是什么类型的?int类型10)如何让一个整型的直接量变成long型的?在后面加个L或者l11)整型数据在程序中直接使用可以使用什么进制?八进制十进制十六进制12)浮点运算在Java中有没有误差?有误差13)直接写一个3.14的直接量是什么数据类型的?double数据类型14)char型采取的是什么类型的字符集?Unicode编码15)语句和关键字之间可以有任意的空白吗?可以16)标识符有什么起名规则?标示符由数字、字母、下划线、美元符组成首字母不能是数字不能是关键字17)中文的变量名可以吗?可以18)关键字和保留字有区别吗?保留字是没有实际意义的关键字JDK1.5以后关键字和保留字统称为关键字19)true,false,null可以用作标识符命名吗?不可以,它们是关键字20)一条声明语句可以声明多个变量吗?可以21)变量在没有赋值的情况下可以使用吗?不可以22)常量有什么特点?只能被赋值一次23)算数运算符有哪些?+-*/%++--24)++和--放在前面和放在后面有什么区别?++放在前面表示先++再运行表达式++放在后面表示先运行表达式再++25)-5 % 2等于几,5 % -2等于几?-1,126) 5 / 2 结果是不是2.5?不是,等于227)任何数据类型都可以使用> < >= <=运算符吗?不可以,boolean28)’a’ > ’b’这个表达式编译正确吗?正确,’a’和’b’都是字符类型,用unicode编码表示a表示97,b表示98,返回false29)逻辑运算符有哪些?& | !&& ||30)逻辑与,逻辑或和短路与,短路或有什么区别?31)数据类型转换需要遵循什么原则?小类型向大类型转换自动转换大类型像小类型转换需要强转32)byte b = 10这个语句是正确的,为什么10是int型比byte大还不需要强制转换呢?正确,java中规定byte,short,char可以直接赋值int类型的变量。

第1章 Android概述

第1章 Android概述
Android发展中的里程碑-Android2.0/2.1 Eclair
“三十年河东,三十年河西”,风水总是轮流转。--摩托罗 拉
Page 13
Android的前世今生
-Android2.2Froyo冻奶
Page 14
ห้องสมุดไป่ตู้ Android的前世今生
-Android2.2Froyo冻奶
Page 15
Android的前世今生
Page 33
3G相关
2.5G
2.5G移动通信技术是从 迈向 的衔接性技术,由于 是个相 移动通信技术是从2G迈向 的衔接性技术,由于3G是个相 移动通信技术是从 迈向3G的衔接性技术 当浩大的工程,所牵扯的层面多且复杂,要从目前的 迈向 迈向3G 当浩大的工程,所牵扯的层面多且复杂,要从目前的2G迈向 不可能一下就衔接得上,因此出现了介于 和 之间的 之间的2.5G。 不可能一下就衔接得上,因此出现了介于2G和3G之间的 。
Page 26
Android Market
Page 27
Android组件
四大组件--四喜丸子
Activity—一个屏幕 一个屏幕 Service—背后做事 背后做事 Broadcast Receiver -- 广播接收者 ContentProvider– 内容提供者。 统一的方式来共享、访问 内容提供者。 统一的方式来共享、 数据
Page 3
Android就业形势
51Job搜索
Page 4
Android就业形势
中华英才网搜索
Page 5
Android的竞争对手
2010年10月
作为一名消费者,如果你追求简单实用,那么请你选择诺基亚的塞班智能手机; 如果你追求酷炫,那么苹果的iPhone是不二之选;如果你想玩手机,并让手 机的性价比充分发挥出来的话,那么Android将是你最好的选择 Page 6

面试题目100及最佳答案

面试题目100及最佳答案

面试题目100及最正确答案本文我们将要讨论Java面试中的各种不同类型的面试题,它们可以让雇主测试应聘者的Java和通用的面向对象编程的能力。

Java是一个支持并发、基于类和面向对象的计算机编程语言。

下面列出了面向对象软件开发的优点:代码开发模块化,更易维护和修改。

代码复用。

增强代码的可靠性和灵活性。

增加代码的可理解性。

面向对象编程有很多重要的特性,比方:封装,继承,多态和抽象。

下面的章节我们会逐个分析这些特性。

封装给对象提供了隐藏内部特性和行为的能力。

对象提供一些能被其他对象访问的方法来改变它内部的数据。

在Java当中,有3种修饰符:public,private和protected。

每一种修饰符给其他的位于同一个包或者不同包下面对象赋予了不同的访问权限。

下面列出了使用封装的一些好处:通过隐藏对象的属性来保护对象内部的状态。

提高了代码的可用性和可维护性,因为对象的行为可以被单独的改变或者是扩展。

制止对象之间的不良交互提高模块化。

参考这个文档获取更多关于封装的细节和例如。

多态是编程语言给不同的底层数据类型做相同的接口展示的一种能力。

一个多态类型上的操作可以应用到其他类型的值上面。

继承给对象提供了从基类获取字段和方法的能力。

继承提供了代码的重用行,也可以在不修改类的情况下给现存的类添加新特性。

抽象是把想法从详细的实例中别离出来的步骤,因此,要根据他们的功能而不是实现细节来创立类。

Java支持创立只暴漏接口而不包含方法实现的抽象的类。

这种抽象技术的主要目的是把类的行为和实现细节别离开。

抽象和封装是互补的概念。

一方面,抽象关注对象的行为。

另一方面,封装关注对象行为的细节。

一般是通过隐藏对象内部状态信息做到封装,因此,封装可以看成是用来提供抽象的一种策略。

1.什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?Java虚拟机是一个可以执行Java字节码的虚拟机进程。

Java 源文件被编译成能被Java虚拟机执行的字节码文件。

高尔夫会员管理系统设计

高尔夫会员管理系统设计

摘要随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。

管理信息系统是一个不断发展的新型学科,任何一个单位要生存要发展,要高效率地把内部活动有机地组织起来,就必须建立与自身特点相适应的管理信息系统。

本文介绍了在JAVA环境下开发一个管理信息系统的过程。

通过分析某一健身中心的管理的不足,创建了一套行之有效的计算机管理健身中心会员的方案。

文章介绍了会员管理信息系统的系统分析部分,包括可行性分析、业务流程分析等;系统设计部分主要介绍了系统功能设计和数据库设计及代码设计;系统实现部分说明了几个主要模块的算法,本系统界面友好,操作简单,比较实用。

【关键字】:管理信息系统、会员管理、JAVA应用。

SummaryAs information technology in the management of more in-depth and wide range of applications,the implementation of management information systems, technology has gradually matured. Management information system is an evolving new discipline, any one unit to survive is to develop and efficiently the internal activity of organic and organized, it must establish a management information system compatible with its own characteristics.This paper describes the development of a management information system in JAVA environmental processes. By analyzing the lack of a fitness center management, create a set of effective computer management fitness center membership program. This paper introduces a systematic analysis of some members of the management information system, including feasibility analysis, business process analysis; system design section describes the system functional design and database design and code design; system implementation section has several main modules the system is user-friendly, simple, more practical.[Keywords] :MIS、member management、JAVA目录第一章系统概述 01.1 系统及需求分析 (1)1.1.1 系统需求 (1)1.1.2可行性分析 (1)1.2系统的功能简介 (3)1.2.1 项目规划 (3)1.2.2系统管理模块 (3)1.2.3会员卡管理模块 (3)1.2.4会员档案管理模块 (3)1.2.5会员缴费管理 (4)1.3系统开发的目标 (4)第二章系统分析 (5)2.1业务流程分析 (5)2.2数据流程分析 (6)2.2.1数据流程图 (6)2.3数据存储分析 (7)2.4功能分析 (8)3.系统设计 (9)3.1软件模块结构设计 (9)3.1.1系统方案确定 (9)3.1.2软件结构设计 (9)3.2数据库设计 (9)3.2.1本系统中所涉及到的主要实体共有以下几个数据表: (9)3.2.2各表的物理结构如下: (10)第四章系统的功能 (11)4.1系统登陆界面: (11)4.2系统主界面: (11)4.3用户管理模块: (13)4.4会员档案管理模块:...................................................... 错误!未定义书签。

java语言程序设计(一)第三章补充

专接本辅导java第三章《面向对象编程基础》补充0.类变量与实例变量区别(类方法与实例方法的区别见习题解答第12题改错)java类的成员变量有两种:一种是被static关键字修饰的变量,叫类变量或者静态变量;另一种没有static修饰,为实例变量。

在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。

在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。

静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。

总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。

例如,对于下面的程序,无论创建多少个实例对象,只在类被第一次装置时初始化一次staticVar变量和sum变量,并且每创建一个实例对象,就会执行一次构造函数;但是,每创建一个实例对象,就会分配一个instanceVar,即可能分配多个instanceVar,并且每个instanceVar的值都只自加了1次。

public class类变量与实例变量{public static int staticVar = 0;//类变量初始化,只会在类装载时进行一次!!public int instanceVar = 0;//实例变量初始化public static int sum=1;public类变量与实例变量()//构造方法{staticVar++;instanceVar++;sum=sum+5;System.out.println("staticVar = "+staticVar+",instanceVar="+instanceVar);System.out.println("sum = "+sum);}public static void main(String []args){类变量与实例变量对象1=new类变量与实例变量();类变量与实例变量对象2=new类变量与实例变量();类变量与实例变量对象3=new类变量与实例变量();}}运行结果:staticVar = 1,instanceVar=1sum = 6staticVar = 2,instanceVar=1sum = 11staticVar = 3,instanceVar=1sum = 16再如下面的程序,涉及static块:class Value{static int c=0;static int d;Value(){c=15;d=65;}Value(int i){c=i;d=c-1;}static void inc(){c++;}}public class Count {Value v0=new Value();//调用无参构造函数建立Value类非静态对象v0,类Count和类Value是has-a关系Value v=new Value(10);//调用有参构造函数建立Value类非静态对象vstatic Value v1,v2;//声明Value类的static对象v1,v2//static Value v1=new Value(),v2=new Value();//声明v1、v2并引用新建立的Value类对象static{//★声明static块,其初始化工作会先于任何其它非static块及非static变量而不管其在源程序书写中出现的先后次序!System.out.println("static块中println语句执行结果:"+"\n"+"v0和v是非静态内部类对象,v1和v2是静态内部类对象(请与教材P58例3.18对比),只有声明没有具体指向某对象时:v1.c="+v1.c+" v2.c="+v2.c+" v1.d="+v1.d+" v2.d="+v2.d);v1=new Value(30);//对象v1引用新建立的Value类对象System.out.println("static块中执行完“v1=new Value(30)之后:”v1.c="+v1.c+" v2.c="+v2.c+" v1.d="+v1.d+" v2.d="+v2.d);v2=new Value(15);//对象v2引用新建立的Value类对象System.out.println("static块中执行完“v2=new Value(15)之后:”v1.c="+v1.c+" v2.c="+v2.c+" v1.d="+v1.d+" v2.d="+v2.d);System.out.println("特别说明:因此时还没有建立Count类对象(Count 类和Value类是has-a关系,前者是外部类,后者是内部类)故非静态对象v0和v无法引用!"+"\n");}public static void main(String[] args) {Count ct1=new Count();//建立Count类(外部类)对象Count ct2=new Count();System.out.print("在main方法中,现在建立Count类(外部类)对象,");System.out.println("ct1的在ct2之前创建!分别指向两个Count类对象,Count类和Value类是has-a关系!"+"\n"+"以下是main方法体中println语句执行结果:");System.out.println("v0是无参构造内部类非静态对象,ct1.v0.c="+ct1.v0.c+" ct1.v0.d="+ct1.v0.d+" ct2.v0.c="+ct2.v0.c+"ct2.v0.d="+ct2.v0.d);// 非静态内部类对象只能通过外部类对象名访问System.out.println("v是有参构造内部类非静态对象,ct1.v.c="+ct1.v.c+" ct1.v.d="+ct1.v.d+" ct2.v.c="+ct2.v.c+" ct2.v.d="+ct2.v.d);// 非静态内部类对象只能通过外部类对象名访问System.out.println("v1是有参构造内部类静态对象,Count.v1.c="+Count.v1.c+" count.v1.d="+Count.v1.d);//静态内部类对象可以通过外部类名访问System.out.println("v2是有参构造内部类静态对象,Count.v2.c="+Count.v2.c+" count.v2.d="+Count.v2.d);Value.inc();//通过类名调用类方法System.out.println("调用类方法inc()之后Count.v1.c="+Count.v1.c+" Count.v1.d="+Count.v1.d);//引用类变量既可以通过类名也可以通过对象名System.out.println("调用类方法inc()之后Count.v2.c="+Count.v2.c+" count.v2.d="+Count.v2.d);Count.v2.inc();//通过类名调用类方法,这种写法不妥!System.out.println("调用类方法v1.inc()之后Count.v1.c="+Count.v1.c+" Count.v1.d="+Count.v1.d);//引用类变量既可以通过类名也可以通过对象名System.out.println("调用类方法v1.inc()之后Count.v2.c="+Count.v2.c+" count.v2.d="+Count.v2.d);ct1.v0.c++;//this.v0.c++;//错误,★不能在静态上下文中使用this关键字:!因为Value是Count的内部类,只能使用其外部类的对象ct2.v0.c++;System.out.println("顺序执行语句:ct1.v0.c++;ct2.v0.c++;后,ct1.v0.c="+ct1.v0.c+" ct2.v0.c="+ct2.v0.c);// 非静态内部类对象只能通过外部类对象名访问}}上面这个程序的行动结果如下:static块中println语句执行结果:v0和v是非静态内部类对象,v1和v2是静态内部类对象(请与教材P58例3.18对比),只有声明没有具体指向某对象时:v1.c=0 v2.c=0 v1.d=0 v2.d=0static块中执行完“v1=new Value(30)之后:”v1.c=30 v2.c=30 v1.d=29 v2.d=29static块中执行完“v2=new Value(15)之后:”v1.c=15 v2.c=15 v1.d=14 v2.d=14特别说明:因此时还没有建立Count类对象(Count类和Value类是has-a关系,前者是外部类,后者是内部类)故非静态对象v0和v无法引用!在main方法中,现在建立Count类(外部类)对象,ct1的在ct2之前创建!分别指向两个Count类对象,Count类和Value类是has-a关系!以下是main方法体中println语句执行结果:v0是无参构造内部类非静态对象,ct1.v0.c=10 ct1.v0.d=9 ct2.v0.c=10 ct2.v0.d=9v是有参构造内部类非静态对象,ct1.v.c=10 ct1.v.d=9 ct2.v.c=10 ct2.v.d=9 v1是有参构造内部类静态对象, Count.v1.c=10 count.v1.d=9v2是有参构造内部类静态对象, Count.v2.c=10 count.v2.d=9调用类方法inc()之后 Count.v1.c=11 Count.v1.d=9调用类方法inc()之后 Count.v2.c=11 count.v2.d=9调用类方法v1.inc()之后 Count.v1.c=12 Count.v1.d=9调用类方法v1.inc()之后 Count.v2.c=12 count.v2.d=9顺序执行语句:ct1.v0.c++;ct2.v0.c++;后,ct1.v0.c=14 ct2.v0.c=14以上运行结果中,有五点值得注意:一是static变量和static块是在类第一次装载时被初始化一次,并供类的所有对象共享,故static变量和static块中内容最先被初始化(早于main方法)。

基于嵌入式Java处理器的高速图像处理


效率是虚拟机方式的 80倍 , 6 表明将 Jv aa处理 器用于嵌入 式图像 处理将是 一种 可行 选择 。
关 键 词 :aa虚 拟机 ; v Jv J a处理 器 ; a 图像 处 理 ; 入 式 系统 嵌
中图 分 类 号 : P 9 . 1 T 3 14
文献标志码 : A
Hih s e d i g r c s i g b s d o a a p o e s r f r e e d d s se s g p e ma e p o e sn a e n J v r c s o o mb d e y tm
a e p o e s rwee i e ntd a h a i . ma n p ac mp ee ts lto m .Thee p i n a e u t h w ha nd pr — r c s o r mplme e tt e s me tme kig u o l t e tp a r f x erme tlr s lss o t t
J v rc so rhtcuei lme td b ad aewa rsne , w ih c n e eue b t o edrcl, a d temo i r a apo esrac i tr mpe ne y h r w spee td hc a x c t ye c d i t e r e y n h nt o
基 于嵌 入 式 Jv aa处 理器 的 高速 图像 处 理
朱 明凯 , 高振 华 , 柴志 雷
( 江南大学 物联网工程学 院, 江苏 无锡 24 2 ) 1 12
(y e u h n @ 1 3 c n) 1 w seg 6 .o u

要 :aa 术 正 越 来 越 受 到 图像 处 理研 究人 员的 关 注 , 望 以此 提 升 开 发 效 率 , 强 可移 植 性 。 但 软 件 方 式 Jv 技 希 增

开发基于Java语言的银行卡模拟系统第七章 Java异常处理在Bank系统中的妙用

开发基于java语言的银行卡模拟系统
7.1 何谓异常
7.1.3 异常的定义 上面一节给大家展示了程序中的异常,那么究竟什么叫异常呢? Java程序不能正常执行可以分为两种情况:错误和异常。错误和异常是不同的两种情
况。 错误(Error)通常是指程序本身存在的非法的情形,这些情形常常是因为代码存在的
7.2 异常处理
从上面的代码可以看出,输入的y值被接受后,当进行x/y运算,也就是当程序运行到 “System.out.println("x/y="+ x/y)”语句时,将发生“被零除”的异常情况。此时 程序员自己编写代码来判断y值是否为零,如果为零则提醒用户,否则再进行除法 运算,从而避免被零除的异常情况,使得程序没被异常中断。
※上机任务 使用Java异常处理机制继续升级Bank系统: 对工具类中的scanInt()方法进行异常处理(捕获非整型数据提醒用户) 自定义异常类实现党没有目标账户时向用户提供相关提示信息
7.1 Байду номын сангаас谓异常
7.1.1 现实生活中的异常 在接触到底什么叫异常之前,先来看看发生在现实生活中我们身边的异常
从上图可以看出,ng.ArithmetricException:/by zero at czmec.java.ch07.Exception. main(ExceptionDemo.java:8)。系统运行时发现一种异常情况,就是除数为零 了。此时系统抛出另一个异常ArithmeticException并中止了程序的运行。 这就是程序中的异常情况。
发生的异常呢?那就看看下面的处理方式吧。 处理方式:程序员使用条件语句对各种可能出现的异常情况进行判断,以捕捉特定的
异常并对其进行相应的处理,也即程序员自己编写代码来处理异常情况。上节示例 7-1的代码修改如示例7-2所示: 示例7-2 当输入的y值为0时,运行结果如下图

第1章:Java语言基础



2、注意
Java 源程序命名受严格的限制。Java 源文件的扩展名必须是“.java”; 而源程序经过编译后得到 的应用程序文件名(即字节码文件)的主文件名和源程序中的类名一样,而扩展名是“.class” 。
如果某个源文件中有多个类,那么只能有一个类是public 类;如果源文件中有 public 类,那么源 文件的名字必须与这个类的名字完全相同。
123.5439、123.5439D, 123.5439d。另一种 是科学计数法,用 10 的方幂
表示(用字符 e 或 E 表示幂底 10)。例如:123.24e40(科学计数法表示,值 为 123.24 乘 10 的 40 次方)
例题:指出下列内容哪些是 Java 语言的整型常,哪些是浮点数类型常量,
继承
年龄 吃饭

年龄 吃饭
现代人
学历
开车
年龄
吃饭
现代女孩
学历
开车
购物
多态性
开车
1.2 Java应用程序和小应用程序
1. Java程序分类
Java应用程序和Java应用小程序(Applet)。 共同点:两种 Java 程序都由一个或多个扩展名为“.class”的文件组成;都需要 java虚拟机(JVM) 载入并翻译。 不同点:(1)小应用程序只能在与 Java 兼容的容器中运行,可以嵌入在 HTML 网页内,在网络 上发布,当网页被浏览时,在浏览器中运行;小应程序的运行还要受到严格的安全限制,例如,它 不能访问用计算机上的文件。Java应用程序没有这些限制,也不支持网页嵌入和下载运行。(2) 小应用程序和应用程序在代码编写上也有很大差异。一个小应用程序必须定义成一个 Applet 类的 子类,应用程序可 以是 Applet 类的子类,也可以不是。应用程序必须在一个类中定义一个 main()方法,该方法代表应用程序的入口。而 小应用程序不必定义 main()方法,它的执行由 Applet 类中定义的多个方法控制。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第12章 Java 虚拟机 【本章专家知识导学】 Java虚拟机是Java语言平的基石。所有的Java程序都执行于Java虚拟机之上。Java虚拟机实质是一个虚构的计算机,它与普通计算机一样,拥有自己的虚拟处理器,堆、栈、寄存器等存储机制及相应的指令系统。 本章深入的介绍了Java虚拟机构的结构和对Java程序的执行方式。学习完本章之后,读者应能够加深对Java语言及JavaSE体系结构的理解,提高编写高质量的Java程序能力。

12.1Java虚拟机概述 正如前所述,Java不仅仅是一个编程语言,它是一个软件开放运行平台,它主要由四个部分组成:Java语言、开发工具和APIs、JRE、Java 虚拟机(Java Virtual Machine,JVM ),如图1-4。它们之间的关系如图12-1所示。

图 12-1 Java平台各部分之间关系 开发人员通过Java语言编写Java源程序,然后通过Java编译器将其编译为Java字节码文件。在运行时Java虚拟机将Java字节码文件装载,并解释编译为本地机器所能识别的指令代码,在本地机器上执行。

从图12-1可知,Java 虚拟机处在核心位置,是Java程序平台无关性的关键。Java 虚拟机实质上是一个虚构的计算机,通过在实际的计算机上仿真模拟各种计算机来实现。它与实际的计算机一样,具有完整的硬件架构,拥有自己的虚拟处理器,堆、栈、寄存器等存储机制及专家导学Java 面向对象编程  2 相应的指令系统。Java平台利用Java虚拟机解释执行Java程序,实现Java程序与操作系统的分离,从而实现Java的平台无关性,摆脱具体机器的束缚。

12.2Java虚拟机的生命周期 Java 虚拟机负责装载、解析执行Java程序。当Java虚拟机启动执行一个Java程序时,Java虚拟机同时创建一个Java虚拟机实例(java进程);当程序执行完毕退出时,Java虚拟机进程同时关闭, Java虚拟机实例结束生命周期。

Java虚拟机在启动时执行的Java程序,必须包含public static void main(String args[])方法。main方法是Java程序的入口方法,它将驱动程序相关的所有Java字节码文件。同时main方法也是Java程序初时线程的起点,任何其它的线程都由这个初时线程启动。Java虚拟机内部有两种线程:守护线程和非守护线程。守护线程通常由虚拟机自己使用,比如执行垃圾收集任务的线程。非守护线程由Java程序创建,只要非守护线程在运行,Java虚拟机实例也将一直在运行,直到该程序中所有的非守护线程都终止时,Java虚拟机实例才自动退出。

12.3Java虚拟机数据类型 Java虚拟机是通过数据类型来执行计算的,数据类型及其运算都按Java虚拟机规范严格定义。对应于Java语言,Java虚拟机数据类型可分为两种:基本类型和引用类型(对应抽象数据类型),如图12-12。

图12-2 Java虚拟机数据类型 基本数据类型包括数据类型、boolean类型和returnAddress类型。Java语言中的所有基本类型同样也是Java虚拟机中的基本类型。但boolean类型有点特别。尽管Java语言定义了boolean类型,但是Java虚拟机没有用于boolean类型操作的指令。虽有创建boolean类型数组的指令,但也不支持对boolean数组元素的访问。在Java虚拟机中boolean型用int数据类型表示,其中false用整数零表示,true用非零整数表示。相应地,对boolean型的操作转换为对int类型的操作,boolean数组也用int数组指令访问和修改。 retuanAddress类型在Java语言中没有对应的类型,供予Java虚拟机的jsr,ret和jsr_w指令使用。returnAddress类型的值是Java虚拟机指第12章 Java 虚拟机  3  令的操作码指针,与数值基本类型不同。 引用类型有三种:类类型、接口类型和数组类型。它们的值是对动态创建的类实例,数组或接口实现类实例的引用。引用值也可以是特殊的null引用,它不引用对象。null引用初始没有运行期类型,但是可以转换成任何类型。

Java虚拟机规范定义了每一种数据类型的取值范围,如表12-1。但是规范没有定义它们的位宽,存储这些类型的值所需的占位宽度,由具体的虚拟机实现的设计者决定。

表12-1 Java虚拟机数据类型的取值范围 类型 范围 Byte 8比特,带符号,二进制补码 Short 16比特,带符号,二进制补码 Int 32比特,带符号,二进制补码 Long 64比特,带符号,二进制补码 Char 16比特,不带符号,Unicode字符 Float 32比特,IEEE754标准单精度浮点数 Double 64比特,IEEE754标准单精度浮点数 ReturnAddress 同一方法中某操作码的地址 Reference 堆中对某对象的引用,或者是null

Java虚拟机中,最基本的数据单元就是字(word),它的大小是由每个虚拟机实现的设计者来决定的。字长必须足够大,一个字长至少应足以存储byte、short、int、char、float、returnAddress或者reference类型的值,而两个字长应足以存储long或者double类型的值。因此,虚拟机实现的设计者至少得选择32位作为字长,或者选择更为高效的字长大小。通常字长根据底层主机平台的指针长度来选择。

Java虚拟机规范中,关于运行时数据区的大部分内容,都是基于“字”这个抽象概念的。比如,关于栈帧的两个部分——局部变量和操作数栈——都是按照“字”来定义的。这个内容区域能够容纳任何虚拟机数据类型的值,当把这些值放到局部变量或者操作数栈中时,它将占用一个或两个字单元。

12.4Java虚拟机指令系统 Java虚拟机与普通的计算机一样具有一套完整的指令系统,每条指令执行一种基本的CPU运算。每一个指令一般由一个字节的操作码(Opcode)和零个或多个操作数(Operands)组成。操作码指明做什么,操作数提供操作所需的参数或数据。操作数的个数由操作码决定,当然也有些指令没有操作数,仅由一个单字节的操作码构成。如果一个操作数的大小大于一个字节,则按照big-endian顺序存储——高位字节在前。例如,一个16位的无符号操作数被作为2个无符号字节byte1和byte2存储,这样它的值是:

(byte1<<8)|byte2 每一条Java虚拟机指令均有一个助记符,Java虚拟机的指令助记符集合就犹如Java虚拟专家导学Java 面向对象编程  4 机的汇编语言。Java 类中的方法编译成字节码流后转换为一组Java虚拟机指令序列。 【例12.1】 1. package chapter12; 2. public class OperandStack 3. { 4. public static void main(String[] args) 5. { 6. int rs = add (100 , 98); 7. } 8. public static int add(int op1,int op2) 9. { 10. int rs = op1 + op2; 11. return rs; 12. } 13. }

将【12.1】编译成字节码文件后,通过“javap -c operandstack”命令反汇编,可得到如下OperandStack类的Java虚拟机指令助记符程序: 1. Compiled from "OperandStack.java" 2. public class chapter12.OperandStack extends java.lang.Object 3. { 4. public chapter12.OperandStack(); 5. Code: 6. 0: aload_0 7. 1: invokespecial #8; //Method java/lang/Object."":()V 8. 4: return 9. 10. public static void main(java.lang.String[]); 11. Code: 12. 0: bipush 100 13. 2: bipush 98 14. 4: invokestatic #16; //Method add:(II)I 15. 7: istore_1 16. 15: return 17. 18. public static int add(int, int); 19. Code: 20. 0: iload_0 21. 1: iload_1 22. 2: iadd 23. 3: istore_2 24. 4: iload_2 25. 5: ireturn 26. }

其中4到8行是默认构造函数的助记符程序,10到16行是main方法的助记符程序,18到25行是add方法的助记符程序。 Java虚拟机指令集中的绝大多数指令根据操作数的类型进行编码,例如,iload指令把一个int型局部变量的内容装载到操作数栈,fload指令对一个float型局部变量做同样的事,这两个指令可以具有相同的实现,但具有不同的操作码。对大多数有类型的指令,指令类型由操作码助记符前第一个字母显式地表示,如i指对int型操作,l指对long型操作,s指对short型操作,b指对byte型操作,c指对char型操作,f指对float型操作,d 指对double型操作,a指对reference型操作。当然有些指令不能操作在有类型地操作数上,例如goto指令,无条件控制转移指令等。 Java虚拟机指令可分为10类,装载和存储指令、运算指令、类型转换指令、对象创建和操纵指令、控制转移指令、方法调用返回指令、抛出和异常处理指令、finally实现指令、同步

相关文档
最新文档