收藏 分享(赏)

java第四课.ppt

上传人:hwpkd79526 文档编号:8386641 上传时间:2019-06-23 格式:PPT 页数:38 大小:138KB
下载 相关 举报
java第四课.ppt_第1页
第1页 / 共38页
java第四课.ppt_第2页
第2页 / 共38页
java第四课.ppt_第3页
第3页 / 共38页
java第四课.ppt_第4页
第4页 / 共38页
java第四课.ppt_第5页
第5页 / 共38页
点击查看更多>>
资源描述

1、第四课,包(package),为了便于管理大型软件系统中数目众多的类,解决类命名冲突的问题,Java引入了包(package)。,包(package),package语句必须是文件中的第一条语句。也就是说,在package语句之前,除了空白和注释之外不能有任何语句。 如果不加package语句,则指定为缺省包或无名包。 包对应着文件系统的目录层次结构。 在package语句中,用“.”来指明包(目录)的层次。,编译并生成包,在当前目录下生成包javac d . Test.java 在指定目录下生成包javac d E:JavaLesson Test.java,import语句,引入包中的类。i

2、mport java.io.File; 引入整个包。import java.io.*; 在同一包中的类可以互相引用,无需import语句。,类的说明符,类的访问说明符(1)public(2)default(不加访问说明符时) 类的其它修饰符(1)final(2)abstract,方法的说明符,方法的访问说明符(1)public(2)protected(3)default(不加访问说明符时)(4)private 方法的其它修饰符(1)static(2)final(3)abstract(4)native(5)synchronized,方法的访问控制,不同 情形下,访问说明符,方法的访问控制,不同

3、情形下,访问说明符,方法的访问控制,不同 情形下,访问说明符,方法的访问控制,不同 情形下,访问说明符,方法的访问控制,不同 情形下,访问说明符,final方法,为了确保某个函数的行为在继承过程中保持不变,并且不能被覆盖(overridden),可以使用final方法。 为了效率上的考虑,将方法声明为final,让编译器对此方法的调用进行优化。要注意的是:编译器会自行对final方法进行判断,并决定是否进行优化。通常在方法的体积很小,而我们确实不希望它被覆盖时,才将它声明为final。 class中所有的private和static方法自然就是final。,抽象方法和抽象类,在类中没有方法体的

4、方法,就是抽象方法。 含有抽象方法的类,即为抽象类。 如果一个子类没有实现抽象基类中所有的抽象方法,则子类也成为一个抽象类。 我们可以将一个没有任何抽象方法的类声明为abstract,避免由这个类产生任何的对象。 构造方法、静态方法、私有方法、final方法不能被声明为抽象的方法。,native方法,native方法是用户在Java中可以使用,但不能编写的方法。 JNI(Java Native Interface),它允许Java虚拟机(JVM)内部运行的Java代码能够与用其它编程语言(如C、C+、汇编语言)编写的应用程序和库进行互操作。 JNI最大的好处是它没有对底层Java虚拟机的实现施

5、加任何限制,因此,Java虚拟机厂商可以在不影响虚拟机其它部分的情况下添加对JNI的支持。程序员只需编写一种版本的本地(Native)应用程序和库,就能够与所有支持JNI的Java虚拟机协同工作。 JNI可以理解为Java和本地应用程序之间的中介。,接口,接口中所有的方法都是public abstract。 在接口中声明方法时,不能使用native、static 、final 、synchronized 、private 、protected等修饰符。 和public类一样,public接口也必须定义在与接口同名的文件中。,接口,接口中可以有数据成员,这些成员默认都是public static

