资源预览内容
第1页 / 共40页
第2页 / 共40页
第3页 / 共40页
第4页 / 共40页
第5页 / 共40页
第6页 / 共40页
第7页 / 共40页
第8页 / 共40页
第9页 / 共40页
第10页 / 共40页
亲,该文档总共40页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
Lesson7JAVA 面向对象编程主要内容主要内容主要内容n n包n n类的说明符n n方法的说明符n n对象的销毁(垃圾内存回收的演示)n n接口n n内部类和匿名内部类n n异常处理包(包(package)n n为了便于管理大型软件系统中数目众多的类,解决类命名为了便于管理大型软件系统中数目众多的类,解决类命名冲突的问题冲突的问题,JavaJava引入了包(引入了包(packagepackage)。)。包(包(package)n npackage语句必须是文件中的第一条语句。也就是说,在package语句之前,除了空白和注释之外不能有任何语句。n n如果不加package语句,则指定为缺省包或无名包。n n包对应着文件系统的目录层次结构。n n在package语句中,用“.”来指明包(目录)的层次。编译并生成包编译并生成包n n在当前目录下生成包 javac d . Test.javan n在指定目录下生成包 javac d E:JavaLesson Test.javaimport语句语句n n引入包中的类。 import java.io.File;n n引入整个包。 import java.io.*;n n在同一包中的类可以互相引用,无需import语句。类的说明符类的说明符n n类的访问说明符 (1)public (2)default(不加访问说明符时)n n类的其它修饰符 (1)final (2)abstract方法的说明符方法的说明符n n方法的访问说明符方法的访问说明符 (1 1)publicpublic (2 2)protectedprotected (3 3)default(default(不加访问说明符时不加访问说明符时) ) (4 4)privateprivaten n方法的其它修饰符方法的其它修饰符 (1 1)staticstatic (2 2)finalfinal (3 3)abstractabstract (4 4)nativenative (5 5)synchronizedsynchronized方法的访问控制方法的访问控制publicpublicprotectedprotecteddefaultdefaultprivateprivate同类同类同包同包子类子类通用性通用性不同情形下访问说访问说明符明符方法的访问控制方法的访问控制publicpublicprotectedprotecteddefaultdefaultprivateprivate同类同类同包同包子类子类通用性通用性不同情形下访问说访问说明符明符方法的访问控制方法的访问控制publicpublicprotectedprotecteddefaultdefaultprivateprivate同类同类同包同包子类子类通用性通用性不同情形下访问说访问说明符明符方法的访问控制方法的访问控制publicpublicprotectedprotecteddefaultdefaultprivateprivate同类同类同包同包子类子类通用性通用性不同情形下访问说访问说明符明符方法的访问控制方法的访问控制publicpublicprotectedprotecteddefaultdefaultprivateprivate同类同类同包同包子类子类通用性通用性不同情形下访问说访问说明符明符final方法方法n n为了确保某个函数的行为在继承过程中保持不变,为了确保某个函数的行为在继承过程中保持不变,并且不能被覆盖(并且不能被覆盖(overriddenoverridden),),可以使用可以使用finalfinal方方法。法。n n为了效率上的考虑,将方法声明为为了效率上的考虑,将方法声明为finalfinal,让编译器让编译器对此方法的调用进行优化。要注意的是:编译器对此方法的调用进行优化。要注意的是:编译器会自行对会自行对finalfinal方法进行判断,并决定是否进行优方法进行判断,并决定是否进行优化。通常在方法的体积很小,而我们确实不希望化。通常在方法的体积很小,而我们确实不希望它被覆盖时,才将它声明为它被覆盖时,才将它声明为finalfinal。n nclassclass中所有的中所有的privateprivate和和staticstatic方法自然就是方法自然就是finalfinal。抽象方法和抽象类抽象方法和抽象类n n在类中在类中没有方法体的方法,就是抽象方法。没有方法体的方法,就是抽象方法。n n含有抽象方法的类,即为抽象类。含有抽象方法的类,即为抽象类。n n如果一个子类没有实现抽象基类中所有的抽象方如果一个子类没有实现抽象基类中所有的抽象方法,则子类也成为一个抽象类。法,则子类也成为一个抽象类。n n我们可以将一个没有任何抽象方法的类声明为我们可以将一个没有任何抽象方法的类声明为abstractabstract,避免由这个类产生任何的对象。避免由这个类产生任何的对象。n n构造方法、静态方法、私有方法、构造方法、静态方法、私有方法、finalfinal方法不能被方法不能被声明为抽象的方法。声明为抽象的方法。native方法方法n nnativenative方法是用户在方法是用户在JavaJava中可以使用,但不能编写的方中可以使用,但不能编写的方法。法。n nJNI(Java Native Interface)JNI(Java Native Interface),它允许它允许JavaJava虚拟机虚拟机(JVM)(JVM)内部内部运行的运行的JavaJava代码能够与用其它编程语言代码能够与用其它编程语言( (如如C C、C+C+、汇编语言汇编语言) )编写的应用程序和库进行互操作。编写的应用程序和库进行互操作。n nJNIJNI最大的好处是它没有对底层最大的好处是它没有对底层JavaJava虚拟机的实现施加虚拟机的实现施加任何限制,因此,任何限制,因此,JavaJava虚拟机厂商可以在不影响虚拟虚拟机厂商可以在不影响虚拟机其它部分的情况下添加对机其它部分的情况下添加对JNIJNI的支持。程序员只需的支持。程序员只需编写一种版本的本地编写一种版本的本地(Native)(Native)应用程序和库,就能够应用程序和库,就能够与所有支持与所有支持JNIJNI的的JavaJava虚拟机协同工作。虚拟机协同工作。n nJNIJNI可以理解为可以理解为JavaJava和本地应用程序之间的中介。和本地应用程序之间的中介。接口接口n n接口中所有的方法都是public abstract。n n在接口中声明方法时,不能使用native、static 、final 、synchronized 、private 、protected等修饰符。n n和public类一样,public接口也必须定义在与接口同名的文件中。接口接口n n接口中可以有数据成员,这些成员默认都是public static final。Math.javainterface Mathdouble PI=3.1415926;class Arithmetic implements Mathdouble roundArea(double radius)return PI*radius*radius;class Studentpublic static void main(String args)Arithmetic a=new Arithmetic();System.out.println(a.roundArea(3);System.out.println(Math.PI);/okSystem.out.println(Arithmetic.PI);/okSystem.out.println(a.PI);/ok接口接口n n一个接口可以继承自另一个接口。n nJava中不允许类的多继承,但允许接口的多继承。Sofa.javainterface Sittablevoid sit();interface Lievoid sleep();interface Chair extends Sittableinterface Sofa extends Sittable, Lie接口接口n n在Java中,一个类可以实现多个接口。n n一个类在继承另外一个类的同时,可以实现多个接口。Sofa.java/实现多个接口interface Sittablevoid sit();interface Lievoid sleep();class Sofa implements Sittable, Liepublic void sit()public void sleep()Sofa.java/在继承类的同时,实现多个接口interface Sittablevoid sit();interface Lievoid sleep();interface HealthCarevoid massage();class Chair implements Sittablepublic void sit();class Sofa extends Chair implements Lie, HealthCarepublic void sleep();public void massage();内内部类部类n n在一个类中定义另外一个类,这个类就叫做内部类或在一个类中定义另外一个类,这个类就叫做内部类或内置类内置类 (inner class) (inner class) 。n n内部类可以让我们将逻辑上相关的一组类组织起来,内部类可以让我们将逻辑上相关的一组类组织起来,并由外部类并由外部类(outer class)(outer class)来控制内部类的可见性。来控制内部类的可见性。n n当我们建立一个当我们建立一个inner classinner class时,其对象就拥有了与外部时,其对象就拥有了与外部类对象之间的一种关系,这是通过一个特殊的类对象之间的一种关系,这是通过一个特殊的this this referencereference形成的,使得内部类对象可以随意的访问外形成的,使得内部类对象可以随意的访问外部类中所有的成员。部类中所有的成员。内部类的主要主题内部类的主要主题n n内部类和外部类对象的引用关系内部类和外部类对象的引用关系n n内部类的访问权限内部类的访问权限n n局部内部类局部内部类n n静态内部类静态内部类n n继承父类的内部类继承父类的内部类n n实现接口的内部类实现接口的内部类n n匿名内部类匿名内部类n n继承父类的匿名内部类继承父类的匿名内部类n n实现接口的匿名内部类实现接口的匿名内部类class Outerprivate int index=100;void print() Inner i=new Inner();i.print();class Innervoid print()System.out.println(index);class Testpublic static void main(String args)Outer o=new Outer();o.print();othisimaino.printi.printthis栈内存堆内存Outer类对象Inner类对象Outer.this内部类内部类n n在方法中定义的内部类,如果要访问方法中定义的本在方法中定义的内部类,如果要访问方法中定义的本地变量或方法的参数,则变量必须被声明地变量或方法的参数,则变量必须被声明finalfinal。n n内部类可以声明为内部类可以声明为privateprivate或或protectedprotected;还可以声明为还可以声明为abstractabstract或或finalfinal。n n内部类内部类可以声明为可以声明为staticstatic的,但此时就不能再使用外部的,但此时就不能再使用外部类的非类的非staticstatic的成员变量和非的成员变量和非staticstatic的成员方法;的成员方法;n n非非staticstatic的的内部类内部类中的成员不能声明为中的成员不能声明为staticstatic的,只有的,只有在顶层类或在顶层类或staticstatic的内部类中才可声明的内部类中才可声明staticstatic成员。成员。内部类内部类n n我们为什么使用内部类1、在内部类(inner class)中,可以随意的访问外部类的成员,这可以让我们更好地组织管理我们的代码,增强代码的可读性。2、内部类可以用于创建适配器类,适配器类是用于实现接口的类。使用内部类来实现接口,可以更好地定位与接口关联的方法在代码中的位置。3、内部类的更多用法。异常类的层次结构异常类的层次结构异常处理异常处理n n打开一个不存在的文件、网络连接中断、数组下标越界、正在加载的类文件丢失等都会引发异常。n nJava中的异常类定义了程序中遇到的轻微的错误条件。n nJava中的错误类定义了程序中不能恢复的严重错误条件。如内存溢出、类文件格式错误等。这一类错误由Java运行系统处理,不需要我们去处理。异常处理异常处理n nJavaJava程序在执行过程中如出现异常,会自动生成一程序在执行过程中如出现异常,会自动生成一个异常类对象,该异常对象将被提交给个异常类对象,该异常对象将被提交给JavaJava运行时运行时系统,这个过程称为抛出系统,这个过程称为抛出(throw)(throw)异常。异常。n n当当JavaJava运行时系统接收到异常对象时,会寻找能处运行时系统接收到异常对象时,会寻找能处理这一异常的代码并把当前异常对象交给其处理,理这一异常的代码并把当前异常对象交给其处理,这一过程称为捕获这一过程称为捕获(catch)(catch)异常。异常。n n如果如果JavaJava运行时系统找不到可以捕获异常的方法,运行时系统找不到可以捕获异常的方法,则运行时系统将终止,相应的则运行时系统将终止,相应的JavaJava程序也将退出。程序也将退出。n ntry/catch/finallytry/catch/finally语句。语句。异常处理异常处理n n对于对于RuntimeExceptionRuntimeException,通常不需要我们去捕获,通常不需要我们去捕获,这类异常由这类异常由JavaJava运行系统自动抛出并自动处理。运行系统自动抛出并自动处理。n n如果父类中的方法抛出多个异常,则子类中的覆如果父类中的方法抛出多个异常,则子类中的覆盖方法要么抛出相同的异常,要么抛出异常的子盖方法要么抛出相同的异常,要么抛出异常的子类,但不能抛出新的异常(注:构造方法除外)。类,但不能抛出新的异常(注:构造方法除外)。n n我们可以在方法声明时,声明一个不会抛出的异我们可以在方法声明时,声明一个不会抛出的异常,常,JavaJava编译器就会强迫方法的使用者对异常进行编译器就会强迫方法的使用者对异常进行处理。这种方式通常应用于处理。这种方式通常应用于abstract base classabstract base class和和interfaceinterface中。中。Java编程规范编程规范n npackagepackage的命名的命名 package package 的名字由全部小写的字母组成,例如:的名字由全部小写的字母组成,例如:cn.mybolecn.mybole。n nclassclass和和interfaceinterface的命名的命名 classclass和和interfaceinterface的名字由大写字母开头而其他字母都小写的单词组成,例如:的名字由大写字母开头而其他字母都小写的单词组成,例如:PersonPerson,RuntimeExceptionRuntimeException。n nc classlass变量的命名变量的命名 变量的名字用一个小写字母开头,后面的单词用大写字母开头变量的名字用一个小写字母开头,后面的单词用大写字母开头, ,例如:例如:indexindex,currentImagecurrentImage。 n nclassclass方法的命名方法的命名 方法的名字用一个小写字母开头,后面的单词用大写字母开头方法的名字用一个小写字母开头,后面的单词用大写字母开头, ,例如:例如:run()run(),getBalancegetBalance()()。n ns static tatic f finalinal变量的命名变量的命名 s static tatic f finalinal变量的名字所有字母都大写,并且能表示完整含义。例如:变量的名字所有字母都大写,并且能表示完整含义。例如:PIPI,PASSWORDPASSWORD。n n参数的命名参数的命名 参数的名字和变量的命名规范一致。参数的名字和变量的命名规范一致。n n数组的命名数组的命名 数组应该总是用这样的方式来命名:数组应该总是用这样的方式来命名:byte bufferbyte buffer。附:附:JVM 规格描述规格描述n n JVM定义了控制Java代码解释执行和具体实现的五种规格n nJVM指令系统n nJVM寄存器n nJVM栈结构n nJVM碎片回收堆n nJVM存储区附:附:JVM 规格描述规格描述n nJVM指令系统 JVMJVM指令系统同其他计算机的指令系统极其相似。指令系统同其他计算机的指令系统极其相似。JavaJava指令也是由指令也是由操作码和操作数两部分组成。操作码为操作码和操作数两部分组成。操作码为8 8位二进制数,操作数紧随在位二进制数,操作数紧随在操作码的后面,其长度根据需要而不同。操作码用于指定一条指令操操作码的后面,其长度根据需要而不同。操作码用于指定一条指令操作的性质(在这里我们采用汇编符号的形式进行说明),如作的性质(在这里我们采用汇编符号的形式进行说明),如iloadiload表示表示从存储器中装入一个整数,从存储器中装入一个整数,anewarrayanewarray表示为一个新数组分配空间,表示为一个新数组分配空间,iandiand表示两个整数的表示两个整数的“ “与与” ”,retret用于流程控制,表示从对某一方法的用于流程控制,表示从对某一方法的调用中返回。当长度大于调用中返回。当长度大于8 8位时,操作数被分为两个以上字节存放。位时,操作数被分为两个以上字节存放。JVMJVM采用了采用了“ “big big endianendian” ”的编码方式来处理这种情况,即高位的编码方式来处理这种情况,即高位bitsbits存放存放在低字节中。这同在低字节中。这同 MotorolaMotorola及其他的及其他的RISC CPURISC CPU采用的编码方式是一致采用的编码方式是一致的,而与的,而与IntelIntel采用的采用的“ “little little endianendian ” ”的编码方式即低位的编码方式即低位bitsbits存放在低存放在低位字节的方法不同。位字节的方法不同。 JavaJava指令系统是以指令系统是以JavaJava语言的实现为目的设计的,其中包含了用于语言的实现为目的设计的,其中包含了用于调用方法和监视多线程系统的指令。调用方法和监视多线程系统的指令。附:附:JVM 规格描述规格描述n nJVM寄存器 所有的所有的CPUCPU均包含用于保存系统状态和处理器所需信息的寄存器均包含用于保存系统状态和处理器所需信息的寄存器组。如果虚拟机定义较多的寄存器,便可以从中得到更多的信息而不组。如果虚拟机定义较多的寄存器,便可以从中得到更多的信息而不必对栈或内存进行访问,这有利于提高运行速度。然而,如果虚拟机必对栈或内存进行访问,这有利于提高运行速度。然而,如果虚拟机中的寄存器比实际中的寄存器比实际CPUCPU的寄存器多,在实现虚拟机时就会占用处理器的寄存器多,在实现虚拟机时就会占用处理器大量的时间来用常规存储器模拟寄存器,这反而会降低虚拟机的效率。大量的时间来用常规存储器模拟寄存器,这反而会降低虚拟机的效率。针对这种情况,针对这种情况,JVMJVM只设置了只设置了4 4个最为常用的寄存器。它们是:个最为常用的寄存器。它们是: pcpc程序计数器程序计数器 optopoptop操作数栈顶指针操作数栈顶指针 frameframe当前执行环境指针当前执行环境指针 varsvars指向当前执行环境中第一个局部变量的指针指向当前执行环境中第一个局部变量的指针 所有寄存器均为所有寄存器均为3232位。位。pcpc用于记录程序的执行。用于记录程序的执行。optopoptop,frameframe和和varsvars用于记录指向用于记录指向JavaJava栈区的指针。栈区的指针。附:附:JVM 规格描述规格描述n nJVM栈结构 作为基于栈结构的计算机,作为基于栈结构的计算机,JavaJava栈是栈是JVMJVM存储信息的主要方法。当存储信息的主要方法。当JVMJVM得到一个得到一个JavaJava字节码应用程序后,便为该代码中一个类的每一个字节码应用程序后,便为该代码中一个类的每一个方法创建一个栈框架,以保存该方法的状态信息。每个栈框架包括以方法创建一个栈框架,以保存该方法的状态信息。每个栈框架包括以下三类信息:下三类信息: 局部变量局部变量 执行环境执行环境 操作数栈操作数栈局部变量用于存储一个类的方法中所用到的局部变量。局部变量用于存储一个类的方法中所用到的局部变量。varsvars寄存器指寄存器指向该变量表中的第一个局部变量。向该变量表中的第一个局部变量。 执行环境用于保存解释器对执行环境用于保存解释器对JavaJava字节码进行解释过程中所需的信字节码进行解释过程中所需的信息。它们是:上次调用的方法、局部变量指针和操作数栈的栈顶和栈息。它们是:上次调用的方法、局部变量指针和操作数栈的栈顶和栈底指针。执行环境是执行一个方法的控制中心。例如:如果解释器要底指针。执行环境是执行一个方法的控制中心。例如:如果解释器要执行执行iaddiadd( (整数加法整数加法) ),首先要从,首先要从frameframe寄存器中找到当前执行环境,而寄存器中找到当前执行环境,而后便从执行环境中找到操作数栈,从栈顶弹出两个整数进行加法运算,后便从执行环境中找到操作数栈,从栈顶弹出两个整数进行加法运算,最后将结果压入栈顶。最后将结果压入栈顶。 操作数栈用于存储运算所需操作数及运算的结果。操作数栈用于存储运算所需操作数及运算的结果。 附:附:JVM 规格描述规格描述n nJVMJVM碎片回收堆碎片回收堆 JavaJava类的实例(对象)所需的存储空间是在堆上分配的。类的实例(对象)所需的存储空间是在堆上分配的。解释器具体承担为类实例分配空间的工作。解释器在为一解释器具体承担为类实例分配空间的工作。解释器在为一个实例分配完存储空间后,便开始记录对该实例所占用的个实例分配完存储空间后,便开始记录对该实例所占用的内存区域的使用。一旦对象使用完毕,便将其回收到堆中。内存区域的使用。一旦对象使用完毕,便将其回收到堆中。 在在JavaJava语言中,除了语言中,除了newnew语句外没有其他方法为一对象语句外没有其他方法为一对象申请和释放内存。对内存进行释放和回收的工作是由申请和释放内存。对内存进行释放和回收的工作是由JavaJava运行系统承担的。这允许运行系统承担的。这允许JavaJava运行系统的设计者自己决定运行系统的设计者自己决定碎片回收的方法。在碎片回收的方法。在SUNSUN公司开发的公司开发的JavaJava解释器和解释器和Hot JavaHot Java环境中,碎片回收用后台线程的方式来执行。这不但为运环境中,碎片回收用后台线程的方式来执行。这不但为运行系统提供了良好的性能,而且使程序设计人员摆脱了自行系统提供了良好的性能,而且使程序设计人员摆脱了自己控制内存使用的风险。己控制内存使用的风险。 附:附:JVM 规格描述规格描述n nJVM存储区 JVM有两类存储区:常量缓冲池和方法区。常量缓冲池用于存储类名称、方法和字段名称以及串常量。方法区则用于存储Java方法的字节码。对于这两种存储区域具体实现方式在JVM规格中没有明确规定。这使得Java应用程序的存储布局必须在运行过程中确定,依赖于具体平台的实现方式。
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号