第12章 Java虚拟机
- 格式:doc
- 大小:1.16 MB
- 文档页数:28
第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类型的变量。
面试题目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第三章《面向对象编程基础》补充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方法)。
第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实现指令、同步