Java源文件(*.java)Java编辑器字节码文件(*.calss)Java解释器运行Java运行机制Java程序运行机制及运行过程源程序(*.java文件)字节码(*.class文件)Java编译器类装载器ClassLoader字节码校验器byteverifier解释器interpretor系统平台核心机制之Java虚拟机•Java虚拟机可以理解成一个以字节码为机器指令的CPU。•对于不同的运行平台,有不同的虚拟机。•Java虚拟机机制屏蔽了底层运行平台的差别,实现了“一次编译,随处运行”。UNIXJVMforUNIXWindowsJVMforWindowsOtherPlatformJVMforOther*.java*.class编译执行核心机制之垃圾收集•garbagecollector•不再使用的内存空间应回收-垃圾收集。•在C/C++等语言中,由程序员负责回收无用内存。•Java语言消除了程序员回收无用内存空间的责任;它提供一种系统级线程跟踪存储空间的分配情况。并在JVM的空闲时,检查并释放那些可被释放的存储器空间。•垃圾收集在Java程序运行过程中自动进行,程序员无法精确控制和干预。提示:程序执行过程硬盘程序内存代码操作系统代码1:Load到内存区2:找到main方法开始执行heapstackdatasegmentcodesegment3:执行过程中的内存管理存放代码静态变量字符串常量局部变量new出来的东西Java数据类型的划分数据类型基本数据类型引用数据类型数值型字符型(char)布尔型(boolean)整数类型(byte,short,int,long)浮点类型(float,double)类(class)接口(interface)数组运算符•Java语言支持如下运算符:–算术运算符:+,-,*,/,%,++,--–关系运算符:,,=,=,==,!=–逻辑运算符:!,&,|,^,&&,||–位运算符:&,|,^,~,,,–赋值运算符:=–扩展赋值运算符:+=,-=,*=,/=–字符串连接运算符:+程序控制判断控制跳转控制循环控制whileDo-whileforifswitchbreakcontinuereturn递归调用递归调用指在方法执行过程中出现该方法本身的调用例如:求Fibonacci数列:1,1,2,3,5,8,…第40个数的值。数列满足递推公式:F1=1,F2=1Fn=Fn–1+Fn–2(n2)publicclassTest{publicstaticvoidmain(Stringarg[]){System.out.println(f(5));}publicstaticintf(intn){if(n==1||n==2){return1;}else{returnf(n-1)+f(n-2);}}}课堂练习试用非递归调用的方法解决上面Fibonacci数列问题Fab.java面向对象编程语言三大特征•隐藏/封装•继承•多态对象和类的概念•对象用计算机语言对问题域中事物的描述,对象通过“属性(attribute)”和“方法(method)”来分别对应事物所具有的静态属性和动态属性。•类是用于描述同一类形的对象的一个抽象的概念,类中定义了这一类对象所应具有的静态和动态属性。•类可以看成一类对象的模板,对象可以看成该类的一个具体实例。职员A类对象实例化抽象类(对象)之间的关系之关联关系继承关系(一般和特殊)XX是一种XX聚合关系(整体和部分)聚集组合实现关系为什么用对象?•面向对象的编程—一组对象互相配合通过沟通完成特定功能–所有的paradigm都是对现实问题的抽象•汇编是对机器语言的抽象•面向过程的语言是对汇编的抽象•对象更加符合对于现实问题的抽象•对象都有对外服务的接口–通过继承可以复用•对象隐藏内部服务的实现–通过聚合可以复用•面向对象更加容易使我们达到这些年来苦苦追求的境界–Reusability、Extensibility、Maintainablity维护和替换更加方便、...•组件—比对象更高的层次上的抽象(二进制级别)–EJB、WebService、CORBA、COM、...Java类的定义,成员变量的声明,方法的声明//用class关键字定义一个类,例如:classPerson{//成员变量定义privateintid;privateintage=20;//方法定义publicintgetAge(){returnage;}publicvoidsetAge(inti){age=i;}publicintgetId(){returnid;}}类的定义主要由两方面组成成员变量和方法。声明成员变量的格式为:[modifiers]typeattr_name[=defaultValue];例如:privateintid;privateintage=20;声明方法的格式为:[modifiers]modifiersreturn_typename([argu_list]){[statements]}例如:publicintgetAge(){returnage;}如何在内存中区分类和对象?类是静态的概念,代码区对象是new出来的,位于堆内存,类的每个成员变量在不同的对象中都有不同的值(除了静态变量)而方法只有一份,执行的时候才占用内存。对象的创建和使用•必须使用new关键字创建对象。–Personperson=newPerson();•使用对象(引用).成员变量来引用对象的成员变量。–person.age•使用对象(引用).方法(参数列表)来调用对象的方法。–person.setAge(23)•同一类的每个对象有不同的成员变量存储空间。•同一类的每个对象共享该类的方法。//运行如下程序publicclassTest{publicstaticvoidmain(Stringargs[]){Personp=newPerson(1,20);p.info();p.info(hello);}}方法的重载方法的重载是指一个类中可以定义有相同的名字,但参数不同的多个方法。调用时,会根据不同的参数表选择对应的方法。例如:在Person类中添加如下方法:voidinfo(){System.out.println(Myidis+id);}voidinfo(Stringt){System.out.println(t++id++age);}TestOverload2.javaTestOverload1.java构造方法的重载与普通方法一样,构造方法也可以重载:例如:修改Person类的构造方法为:Person(){id=0;age=20;}Person(inti){id=0;age=i;}Person(intn,inti){id=n;age=i;课堂练习利用修改过后的Person类;编写程序,分别用三种构造方法创建三个person对象,如下图所示堆内存10025###p3023###p2020###p1访问控制(AccessControl)•Java权限修饰符publicprotectedprivate置于类的成员定义前,用来限定其他对象对该类对象成员的访问权限。•对于class的权限修饰只可以用public和default。(innerclass除外)–public类可以在任意地方被访问–default类只可以被同一个包内部的类访问修饰符类内部同一个包子类任何地方privateYesdefault|packageYesYesprotectedYesYesYespublicYesYesYesYesTestAccess.java编写程序验证Java中的访问控制。异常的分类ThrowableerrorexceptionAWTErrorindexOutOfBoundsexceptionNullPointerExceptionClassCastExceptionRuntimeEXceptionIOexceptionSQLExceptionIOErrorLinkageErrorThreadDeath异常的捕获和处理try{//可能抛出异常的语句}catch(SomeException1e){………}catch(SomeException2e){………}finally{………}try代码段包含可能产生例外的代码。try代码段后跟有一个或多个catch代码段。每个catch代码段声明其能处理的一种特定类型的异常并提供处理的方法。当异常发生时,程序会中止当前的流程,根据获取异常的类型去执行相应的catch代码段。finally段的代码无论是否发生异常都有执行。异常的捕获和处理捕获SomeException2时:没有捕获到异常时:try{语句1;语句2;}catch(SomeException1e){………}catch(SomeException2e){………}finally{………}后面的语句;try{语句1;语句2;}catch(SomeException1e){………}catch(SomeException2e){………}finally{………}后面的语句;数组概述•数组可以看成是多个相同类型数据组合,对这些数据的统一管理。•数组变量属引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量。•数组中的元素可以是任何数据类型,包括基本类型和引用类型。容器APIJ2SDK所提供的容器API位于java.util包内。容器API的类图结构如下图所示:1图1类3知识点6接口没有顺序不可重复有顺序可以重复输入/输出流的分类java.io包中定义了多个流类型(类或抽象类)来实现输入/输出功能;可以从不同的角度对其进行分类:按数据流的方向不同可以分为输入流和输出流。(以程序的角度来考虑)按处理数据单位不同可以分为字节流和字符流。按照功能不同可以分为节点流和处理流。J2SDK所提供的所有流类型位于包java.io内都分别继承自以下四种抽象流类型。字节流字符流输入流InputStreamReader输出流OutputStreamWriterInputStream继承自InputSteam的流都是用于向程序中输入数据,且数据的单位为字节(8bit);下图中深色为节点流,浅色为处理流。OutputStream继承自OutputSteam的流是用于程序中输入数据,且数据的单位为字节(8bit);下图中深色为节点流,浅色为处理流。Reader继承自Reader的流都是用于向程序中输入数据,且数据的单位为字符(16bit);下图中深色为节点流,浅色的为处理流。Writer继承自Writer的流都是用于程序中输入数据,且数据的单位为字符(16bit);下图中深色为节点流,浅色为处理流。节点流类型类型字符流字节流File(文件)FileReaderFileWriterFileInputStreamFileOutputStreamMemoryArrayCharArrayReaderCharArrayWriterByteArrayInputStreamByteArrayOutputStreamMemoryStringStringReaderStringWriter-Pipe(管道)PipedReaderPipedWriterPipedInputStreamPipedOutputStream处理流类型处理类型字符流字节流BufferingBufferedReaderBufferedWriterBufferedInputStreamBufferedOutputStreamFilteringFilterReaderFilterWriterFilterInputStreamFilterOutputStreamConvertingbetweenbytesandcharacterInputStreamReaderOutputStreamWriterObjec