6、 final。,Math.java interface Math double PI=3.1415926; class Arithmetic implements Math double roundArea(double radius)return PI*radius*radius; class Student public static void main(String args)Arithmetic a=new Arithmetic();System.out.println(a.roundArea(3);System.out.println(Math.PI); /okSystem.out.

7、println(Arithmetic.PI); /okSystem.out.println(a.PI); /ok ,接口,一个接口可以继承自另一个接口。 Java中不允许类的多继承,但允许接口的多继承。,Sofa.java interface Sittable void sit(); interface Lie void sleep(); interface Chair extends Sittable interface Sofa extends Sittable, Lie ,接口,在Java中,一个类可以实现多个接口。 一个类在继承另外一个类的同时,可以实现多个接口。,Sofa.java

8、/实现多个接口 interface Sittable void sit(); interface Lie void sleep(); class Sofa implements Sittable, Lie public void sit()public void sleep() ,Sofa.java /在继承类的同时,实现多个接口 interface Sittable void sit(); interface Lie void sleep(); interface HealthCare void massage(); class Chair implements Sittable publi

9、c void sit(); class Sofa extends Chair implements Lie, HealthCare public void sleep();public void massage(); ,内部类,在一个类中定义另外一个类,这个类就叫做内部类或内置类 (inner class) 。 内部类可以让我们将逻辑上相关的一组类组织起来,并由外部类(outer class)来控制内部类的可见性。 当我们建立一个inner class时,其对象就拥有了与外部类对象之间的一种关系,这是通过一个特殊的this reference形成的,使得内部类对象可以随意的访问外部类中所有的成

10、员。,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(); ,o,this,i,main,o.print,i.print,this,栈内存,堆内存,Outer类对象,Inner类对象,Outer.this,内部类,在方法中定义的内部类,如果要访问方

11、法中定义的本地变量或方法的参数,则变量必须被声明final。 内部类可以声明为private或protected;还可以声明为abstract或final。 内部类可以声明为static的,但此时就不能再使用外部类的非static的成员变量和非static的成员方法; 非static的内部类中的成员不能声明为static的,只有在顶层类或static的内部类中才可声明static成员。,内部类,我们为什么使用内部类 1、在内部类(inner class)中,可以随意的访问外部类的成员,这可以让我们更好地组织管理我们的代码,增强代码的可读性。 2、内部类可以用于创建适配器类,适配器类是用于实现接

12、口的类。使用内部类来实现接口,可以更好地定位与接口关联的方法在代码中的位置。 3、内部类的更多用法。,异常类的层次结构,异常处理,打开一个不存在的文件、网络连接中断、数组下标越界、正在加载的类文件丢失等都会引发异常。 Java中的异常类定义了程序中遇到的轻微的错误条件。 Java中的错误类定义了程序中不能恢复的严重错误条件。如内存溢出、类文件格式错误等。这一类错误由Java运行系统处理,不需要我们去处理。,异常处理,Java程序在执行过程中如出现异常,会自动生成一个异常类对象,该异常对象将被提交给Java运行时系统,这个过程称为抛出(throw)异常。 当Java运行时系统接收到异常对象时,会

13、寻找能处理这一异常的代码并把当前异常对象交给其处理,这一过程称为捕获(catch)异常。 如果Java运行时系统找不到可以捕获异常的方法,则运行时系统将终止,相应的Java程序也将退出。 try/catch/finally语句。,异常处理,对于RuntimeException,通常不需要我们去捕获,这类异常由Java运行系统自动抛出并自动处理。 如果父类中的方法抛出多个异常,则子类中的覆盖方法要么抛出相同的异常,要么抛出异常的子类,但不能抛出新的异常(注:构造方法除外)。 我们可以在方法声明时,声明一个不会抛出的异常,Java编译器就会强迫方法的使用者对异常进行处理。这种方式通常应用于abst

14、ract base class和interface中。,Java编程规范,package的命名 package 的名字由全部小写的字母组成,例如:cn.mybole。 class和interface的命名 class和interface的名字由大写字母开头而其他字母都小写的单词组成,例如:Person,RuntimeException。 class变量的命名 变量的名字用一个小写字母开头,后面的单词用大写字母开头,例如:index,currentImage。 class方法的命名方法的名字用一个小写字母开头,后面的单词用大写字母开头,例如:run(),getBalance()。 static

15、final变量的命名 static final变量的名字所有字母都大写,并且能表示完整含义。例如:PI,PASSWORD。 参数的命名 参数的名字和变量的命名规范一致。 数组的命名 数组应该总是用这样的方式来命名:byte buffer。,附:JVM 规格描述,JVM定义了控制Java代码解释执行和具体实现的五种规格 JVM指令系统 JVM寄存器 JVM栈结构 JVM碎片回收堆 JVM存储区,附:JVM 规格描述,JVM指令系统JVM指令系统同其他计算机的指令系统极其相似。Java指令也是由操作码和操作数两部分组成。操作码为8位二进制数,操作数紧随在操作码的后面,其长度根据需要而不同。操作码用

16、于指定一条指令操作的性质(在这里我们采用汇编符号的形式进行说明),如iload表示从存储器中装入一个整数,anewarray表示为一个新数组分配空间,iand表示两个整数的“与”,ret用于流程控制,表示从对某一方法的调用中返回。当长度大于8位时,操作数被分为两个以上字节存放。JVM采用了“big endian”的编码方式来处理这种情况,即高位bits存放在低字节中。这同 Motorola及其他的RISC CPU采用的编码方式是一致的,而与Intel采用的“little endian ”的编码方式即低位bits存放在低位字节的方法不同。 Java指令系统是以Java语言的实现为目的设计的,其中

17、包含了用于调用方法和监视多线程系统的指令。,附:JVM 规格描述,JVM寄存器所有的CPU均包含用于保存系统状态和处理器所需信息的寄存器组。如果虚拟机定义较多的寄存器,便可以从中得到更多的信息而不必对栈或内存进行访问,这有利于提高运行速度。然而,如果虚拟机中的寄存器比实际CPU的寄存器多,在实现虚拟机时就会占用处理器大量的时间来用常规存储器模拟寄存器,这反而会降低虚拟机的效率。针对这种情况,JVM只设置了4个最为常用的寄存器。它们是: pc程序计数器 optop操作数栈顶指针 frame当前执行环境指针 vars指向当前执行环境中第一个局部变量的指针 所有寄存器均为32位。pc用于记录程序的执

18、行。optop,frame和vars用于记录指向Java栈区的指针。,附:JVM 规格描述,JVM栈结构作为基于栈结构的计算机,Java栈是JVM存储信息的主要方法。当JVM得到一个Java字节码应用程序后,便为该代码中一个类的每一个方法创建一个栈框架,以保存该方法的状态信息。每个栈框架包括以下三类信息: 局部变量 执行环境 操作数栈 局部变量用于存储一个类的方法中所用到的局部变量。vars寄存器指向该变量表中的第一个局部变量。 执行环境用于保存解释器对Java字节码进行解释过程中所需的信息。它们是:上次调用的方法、局部变量指针和操作数栈的栈顶和栈底指针。执行环境是执行一个方法的控制中心。例如

19、:如果解释器要执行iadd(整数加法),首先要从frame寄存器中找到当前执行环境,而后便从执行环境中找到操作数栈,从栈顶弹出两个整数进行加法运算,最后将结果压入栈顶。 操作数栈用于存储运算所需操作数及运算的结果。,附:JVM 规格描述,JVM碎片回收堆Java类的实例(对象)所需的存储空间是在堆上分配的。解释器具体承担为类实例分配空间的工作。解释器在为一个实例分配完存储空间后,便开始记录对该实例所占用的内存区域的使用。一旦对象使用完毕,便将其回收到堆中。 在Java语言中,除了new语句外没有其他方法为一对象申请和释放内存。对内存进行释放和回收的工作是由Java运行系统承担的。这允许Java运行系统的设计者自己决定碎片回收的方法。在SUN公司开发的Java解释器和Hot Java环境中,碎片回收用后台线程的方式来执行。这不但为运行系统提供了良好的性能,而且使程序设计人员摆脱了自己控制内存使用的风险。,附:JVM 规格描述,JVM存储区JVM有两类存储区:常量缓冲池和方法区。常量缓冲池用于存储类名称、方法和字段名称以及串常量。方法区则用于存储Java方法的字节码。对于这两种存储区域具体实现方式在JVM规格中没有明确规定。这使得Java应用程序的存储布局必须在运行过程中确定,依赖于具体平台的实现方式。,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报