3 第三讲 虚拟机与包

上传人:油条 文档编号:27086748 上传时间:2018-01-07 格式:PPTX 页数:59 大小:975.76KB
返回 下载 相关 举报
3 第三讲 虚拟机与包_第1页
第1页 / 共59页
3 第三讲 虚拟机与包_第2页
第2页 / 共59页
3 第三讲 虚拟机与包_第3页
第3页 / 共59页
3 第三讲 虚拟机与包_第4页
第4页 / 共59页
3 第三讲 虚拟机与包_第5页
第5页 / 共59页
点击查看更多>>
资源描述

《3 第三讲 虚拟机与包》由会员分享,可在线阅读,更多相关《3 第三讲 虚拟机与包(59页珍藏版)》请在金锄头文库上搜索。

1、兰明敬 ,Java程序设计,上一讲回顾,作业讲评,任务目标:学习层次化、模块化的面向对象设计;培养良好的编程习惯优点:大多数组都在尝试使用三层结构设计程序;大多数组都注意到代码风格问题;不足:大部分小组没能掌握三层结构的实质,各层次模块功能划分不合理;很多代码明显延续C语言编程习惯,出现不合理的参数传递等现象;没能明确人员功能,组长的作用没有体现,作业讲评,较好的组:2:结构合适、工作细致、风格良好7:结构合适、功能分布较合理,作业讲评,较差的组:1、16组:未按要求设计,仍采用单类结构15组:结构混乱,代码风格差,类与对象(二),第三讲,内容,专题目标,任务,作业3:改造作业2,使用包结构重

2、新组织程序。要求:严格按照课堂讲述的结构设计程序使用严格、良好的代码风格尽可能细化代码功能合理使用类成员权限以及静态变量,3.1 Java虚拟机,3.1 Java虚拟机,解释器,主机操作系统,虚拟机,编译器,Java文件,class文件,3.1 Java虚拟机,Java虚拟机是一个程序java.exe,这个程序能够装载class文件并且将其执行,类装载器,执行引擎,Class文件,字节码,主机操作系统,Java虚拟机,3.1 Java虚拟机,类装载子系统,运行时数据区,方法区,堆,Java栈,PC寄存器,本地方法栈,执行引擎,本地方法库,本地方法接口,class,Java,类型,3.1.1 类

3、的装载,3.1.1 类的装载,当第一次遇到一个类时,Java虚拟机通过装载、连接和初始化三个步骤将一个类文件读入虚拟机,连接,3.1.1 类的装载,装载时机:当第一次看见某个类时;装载方法:根据类全名查找类文件连接分为三个阶段验证:检查类文件的合法性准备:为类变量分配内存,设置默认初始值。解析:在类型的常量池中寻找类、接口、字段和方法的符号引用,将其替换成直接引用。初始化:执行cinit方法,为类变量赋予正确的初始值。,例子:类文件、cint,3.1.1 类的装载,描述信息类描述数据描述:常量、字段方法描述:方法定义、方法字节码空间:类变量指针:到ClassLoader、Class类的引用,类

4、描述,数据描述,方法描述,指令字节码,类变量,引用,3.1.1 类的装载,方法区,类型A,类型B,类型D,类型C,类型D,3.1.1 类的装载,引用,public class Adder,常量(各种描述信息):public static int mya;public int myb;,方法:cinit、init、add,public class Adderpublic static int mya = 21;public int myb = 22;private int myc;public Adder()myc = 23;public int add()int myd = 24;int re

5、sult = mya + myb + myc + myd;return result;,mya,3.1.2 对象实例化,3.1.2 对象实例化,栈:存放方法执行时所需的各类临时变量参数局部变量其他临时变量Java虚拟机是没有寄存器的,所有的执行过程都是在栈中进行的,3.1.2 对象实例化,3.1.2 对象实例化,堆:存放Java运行时创建的所有实例及数组对象:包含所属类及所有超类声明的实例变量以及到类数据的引用,方法区,类型,堆,对象,非静态变量,非静态变量,引用,3.1.2 对象实例化,public class Adderpublic static int mya = 21;public i

6、nt myb = 22;private int myc;public Adder()myc = 23;,0 aload_0 1 invokespecial #1 4 aload_0 5 bipush 22 7 putfield #2 10 aload_011 bipush 2313 putfield #3 16 return,3.1.2 对象实例化,栈,方法区,堆,对象,引用,myb,myc,adder,72,73,71,mya,74,myd,Adder adder = new Adder();adder.mya = 70;Adder.mya = 71;adder.myb = 72;int r

