第2章面向对象编程基础优秀PPT.ppt
第2章面向对象编程基础现在学习的是第1页,共134页本章要点本章要点类及对象的概念。类的定义,创建类的实例对象。类的成员定义。类及其成员的访问控制。类及其成员的修饰。类的继承。多态技术。制作用户预定义类包接口的概念和应用。异常处理现在学习的是第2页,共134页21类的定义Java是一种纯面向对象的编程语言,面向对象程序设计的基本思想是将现实世界中的事物抽象为对象,抽象出来的对象被赋给相应的状态和行为,通过对消息的响应完成一定的任务。在现实生活中,任何事物都可以被认为是对象(Object),如:汽车、电视机、时钟、人等。对象都有两个共性:(1)具有一定的状态和特性。如电视机有尺寸、外形、颜色等外部特性。(2)每个对象对应一组特定的操作。如电视机有开、关、选择频道等操作。现在学习的是第3页,共134页 面向对象程序设计方法就是把现实世界中对象的状态和操作抽象为程序设计语言中的对象,达到二者的统一。对同一种对象的所有共性进行抽象,就得到了类的概念。面向对象程序设计中的对象是由描述状态的属性和对这些属性进行维护和操作的一系列方法组成的事务处理单位,类相当于创建对象实例的模板,通过对其实例化得到同一类的不同实例。现在学习的是第4页,共134页2.1.1 类的声明 任何一个Java程序都是由一个个类组成的,编写Java程序的过程就是从现实问题中抽象出Java可实现的类并用合适的语句定义它们的过程,这个定义过程包括对类内各种变量和方法的声明和定义,创建类的对象,也包括类间各种关系和接口的声明和定义。现在学习的是第5页,共134页类声明的格式如下:public|friendlyabstractfinal class 类名 extends 父类名 implements 接口名表 变量声明;方法声明;现在学习的是第6页,共134页包含关键字class的一行称为类头,花括号内的部分称为类体。类声明使用关键词class,后跟类名,类名必须是合法的标识符,在class关键词前面可以使用修饰符。类的修饰符说明了类的属性,主要有访问控制修饰符符、抽象修饰符、最终修饰符等。public|friendly:访问控制修饰符,在类中使用的访问控制修饰符有public或friendly。访问控制修饰符不仅针对于类,类的变量、方法的访问也有该项的限制,后面会专门介绍。现在学习的是第7页,共134页abstract:抽象修饰符,声明该类不能被实例化。即抽象类不能创建类的实例。抽象类中主要包含一些静态属性和抽象方法,可以由非抽象子类继承。final:最终修饰符,声明该类不能被继承,即没有子类。class 类名:关键字class表示类声明,类名必须是合法的标识符。extends父类名:关键词extends声明该类的父类。implements 接口名表:关键词implements声明该类要实现的接口,如果实现多个接口,则各接口之间用逗号分隔。现在学习的是第8页,共134页例2-1:类声明。/程序名:Sample2_1.javaclass PrimitiveDefault /类声明boolean bl;/成员变量声明char ch;byte b;short sh;int i;long l;float f;double d;public class Sample2_1 /类声明public static void main(String args)/应用程序中的 main()方法现在学习的是第9页,共134页PrimitiveDefault pd;/声明对象pdpd=new PrimitiveDefault();/为对象pd分配内存,使用new和类中的构造方法System.out.println(“boolean型变量的缺省值:”+pd.bl);System.out.println(“char型变量的缺省值:”+pd.ch);System.out.println(“byte型变量的缺省值:”+pd.b);System.out.println(“short型变量的缺省值:”+pd.sh);System.out.println(“int型变量的缺省值:”+pd.i);System.out.println(“long型变量的缺省值:”+pd.l);System.out.println(“float型变量的缺省值:”+pd.f);System.out.println(“double型变量的缺省值:”+pd.d);现在学习的是第10页,共134页运行结果如下:boolean型变量的缺省值:falsechar型变量的缺省值:byte型变量的缺省值:0short型变量的缺省值:0int型变量的缺省值:0long型变量的缺省值:0float型变量的缺省值:0.0double型变量的缺省值:0.0现在学习的是第11页,共134页本例中声明了2个类,由public修饰的类名要和文件名相同,类PrimitiveDefalse中声明的8个变量是基本数据类型的变量,Java对基本类型变量的大小事先进行了定义,都赋予了默认值,其大小不随着硬件平台和操作系统的改变而变化,这也正是Java程序具有很强移植能力的原因之一。类Sample2_1中声明的变量pd是引用数据类型的,必须要使用new和构造函数实例化之后才能引用。现在学习的是第12页,共134页2.1.2 类体类头定义了类的性质,类体则定义了类的具体内容,类体中一般包括成员变量的声明和成员方法的定义。类成员变量可以存储反映类属性的数据,而类的成员方法则规定了类的行为,如对类属性数据的某种操作等。现在学习的是第13页,共134页成员变量可以是基本数据类型的,也可以是引用数据类型的。成员变量的作用范围是整个类,即在类的所有方法中都有效,但对其它类是不可见的,在其它类中访问属性成员需要声明来源,具体地,是在程序中使用类名或对象名声明。可以在类体的方法定义中声明和初始化局部变量或对象,这些局部变量只在方法内有意义,在方法外是没有意义的。类体中的一个方法可以调用另一个方法,但Java不允许递归调用,也不允许交叉循环调用,Java也不允许嵌套定义方法。类的成员方法的作用范围也是整个类,即在定义它的类中是可见的,但对其它类是不可见的,在其它类中调用类的方法成员需要声明来源,具体地,是在程序中使用类名或对象名声明。现在学习的是第14页,共134页例2-2类变量和方法声明。/程序名:Sample2_2.javaclass Rectangle /类声明float a,b;/成员变量声明Rectangle(float x,float y)/构造方法a=x;b=y;float area()/成员方法声明 return a*b;public class Sample2_2 /类声明public static void main(String args)/main()方法Rectangle rec;/声明对象recrec=new Rectangle(10,8);/为对象分配内存,使用new和类中的构造方法现在学习的是第15页,共134页 System.out.println(矩形的长为:+rec.a);/引用类成员变量a System.out.println(矩形的宽为:+rec.b);/引用类成员变量b System.out.println(矩形的面积为:+rec.area();/引用类成员方法area()现在学习的是第16页,共134页运行结果如下:矩形的长为:10.0矩形的宽为:8.0矩形的面积为:80.0现在学习的是第17页,共134页2.1.3 类的构造方法 构造方法用来初始化新创建的对象。类可以包含一个或者多个构造方法,不同的构造方法根据参数的不同来决定要初始化的新对象的状态。所有的Java类都有构造方法,用来对新的对象进行初始化。构造方法与类的名字是相同的,且不声明返回值类型。当一个类有多个构造方法时,所有的构造方法的名字都是相同的,只是所带参数的个数和类型不同而已。编译器会根据参数列表的数目以及类型来区分这些构造方法,所以,当创建对象的时候,要根据它的参数是否与初始化的新对象相匹配来选择构造方法。现在学习的是第18页,共134页例2-3:构造方法。/程序名:Sample2_3.javaclass Circle public Circle()/构造方法(无参数)r=0;public Circle(double R)/构造方法(带参数)r=R;double r;/成员变量声明double area()/成员方法声明 return 3.14*r*r;/计算圆面积 现在学习的是第19页,共134页void setR(double newR)/设置圆半径 r=newR;double getR()/获取圆半径 return r;public class Sample2_3public static void main(String args)Circle c0,c;/引用变量声明c0=new Circle();/用无参数的构造方法创建对象c0c=new Circle(2.0);/用带参数的构造方法创建对象cSystem.out.println(圆1的半径为:+c.getR();System.out.println(圆1的面积为:+c.area();现在学习的是第20页,共134页 c.setR(5.0);System.out.println(圆2的半径为:+c.getR();System.out.println(圆2的面积为:+c.area();System.out.println(圆3的半径为:+c0.getR();System.out.println(圆3的面积为:+c0.area();现在学习的是第21页,共134页运行结果如下:圆1的半径为:2.0圆1的面积为:12.56圆2的半径为:5.0圆2的面积为:78.5圆2的半径为:0.0圆2的面积为:0.0当用无参数的构造方法创建对象时,半径为0,而用带参数的构造方法创建对象时,半径为参数的值2.0。现在学习的是第22页,共134页2.1.4 类的成员变量类的成员变量用于存储反映类属性的数据,和在方法中声明的局部变量是不同的,成员变量的作用域是整个类,而局部变量的作用域只是方法内部。声明成员变量的语法如下:public|protected|privatestaticfinaltransientvolatile 变量类型 变量名=表达式;public|protected|private:访问控制符,在后面的章节中介绍。static:成员控制修饰符,说明该类型的变量为静态变量(或类变量)。静态变量由该类的所有实例对象共享,在编译时,静态变量保存在为类声明的存储单元中,在访问静态变量时无须事先初始化它所在的类。没有用static修饰的变量称为实例变量。现在学习的是第23页,共134页final:常量声明修饰符,用该符号声明后,在程序的运行过程中不能再改变它的值,实际使用中,final常与static结合使用。如:static final int pi=3.14159;transient:存储控制临时变量修饰符,用来声明一个临时变量,在默认情况下,类中所有变量都是对象永久状态的一部分。当对象被存档时,这些变量必须同时被保存,但用transient限定的变量不属于对象的永久状态。如:transient int temp;volatile:异步控制修饰符,表示多个并发线程共享的变量,使各个线程对该变量的访问能保持一致。如:volatile int v;现在学习的是第24页,共134页例2-4:类的成员变量和局部变量。/程序名:Sample2_4.javaclass Variable /类声明 int x=0,y=0,z=0;/类的成员变量 void init(int a,int b)/类的成员方法 x=a;y=b;int z=5;/局部变量 System.out.println(*在init()方法中*);System.out.println(x=+x+y=+y+z=+z);public class Sample2_4 public static void main(String args)Variable v=new Variable();/声明并创建类对象 System.out.println(*在init()方法之前*);System.out.println(x=+v.x+y=+v.y+z=+v.z);v.init(20,30);/调用init()方法 System.out.println(*在init()方法之后*);System.out.println(x=+v.x+y=+v.y+z=+v.z);现在学习的是第25页,共134页运行结果如下:*在init()方法之前*x=0 y=0 z=0*在init()方法中*x=20 y=30 z=5*在init()方法之后*x=20 y=30 z=0从运行结果可以看到,方法init()中的局部变量z仅在方法内部有效。现在学习的是第26页,共134页2.1.5 类的成员方法成员方法即类的方法成员,用于实现类的操作功能,是类行为的具体体现。Java中声明方法的语法如下:public|protected|privatestaticfinalabstractnativesynchronized 返回值类型 方法名(形式参数表)throws 异常类表局部变量声明;功能语句;现在学习的是第27页,共134页public|protected|private:访问控制符,将在后面介绍。static:说明该方法为静态方法,也称为类方法。静态方法属于类,只要声明了类,就可以直接调用该类的方法。静态方法只能操作静态变量,不能访问定义在类中的实例变量。没有用static修饰的方法就称为实例方法。实例方法只能在类的实例或子类的实例中调用。final:说明该方法为最终方法,即不能被子类重载(子类的方法和父类方法同名,后面将会说明)。说明为final的方法通常与关键字private一起使用。例如:private final f_meth()现在学习的是第28页,共134页abstract:说明该方法是抽象方法。即该方法只有方法说明,没有方法体。如果一个类包含一个或多个抽象方法,则该类必须为抽象类。抽象类不能被实例化。但抽象类中的成员方法并不都是抽象方法,且抽象类中不能有私有成员方法,也不能有静态成员方法(因为不能被实现)。注意:抽象类必须被继承,抽象方法必须被重载。native:说明该方法是用与平台有关的开发语言编写的,即可以用该方法把Java代码和其他语言的代码集成在一起。现在学习的是第29页,共134页synchronized:说明该方法是同步方法,用于控制多个并发线程对共享数据的访问。在后面多线程中会具体介绍同步方法。返回值类型:说明该方法的返回值类型,如果该方法无返回值,则返回值类型为void。形式参数列表:说明该方法中参数的数目和类型。异常类表:说明该方法可能产生的例外。现在学习的是第30页,共134页例2-5:变量和方法的声明和使用。/程序名:Sample2_5.javaclass A /声明类A int x;/声明变量x public int x()/声明方法x(),返回值为intreturn x;public void setX(int newX)/声明方法setX(),无返回值 x=newX;现在学习的是第31页,共134页public class Sample2_5 /声明类Sample2_5public static void main(String args)A a1=new A();/声明并实例化A的对象a1A a2=new A();/声明并实例化A的对象a2 A a3=new A();/声明并实例化A的对象a3a1.setX(1);/调用对象a1的方法setX()给x赋值1a2.setX(2);/调用对象a2的方法setX()给x赋值2a3.x=3;/给对象a3的变量x赋值3System.out.println(a1.x=+a1.x);/打印a1的变量x的值System.out.println(a2.x=+a2.x);/打印a2的变量x的值System.out.println(a3.x=+a3.x();/打印a3的方法x()返回值现在学习的是第32页,共134页运行结果如下:a1.x=1a2.x=2a3.x=3本例中,类A的对象a1、a2和a3是互相独立的,所以各对象输出的值各不相同。现在学习的是第33页,共134页2.2 对象2.2.1 创建对象类是一个抽象的概念,而对象则是具体的、实实在在存在的东西,对象的使用就是某个类的实例化操作。类就象是某个产品的图纸,根据图纸生产出来的具体产品就是对象,在现实世界里,我们使用的是产品而不是产品的图纸。同样的道理,Java运行的是用类创建的实例化对象。一个典型的Java程序会创建很多对象,它们通过消息传递进行相互交流,共同完成程序的功能。一旦任务完成,对象就会被垃圾收集器收回,完成它从创建、使用到清除的生命三部曲。现在学习的是第34页,共134页Java中创建新的对象必须使用new语句,该语句有三个组成部分:声明对象、实例化、初始化,格式为:类名 对象名=new 类名(实际参数表);声明对象由类名和对象名组成,如等号左边部分;实例化由new操作符实现,实例化就是为对象分配内存。new操作符需要一个参数,就是类的构造方法;初始化工作由构造方法完成。构造方法一方面提供了类名,由new操作符根据类名决定为新建对象分配多大的内存。另一方面,构造方法将新建对象初始化。创建对象相当于定义一个变量,既可采用上述方法,也可以把上述步骤分开进行,即先声明对象,以后再创建。现在学习的是第35页,共134页2.2.2 使用对象对象被实例化后即可使用。对象的使用是通过引用对象变量或调用对象的方法来实现的,对象变量和方法都是通过运算符“.”来实现的。现在学习的是第36页,共134页例2-6:创建和使用对象。/程序名:Sample2_6.javaclass Point int x,y;Point(int a,int b)x=a;y=b;void setx(int newx)x=newx;void sety(int newy)y=newy;现在学习的是第37页,共134页public class Sample2_6 public static void main(String args)Point p;/声明对象p。p=new Point(10,20);/使用 new和类中的构造方法实例化对象。System.out.println(x1=+p.x);/引用对象中的变量 System.out.println(y1=+p.y);p.setx(5);/调用对象中的方法 p.sety(10);System.out.println(x2=+p.x);System.out.println(y2=+p.y);现在学习的是第38页,共134页程序运行结果如下:x1=10y1=20 x2=5y2=10现在学习的是第39页,共134页2.2.3 清除对象使用new操作符创建对象后,Java虚拟机自动为该对象分配内存并保持跟踪。Java虚拟机能判断出对象是否还被引用,对不再被引用的对象释放其占用的内存。这种定期寻找不再使用的对象并自动释放对象占用内存的过程称为垃圾收集。Java虚拟机实际上是利用变量生存期来管理内存的,对象的引用被保存在变量中,如果当前的代码段不属于对象的作用域或把对象的引用赋值为null,该对象就成为一个无用对象,会被自动清除。Java的垃圾收集机制减轻了程序员的负担,使程序员不需要跟踪每个生成的对象,增强了Java程序的稳固性。现在学习的是第40页,共134页2.3 访问控制修饰符2.3.1 publicpublic是公共访问控制符,一个类被声明为公共类,表明它可以被所有的其它类所引用,即这个类作为整体是可见和可使用的,程序的其它部分可以创建这个类的对象、访问这个类内部可见的变量和调用其可见的方法。一个类作为整体对程序的其它部分可见,并不能代表类内的所有变量和方法也同时对程序的其它部分可见,前者只是后者的必要条件,类的变量和方法能否为所有其它类所访问,还要看这些变量和方法自己的访问控制符。如果这些变量和方法自己的访问控制符也被声明为public,那么程序中的所有其它部分都可访问或调用它们。现在学习的是第41页,共134页假如一个类没有访问控制符,说明它具有缺省的访问控制特性。这种缺省的访问控制权规定该类只能被同一个包中的类引用,而不可以被其它包中的类引用,这种访问特性又称为包访问性。通过声明类的访问控制符可以使整个程序结构清晰、严谨,减少可能产生的类间干扰和错误。现在学习的是第42页,共134页同样道理,类内的变量和方法如果没有访问控制符来限定,也说明它们具有包访问性,可以被同一个包中的其它类所访问和调用。包的具体概念和使用方法将在后面介绍,简单地说,定义在同一个程序中的所有类属于一个包。具有public(公共)访问控制修饰符的类成员可以被所有的类访问和调用。如果类成员没有访问控制修饰符,则该成员只能被同一个包中的类访问和调用。现在学习的是第43页,共134页2.3.2 private用private修饰的变量或方法只能被该类自身所访问和调用,而不能被任何其它类,包括该类的子类访问和调用。private修饰符用来声明那些类的私有成员,它提供了最高的保护级别。具有private(私有)访问控制修饰符的类成员不能被其它的类访问和调用。现在学习的是第44页,共134页2.3.3 protected用protected修饰的类成员允许类本身、在其他包中的子类以及在相同包中的类访问。通常,需要子类访问的成员,可以使用protected进行限制。现在学习的是第45页,共134页被private修饰的类成员只能被该类自身所访问和调用;用protected修饰的类成员允许类本身、在其他包中的子类以及在相同包中的类访问。具有public访问控制修饰符的类成员可以被所有的类访问和调用。如果类成员没有访问控制修饰符,则该成员只能被同一个包中的类访问和调用。现在学习的是第46页,共134页2.3.4 静态变量,静态方法和静态初始化器一、静态变量一、静态变量类的静态变量用static修饰。静态变量在类定义中已被系统唯一地创建(分配存储单元),因此使用类名声明。非静态变量是在创建类的实例对象时,才由系统创建,因此应使用对象名声明。现在学习的是第47页,共134页由于静态变量的唯一性,所以Java也允许使用对象名声明类的静态变量。由于非静态变量的不一致性,即不同对象创建的非静态变量占用不同的存储单元,所以不能用类名来声明非静态变量。静态变量最本质的特点是:它们是类的变量,而不属于任何一个类的具体对象。换句话说,对于该类的任何一个具体对象而言,静态变量是一个公共的存储区域,任何一个类的对象访问它时,取到的都是相同的值,同样,任何一个类的对象去修改它时,也都是在对同一个存储区域操作。现在学习的是第48页,共134页二、静态方法二、静态方法类的静态方法用static修饰。static修饰符修饰的变量是属于类的公共变量;与之相仿,用static修饰符修饰的方法,是属于整个类的类方法;而不用static修饰符限定的方法,是属于某个具体类对象或实例的方法。声明一个方法为static至少有三重含义:现在学习的是第49页,共134页(1)调用这个方法时,应该使用类名做前缀,而不是某一个具体的对象名;(2)非static的方法是属于某个对象的方法,在这个对象创建时对象的方法在内存中拥有自己专用的代码段;而static的方法是属于整个类的,它在内存中的代码段将随着类的定义而分配和装载,不被任何一个对象专有;(3)由于static方法是属于整个类的,所以它不能操纵和处理属于某个对象的域,而只能处理属于整个类的域。也即,static方法只能处理static的数据。现在学习的是第50页,共134页从本质上来说静态方法在类定义中已被系统唯一地创建(分配存储单元),因此使用类名声明。非静态方法是在创建类的实例对象时,才由系统创建,因此应使用对象名声明。虽然静态方法也具有唯一性,但Java不允许使用对象名声明类的静态方法。由于非静态方法的不一致性,即不同对象创建的非静态方法占用不同的存储单元,所以不能用类名来声明非静态方法。使用上,非静态方法的操作目标即声明调用它的对象,而静态方法需要用参数指出操作目标,所以,非静态方法常常没有参数,而静态方法至少有一个参数。现在学习的是第51页,共134页三、静态初始化器三、静态初始化器静态初始化器是由关键字static引导的一对大括号括起的语句组。它的作用与类的构造函数有些相似,都是用来完成初始化的工作,但是静态初始化器与构造函数有三点根本的不同:(1)构造函数是对每个新创建的对象初始化,而静态初始化器是对每个类进行初始化:(2)构造函数是在用new运算符产生新对象时由系统自动执行,而静态初始化器则是在它所属的类加载入内存时由系统调用运行的;现在学习的是第52页,共134页(3)不同于构造函数,静态初始化器不是方法,没有方法名、返回值和参数表。静态初始化器用于给类的静态域设置初值,该值在所有的对象中是一致的。可以将静态初始化器看成是一个static复合语句,现在学习的是第53页,共134页2.3.5 抽象类与抽象方法一、抽象类一、抽象类在类定义头使用abstract修饰,声明不为其分配存储单元,即不能创建抽象类的实例。抽象类中主要包含一些静态变量和抽象方法,可以由非抽象子类继承。现在学习的是第54页,共134页由于抽象类是它的所有子类的公共属性的集合,所以使用抽象类的一大优点就是可以充分利用这些公共属性来提高开发和维护程序的效率。因为把各类的公共属性从它们各自的类定义中抽取出来形成一个抽象类的组织方法显然比把公共属性保留在具体类中要方便得多。前面已经阐述过,面向对象技术是要用更接近于人类思维方式的方法来处理实际问题,抽象类的设立就是这种思想的具体体现之一,它是模仿人类的思维模式的产物。除了交通工具类,在交通工具的类树中还存在着其他的抽象类,读者可以自己试着找找看。现在学习的是第55页,共134页二、抽象方法二、抽象方法抽象方法指的是只有方法头,没有方法体的方法,用abstract来修饰。作为类修饰符,abstract声明了一种没有具体对象的,出于组织概念的层次关系需要而存在的抽象类;作为类方法修饰符,abstract则声明了一种仅有方法头,而没有具体的方法体和操作实现的抽象方法。abstract方法用一个分号来代替方法体的定义;至于方法体的具体实现,那是由当前类的不同子类在它们各自的类定义中完成的。也就是说,各子类在继承了父类的抽象方法之后,再分别用具有不同的语句的方法体来覆盖它,形成若干个名字相同,返回值相同,参数列表也相同,但具体功能有一定差别的方法。现在学习的是第56页,共134页需要特别注意的是,所有的抽象方法,都必须存在于抽象类之中。我们知道,抽象类中定义的是一组它所有子类所共有的公共域和方法,抽象方法就是其中的公共方法,它是所有子类都要使用的同类操作,定义abstract方法的主要目的也就在于此。事实上,为abstract方法书写方法体是没有意义的,因为abstract方法所依附的abstract类没有自己的对象,只有它的子类才存在具体的对象,而它的不同子类对这个abstract方法有互不相同的实现方法,除了参数列表和返回值之外,抽取不出其他的公共点。所以就只能把abstract方法作为一个共同的接口,表明当前抽象类的所有子类,都使用这个接口来完成某种功能。现在学习的是第57页,共134页当然,定义abstract方法也有特别的优点,就是可以隐藏具体的细节信息,使调用该方法的程序不必过分关注类及其子类的内部状况。由于所有的子类使用的都是相同的方法头,而方法头里实际包含了调用该方法的程序语句所需要了解的全部信息。要注意区别抽象方法和空方法,现在学习的是第58页,共134页抽象方法头最后有分号。空方法有方法体括号,方法头最后没有分号。抽象方法只能用于抽象类中,Java接口(特殊的抽象类)中的方法都是抽象方法,如ActionListener接口中的actionPerformed方法,ItemListener接口中的itemStateChanged方法等都是抽象方法。抽象类(接口)中的抽象方法能够统一方法名,提供方法的外部特性,在抽象类(接口)的子类中覆盖(实现)父类的抽象方法时,方法头保持不变,以便保留方法的外部特性,如与接口的对应关系等;方法体完全覆盖,以实现特定功能。现在学习的是第59页,共134页2.3.6 final和finalize一、一、final修饰类修饰类用final修饰的类称为最终类,该类不能被继承。如果一个类被final修饰符所修饰和限定,说明这个类不可能有子类。如果把一个应用中有继承关系的类组织成一棵倒长的树,所有类的父类是树根,每一个子类是一个分支,那么声明为fmal的类就只能是这棵树上的叶结点,即它的下面不可能再有分支子类(注意,final类一定是叶结点,而叶结点却不一定是final类)。现在学习的是第60页,共134页被定义为final的类通常是一些有固定作用、用来完成某种标准功能的类,如Java系统定义用来实现网络功能的InetAddress、Socket等类都是final类。在Java程序中,当通过类名引用一个类或其对象时,实际真正引用的既可能确是这个类或其对象本身,也可能是这个类的某个子类及子类的对象,即具有一定的不确定性。将一个类定义为final则可以将它的内容、属性和功能固定下来,与它的类名形成稳定的映射关系,从而保证引用这个类时所实现的功能正确无误。现在学习的是第61页,共134页二、二、final修饰常量修饰常量程序中经常需要定义各种类型的常量,并为它们取一个类似于变量名的标识符名字,这样就可以在程序中用这个名字来使用常量,而不是直接使用数值。final就是用来修饰常量的修饰符,一个类的变量如果被声明为final,那么它的取值在程序的整个执行过程中都不会改变,也就是一个常量。现在学习的是第62页,共134页用final修饰符说明常量时,需要注意以下几点:(1)需要说明常量的数据类型;(2)需要同时指出常量的具体取值;(3)因为所有类对象的常量成员,其数值都固定一致,为static。为了节省空间,常量通常被声明为static。修饰符final也可用于修饰方法中的局部变量,使之成为方法中的常量。如:private static final double pi=3.14159;现在学习的是第63页,共134页三、三、final修饰方法修饰方法最终方法使用final修饰符,一经定义后不能再修改,即不能被子类覆盖。正如final修饰符所修饰的域成员是无法变更的常量一样,final修饰符所修饰的类方法,是功能和内部语句不能被更改的最终方法,即是不能被当前类的子类覆盖的方法。在面向对象的程序设计中,子类可以把从父类那里继承来的某个方法重新定义,形成同父类方法同名,解决的问题也相似,但具体实现和功能却不尽一致的新的类方法,这个过程称为覆盖。如果类的某个方法被final修饰符所限定,则该类的子类就不能再重新定义与此方法同名的自己的方法,而仅能使用从父类继承来的方法。这样,就固定了这个方法所对应的具体操作,可以防止子类对父类关键方法的错误的重定义,保证了程序的安全性和正确性。现在学习的是第64页,共134页需要注意的是,所有已被private修饰符限定为私有的方法,以及所有包含在final类中的方法,都被缺省地认为是final的,因为这些方法要么不可能被子类所继承,要么根本没有子类,所以都不可能被覆盖,自然都是最终的方法。最终类不能被继承,最终方法不能被覆盖,最终变量不能被更改。现在学习的是第65页,共134页四、四、finalize名为finalize的方法称为终结器。在面向对象的程序设计中,对象与单纯的变量一样,有其产生和消亡的过程,当一个对象对程序不再有用时应该回收它,即释放它所占用的内存空间及其它资源。正如构造函数是创建新对象时执行的方法一样,终结器是回收对象时执行的方法。下面是一个类的终结器的例子:protected void finalize()System.out.println(An Object Of+toString()+has been free&collected.);现在学习的是第66页,共134页可见,终结器是名为finalize的方法,它没有参数列表和返回值。上例中,终结器的作用是在屏幕上输出信息表明当前对象被成功回收。在某些面向对象的语言(如C+)中,对象的释放和回收是通过编程人员执行某种特殊操作来实现的,像利用new运算符创建对象一样,利用free运算符可以回收对象。但在Java语言中,为方便、简化编程并减少错误,对象的回收是由系统的垃圾回收机制自动完成的。现在学习的是第67页,共134页Java的垃圾回收机制是一个系统后台线程,它与用户的程序共存,能够检测用户程序中的各对象的状态。当它发现一个对象已经不能继续被程序所利用时,就把这个对象记录下来,这种不能再使用的对象被称为内存垃圾。当垃圾达到一定数目且系统不是很忙时,垃圾回收线程会自动完成所有垃圾对象的内存释放工作,在这个过程中,在回收每个垃圾对象的同时,系统将自动调用执行它的终结器方法。现在学习的是第68页,共134页所以,类似于构造函数,终结器方法不由编程人员显式调用执行,而是在特定的时刻一一对象被回收时刻由系统自动执行的。而且终结器的调用时刻对于编程人员来说也是未知的,它取决于系统的垃圾回收线程。现在学习的是第69页,共134页2.3.7 其它修饰符及修饰符的混合使用变量的修饰符除了访问控制修饰符和静态、最终修饰符以外,还有volatile(易失修饰符)和transient(过渡修饰符)。方法的修饰符除了访问控制修饰符和静态、抽象、最终修饰符以外,还有synchronized(同步修饰符)和native(本地修饰符)。现在学习的是第70页,共134页如果一个类的变量被volatile所修饰,说明这个变量可能同时被几个线程所控制和修改,即这个变量不仅仅被当前程序所掌握,在运行过程中可能存在其它的未知的程序的操作来影响和改变该变量的取值,所以在使用当中应该特别留意这些其它影响因素。通常,volatile用来修饰接受外部输入的变量。如表示当前时间的变量将由系统的后台线程随时修改,以保证程序中取到的总是最新的当前的系统时间。现在学习的是第71页,共134页native修饰符一般用来声明用其它语言书写方法体并具体实现方法功能的特殊的方法,这里的其它语言包括C、C+、FORTRAN、汇编等。由于native的方法的方法体使用其它语言在程序外部写成,所以所有的native方法都没有方法体,而用一个分号代替。在Java程序里使用其它语言编写的模块作为类方法,其目的主要有两个:充分利用存在的程序功能模块已经和避免重复工作。现在学习的是第72页,共134页由于Java是解释型的语言,它的运行速度比较慢。在某些实时性比较强或执行效率要求比较高的场合,仅仅使用Java程序不能满足需要时,就可以利用native方法来求助于其它运行速度较高的语言。但是,在Java程序中使用native方法时应该特别注意,由于native方法对应其它语言书写的模块是以非Java字节码的二进制代码形式嵌入Java程序的,而这种二进制代码通常只能运行在编译生成它的平台之上,所以整个Java程序的跨平台性能将受到限制或破坏。除非保证native方法引入的代码也是跨不同平台的(可以通过特别设计在有限范围内实现),否则使用这类方法时应特别谨慎。现在学习的是第73页,共134页synchronized修饰符修饰的类方法,如果是一个类的