7、esult = adder.add();,result,0 new #2 3 dup 4 invokespecial #3 7 astore_1 8 aload_1 9 pop10 bipush 7012 putstatic #4 15 bipush 7117 putstatic #4 20 aload_121 bipush 7223 putfield #5 26 aload_127 invokevirtual #6 ,软件系统,补充内容:面向对象设计,视图层(VO)(交互界面),业务层(BO)(控制逻辑),数据访问层(BO)(数据持久化),数据仓库(文件、数据库),用户,数据传输层(DTO)

8、(数据对象:业务数据对象、辅助数据对象 ),3.2 包,3.2 包,当类多了怎么办?,Degree项目123个*.java,JDK标准库源码7212个*.java,3.2 包,当类较多的时候需要用package(包)进行组织,包相当于目录结构,并与实际的目录相对应,mywork,A,B,C,D,a,A,B,C,D,b,c,mywork,3.2.1 包的使用,使用步骤:1 根据需求设计包结构。包结构要反映系统结构,包名采用小写名词,一些常用的词汇可以用缩写。2 建好相应目录结构,采用包结构组织类,即将类按功能放入相应包目录下3 编写类时需加上所在包的声明注意:所有的目录都是相对于开发目录的所谓开

9、发目录:编译、执行的位置,36,类别,组织,项目,模块,子模块,3.2.1 包的使用,3.2.1 包的使用,colordatatransferdndeventfontgeomimimagepeerprint,3.2.1 包的使用,authenticatorconnectorcoreuserssecurityservletssessionstartuputil,3.2.1 包的使用,3.2.1 包的使用,3.2.1 包的使用,3.2.1 包的使用,package语句是源文件的第一条语句,指明该文件中类所在的包。格式为:package pkg1.pkg2;如果某个类直接放到顶层目录下,则无需使用p

10、ackage,public class Test public static void main(String args) Circle circle = new Circle( 2.1f );float circum = circle.getCircum(); System.out.println(circum+“,”+area);,3.2.2 类的访问,通过package组织后,如果两个类不在同一包中则类间必须通过全限定名相互访问:包名+类名,package lmj.edu.sms.test;public class Test public static void main(String

11、args) lmj.edu.sms.datastruct.Student student = new lmj.edu.sms.datastruct.Student();lmj.edu.sms.business.StudentManager manager = new lmj.edu.sms.business.StudentManager();/ ,3.2.2 类的访问,package lmj.edu.sms.test;import lmj.edu.sms.datastruct.Student;public class Test public static void main(String ar

12、gs) Student student = new Student( );lmj.edu.sms.business.StudentManager manager = new lmj.edu.sms.business.StudentManager();/ ,3.2.2 类的访问,package lmj.edu.sms.test;import lmj.edu.sms.datastruct.Student;import lmj.edu.sms.business.StudentManager;public class Test public static void main(String args)

13、Student student = new Student();StudentManager manager = new StudentManager();/ ,3.2.2 类的访问,import语法: import 类全名 或 包名.*;类名指明要引入的类,如果从一个包中引入多个类,可用*来表示。(*只能表示本层次的所有类,不包括子层次下的类)import lmj.edu.sms.datastruct.Student;import lmj.edu.sms.datastruct.*; (不建议使用)。注意事项1 java.lang包是编译器自动引入的,不需显式声明。2 同一包中的类之间的相互引

14、用,无需import 。,3.2.2 类的访问,JDK1.5中新增了静态导入功能。使用户可以直接使用类变量和类方法,而不必通过对象或类名。语法如下(不建议使用):import static 包名.类名.*;或import static 包名.类名.类变量名(类方法名);静态导入只能导入有包名的类的类变量和类方法。,3.2.2 类的访问,执行时的也许使用类全名java lmj.edu.sms.test.Test注意:无论是否使用包,执行位置必须是工作目录。上述情况不能进入test目录执行java Test如果不希望在工作目录下执行,则需使用-cp或-classpath,3.2.3 类路径,类路径

15、:类装载器寻找类的一系列搜索位置,搜索是基于类全名进行的。系统默认存在的类路径JDK环境自带的标准类库虚拟机执行当前目录为什么一般情况下编译、执行都必须在工作空间处进行?基于类全名的搜索+当前目录是默认类路径,3.2.3 类路径,编译时,若待编译的类所引用的类的不在当前目录下(其包顶层目录不是当前目录的子目录),则需要使用类路径参数进行编译。javac -cp d:/lib; e:/lib2 HelloWorld.javajavac -classpath d:/lib; e:/lib2 HelloWorld.java需要注意的是一旦指定了类路径则虚拟机就不在搜索当前目录,因此一般情况下需要这样:javac cp .; d:/lib; e:/lib2 HelloWorld.java,3.2.3 类路径,当待执行的类文件所引用的类不在当前目录下时,也需要设置类路径java cp .; d:/lib; e:/lib2 HelloWorldjava classpath .; d:/lib; e:/lib2 HelloWorld引用系统类库需不需要加类路径参数?,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号