收藏 分销(赏)

B03类与对象-1.ppt

上传人:w****g 文档编号:8915486 上传时间:2025-03-07 格式:PPT 页数:117 大小:1.02MB
下载 相关 举报
B03类与对象-1.ppt_第1页
第1页 / 共117页
B03类与对象-1.ppt_第2页
第2页 / 共117页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,第,3,章 类与对象,3.1 面向对象基础,3.2 类,3.3 对象,3.4 变量,3.5 方法,3.6 package,语句和,import语句,3.7 访问权限,3.8,类的进一步说明,3.1,面向对象基础,3.1.1 编程语言的几个发展阶段,3.1.2 面向过程的程序设计,3.1.3 面向对象的程序设计,3.1.4 两种程序设计语言的简单比较,3.1.1,编程语言的几个发展阶段,1,机器语言,机器语言是由机器指令组成的语言。,2,汇编语言,汇编语言是符号化了的机器语言,,3,高级程序设计语言,高级程序设计语言屏蔽了机器的细节,提高了语言的抽象层次,程序中可以采用具有一定含义的数据命名和容易理解的执行语句。,4,面向对象的语言,面向对象的语言可以直接描述客观事物以及它们之间的联系,将客观事物看作具有属性和方法(行为)的对象,类是由同一类对象的共同属性和方法组成。,Java,语言属于面向对象的语言。,3.1.2,面向过程的程序设计,分析问题的主要方法,是以实现问题或问题域中的处理过程为中心,同时考虑适用于实际问题的数据结构和程序的输入输出,程序是由多个具有输入输出的处理过程组成。,程序设计的基本思路是,:自顶向下,逐步求精;将程序按功能划分成若干基本模块;模块之间关系尽可能简单,各模块的功能相对独立;每个模块是由顺序结构、选择结构、循环结构构成的子程序。,面向过程语言一般提供多种,基本数据类型,和,自定义数据类型,。,(a),程序结构,Main(),f1(),f2(),f3(),f2-1(),(b),动态调用关系,main,f1,f2-1,f2,f3,f2-2,数据,1,数据,2,数据,3,f2-2(),图,2-1,面向过程的程序设计语言的程序结构及动态调用关系,3.1.3,面向对象的程序设计,面向对象程序设计的基本思路,是:首先,将数据及对数据的操作(方法)放在一起,作为一个相互依存不可分割的整体,即,对象,;其次,对同类对象的共同属性和方法进行抽象形成,类,;类通过一个简单的外部接口与外界发生关系,对象与对象之间通过消息进行,通信,。因此,面向对象程序设计通常包含,系统分析、系统设计、对象设计和对象实现,几个阶段。,3.1.3,面向对象的程序设计,系统分析,:理解应用系统的定义及建立应用系统的对象模型,分析和发展对象,定义对象的属性和内部状态变换,定义外部事件和对象之间的联系和约束,最终建立应用系统的对象模型、动态模型及功能模型。,系统设计,:确立对象模型的实现方法。将系统分解为子系统,确立应用系统固有的并发性、分配处理器的任务,选择数据存储的管理手段、处理全局资源的访问,确立应用系统的边界等等。,3.1.3,面向对象的程序设计,对象设计,:将系统分析阶段建立的三种模型转换为类。将应用系统的对象模型转换为类的属性(主要考虑对象关联的实现方法),动态模型转换为类的方法(最好选用事件驱动的运行环境时间驱动的运行环境难于实现并发处理),功能模型转换为主控模块或子控模块(可以采用时间驱动或事件驱动的方式实现流程控制)。,对象实现,:用面向对象的程序设计语言实现对象设计阶段定义的类。选择合适的面向对象的程序设计语言及开发环境,定义类的属性及方法,编写主控模块及子控模块,针对具体语言进行性能调整。,3.1.3,面向对象的程序设计,4面向对象程序设计语言的程序结构,面向对象程序设计语言处理保留了3种基本控制结构和函数结构外,新增加了“类”结构。类结构是一种更为高级的程序结构,它综合了数据结构和函数结构,不仅可以包含更复杂的数据属性和数据结构,还包含着对这些数据的操作。是数据和操作高度统一的整体,具有更高的内聚性、安全性、稳定性和可重用性。类和类之间可以建立更为深刻的继承和包含关系,使得程序结构更加复杂、更加合理,同时也更加稳定。类的引入除了改进程序结构外,还可以和现实世界或问题域中的概念或实体对应起来,是现实世界中实体属性和行为的抽象。,图,2-2,面向对象的程序结构示意图,表示自包含,程序结构,函数结构,类结构,包结构,数据结构,顺序结构,选择结构,循环结构,图,2-3,面向对象程序模型及对应的,java,程序,f1(),f2(),f3(),mypackage,MyClass,AnotherClass,package mypackage;,class MyClass,int a;,void f1(),void f2(),class AnotherClass,int a;,void f3(),对应的,java,程序,3.1.4,两种程序设计语言的简单比较,方法名称,面向过程(结构化)方法,面向对象方法,软件开发,结构化系统分析,结构化系统设计,结构化系统开发,面向对象系统分析,面向对象系统设计,面向对象系统开发,高级语言发展历程,ALGOL,Fortran,Pascal,C,Simula,Smalltalk,C+,Java,编程的核心,数据结构,+,算法,对象,+,消息,优点,技术成熟,已全面标准化并推向实用,针对高技术的复杂难题而研制,能更好地实现软件的可靠性和安全性,缺点,无法处理高技术领域复杂的非规则信息,面向对象的系统分析与设计尚未标准化,应用尚不广泛,3.2,类,一个对象,是客观事物的属性和行为密封成的一个整体。,类,是某些对象的共同特征(属性和方法)的表示,,对象,是类的实例。类是组成,Java,程序的基本要素。,类封装,了一类对象的状态和方法。类是用来定义对象的模板。可以用类创建对象,当使用一个类创建了一个对象时,就是给出了这个类的一个实例。,3.2,类,1,类的基本构成,在语法上,类由两部分构成:类声明和类体。基本格式为:,修饰符,class,类名,extends,父类名,成员变量声明及初始化;,方法声明及方法体;,2,类声明的详细格式:,public,abstract,|,final,class,className,extends,superclassName ,implements,interfaceNameList,成员变量声明及初始化;,方法声明及方法体;,public:访问权限修饰词。,如果一个类被声明为public,那么与它不在同一个包中的类也可以通过引用它所在的包来使用这个类,否则这个类就只能被同一包中的类使用。,abstract:对父类所加的修饰词。,抽象类,不能被实例化生成自己的对象,通常只定义了一些变量和方法供继承使用。被声明为abstract的抽象类往往包含有被声明为abstract的抽象方法,这些方法由类的子类完成实现细节。如果一个类中有一个方法是抽象方法,则类必须声明为抽象。,final:对子类所加的修饰词。最终类,不能再派生出新的子类。,extends:后跟父类名称,implements:列出一个或多个接口,3,类体格式,类体中定义了该类中所有的变量和该类所支持的方法。,class className,/成员变量的定义,访问控制修饰符,其他修饰符,类型,变量名称,;,/成员方法的定义,访问控制修饰符,其他修饰符,返回类型,方法名称,(,参数列表,),抛出异常,statements,/,成员变量访问控制修饰符说明:,(,),访问控制修饰符对在该类以外的代码中访问被修饰的属性起控制作用,不影响在该内部对该属性的访问性。,public,:使用public修饰的属性的可见范围是整个程序,可以在任何一个类的方法代码中访问该属性,访问时需要通过该类的对象实例来对属性进行限定。属性一般使用public修饰,除非该属性允许其他人进行任意访问和修改,protected,:使用protected修饰的属性的可见范围是同一包内的所有类和该类所有子类(可以不再同一包中),即在同一包内的其他类或不同包中子类的方法可以访问该属性,主要用于属性被子类继承的情况。,成员变量访问控制修饰符说明:,(续上),private,:使用private修饰的属性的可见范围是该属性所属的类,即只有同类中的方法可以访问该属性,出了这个类的范围,即使同包内的类或子类也不能访问。该访问控制符一般用来封装属性,类外部的代码不能直接访问该属性,必须通过公有的方法接口来对该属性进行操作。,缺省,:如果属性前面不加访问控制符,即为包可见性,同包内的类都可以访问该属性。,成员变量其他修饰符说明:,final,:在简单变量属性前面使用final,表示该属性为常数。,如果在对象变量属性前面加上final,则表示该变量不能指向新的对象,但是所指向的对象的属性却可以改变,这和对象变量的值可以修改、但指向的对象不能修改的情况正好相反(后者如字符串变量)。,transient,:指明变量是临时常量。,volatile,:指明变量是一个共享变量。,成员变量其他修饰符说明:,static,:默认属性为非静态属性(实例属性)。JVM为每个对象实例属性分配不同内存。,使用static修饰的属性为静态属性(类属性)。该属性是所属类创建的所有对象实例的公有属性,也就是该类所有对象的公共变量或全局变量,而不是每个对象实例专有的属性。从保存该属性的内存单元来看,其内存的分配是在创建对象之前就进行了,即在JVM加载类时完成的。,final修饰的类属性为常量,不可改变。,方法访问控制修饰符的说明,public,|,protected,|,private,。意义和修饰属性的情况一样,控制方法的可见范围。方法一般为,public,,表示对外的接口,但也有私有方法或保护的方法,仅供类本身调用或子类调用。,public,:,一个类中被声明为,public,的方法(或变量)是“公开的”,意味着只要能使用这个类,就可以直接使用这个方法(或直接存取这个变量的值)。,方法访问控制修饰符的说明,protected,:一个类中被声明为,public,的方法(或变量)是“受限的”,意味着他们仅能被与该类处于同一包的类及该类的子类所直接使用或存取。,private,:一个类中被声明为,public,的方法(或变量)是“私有的”,除了声明他们的类外,不能被任何其他的类直接使用或存取。,缺省,friendly,:只能被同一包中的类直接使用或存取。,方法其他修饰符的说明,static,:默认方法为非静态方法(实例方法)。,JVM,为每个对象实例属性分配不同内存。,使用,static,修饰的方法为静态方法(类方法)。该方法不适于任何一个对象,而是属于整个类,是该类所有对象实例的公共方法,此方法对整个类来说是唯一的。类方法在该类被加载到内存时,就分配了相应的入口地址,即使该类没有创建对象,也可以直接通过类名调用方法。,方法其他修饰符的说明,final,:声明类的方法是最终的,在子类中不能对该方法进行重新实现,即覆盖或者扩展。该修饰符用于控制类方法的继承。,abstract,:声明方法是抽象的,不可能有具体实现的方法体。,native,:声明方法是通过调用本地方法来实现功能,如调用,C,函数。,synchronized,:声明该方法可实现线程的同步。,3.3,对象,采用Java语言编程时,大多数情况下是对具体的对象进行操作的。也就是说,要求以类作为模板,也可将类理解为对象的制造厂,专门用来创建类的实例(对象),图,3-3,类是对象的制造厂示意图,New,方法,属性,创建对象请求,产生新的类实例,1创建对象,创建对象语法格式:,类名 对象名;/声明对象,对象名new 类名();/创建对象,对象的声明的格式为:,类名 对象名,例如:,MyDate date;,1创建对象,对象的实例化与初始化:,用new操作符创建对象,即实例化一个对象,并按照对象的类型分配内存;用构造方法对它进行初始化。,通常new要与构造方法配合使用。,例如:new String(“How are you!”);,就是对系统字符串类String的构造方法的调用,并初始化为“How are you!”,以下举例说明。,例如:,import Java.awt.*;,Font font;/line1,font=new Font(“Times Roman”,Font.BOLD,36);/line2,也可以将line1和line2两行语句合并为如下一行语句:,Font font=new Font(“Times Roman”,Font.BOLD,36);,2对象的使用,对象的使用是通过一个引用类型的变量来实现,包括引用对象的成员变量和方法,通过运算符,可以实现对变量的访问和方法的调用。例如:,MyDate date=new MyDate();,定义了一个MyDate类型的对象date,以下是对象的使用。,date.day/引用date的成员变量day,date.tomorrow()/调用date的方法tomorrow(),3对象的消亡,当对象使用完毕后,就应将无用的对象赋空值(null),再由Java的垃圾收集器收集并释放空间。,3.4,变量,1,类中变量分类,局部变量是在方法体中定义的变量和方法的参数。,成员变量是在类属性定义部分所定义的变量,又可分为实例变量和类变量。类变量就是在声明时加上“,static”,修饰符的成员变量,故又称静态变量。,/,程序,3-2,class,varExample,int,x;,static,int,y;,int,fun(,int,z),int,a;,x=a;,x,和,y,是成员变量,其中,x,是实例变量,,y,是类变量。,z,和,a,是局部变量,其中,z,是方法,fun,的参数,,a,是方法,fun,中定义的变量。,2变量的内存分配,Java语言中数据类型分为基本数据类型和复合类型,相应地Java语言中变量可分为基本变量和复合变量。基本变量在说明时由系统自动分配内存,复合变量则必须使用new来申请内存。下面以类变量(即class变量)为例来说明复合变量的内存分配。,首先在说明变量时,在内存中为其建立一个引用,并置初值为null,表示不指向任何内存空间;其次使用new申请内存,内存大小依class的定义而定,并将该段内存的首址赋给引用。,class Box,float high,,,weight;,void,outputArea(String,s),System.out.println(“Area,=”+high*weight);,class,storeExample,public static void,main(String,args,),Box,box,;/line1,:声明对象,box=new Box();/line2,/*,为对象分配内存,使用,new,和默认构造方法*,/,.,图,3-4,内存分配示意图,0,height,box,Box box;,0,weight,0 xA75,box,box=new Box();,说明如下:,图,3-4,中左半部分显示的是执行语句“,Box box;”,后的内存情况,右半部分显示的是执行语句“,box=new Box();”,后的内存情况。,执行语句“,box=new Box();”,时,系统将作以下两件事:,(,1,)为,height,和,weight,分配内存空间;,(,2,)返回一个引用给,box,,确保,box,可以操作管理分配给,height,和,weight,的内存单元。,3,实例变量和类变量的简单比较:,(),一个类通过使用,new,运算符可以创建多个不同的对象,这些对象的实例变量被分配不同的内存空间,如果这个类中的成员变量有类变量,那么所有对象的这个类变量都被分配相同的一处内存,改变其中一个对象的这个变量会影响其他对象的这个变量值。,类变量必须在类体中声明,并且使用关键字“,static”,,因此也称为静态变量;实例变量在类体中声明但不使用关键字“,static”,,也称为非静态变量。,3,实例变量和类变量的简单比较:(续上),类变量在类被加载时完成相应的初始化工作,类变量在一个运行系统中只有一份供整个类和实例对象共享的值,该值有可能被类(及其子类)和它们所创建的实例改变,每一次的改变都将影响到该类(及其子类)和其它实例的调用。它在对象初始化时完成相应的初始化工作,并由某一个对象独自拥有。,类变量的作用域是整个类。实例变量的作用域是某一个类具体创建的实例对象。,class A,static,int,x;,int,y;,class,varstoreExample,A a1=new A();,A a2=new A();,图,3-5,内存映像示意图,0 x325,a1,0,y,0,x,0,y,0 xBA2,a2,说明:,(,1,)本实例包含两个类,A,和类,varstoreExample,;,(,2,)在类,A,中,x,是类变量,,y,是实例变量;,(,3,)在类,varstoreExample,中,以类,A,为基础创建了两个对象,a1,和,a2,;由于,x,是类变量,因此对象,a1,和,a2,中变量,x,指向同一内存单元;而,y,是实例变量,因此对象,a1,和,a2,中变量,y,分别指向不同内存单元。,4变量初始化与赋值,Java规定,任何变量使用之前,必须对变量赋值。,成员变量的初始化及赋值,成员变量可自动初始化,其中数值型为0,逻辑型为false,引用型为null。成员变量的赋值可以在声明时进行,也可以在方法中实现,但不能在声明和方法之间进行赋值。,class A,int,x;,float y;,x=12;y=12.56f;/line,float,sumXY,(),return,x+y,;,public class initExample2,public static void,main(String,args,),A a=new A();,System.out.print(x+y,=+,a.sumXY,();,说明:,错误提示要求,给变量,x,或,y,加上类型申明标示,事实上,在这之前,已对,x,和,y,的类型进行了申明。产生错误的原因在于,成员变量的赋值不能在声明和方法之间进行。,4变量初始化与赋值,局部变量的初始化和赋值,局部变量不可自动初始化,要求程序显式得给其赋值。只有当方法被调用执行时,局部变量才被分配内存空间,调用完毕后,所占用空间被释放。,class A,void f(),int,x=(,int)(Math.random,()*100);,int,y,,,z;/line2,if(x60)y=10;,z=,y-x,;,System.out.print(z,=+z);,public class,localVarExample,public static void,main(String,args,),A a=new A();,a.f,();,说明:,在本实例中,表面上通过执行语句“,if(x60)y=10;”,对,y,进行了赋值,实际上由于,x,是,Math.random,(),产生的随机数,有可能大于,60,,也有可能小于,60,,若,x,小于,60,,则在使用,y,(即执行语句,z=,y-x,)之前,,y,没有被显式赋值,故会出现以上错误提示。为避免这类错误,必须确保,y,在使用之前被显式赋值。一个简单的办法就是在申明,y,之时,可,y,赋值。如:,int,y=0,,,z;/line2,当然这种解决办法要看具体功能而定。,引用赋值举例,class Point,int,x,,,y;,Point(),x=67;y=10;,Point(int,x,,,int,y),this.x,=,x;this.y,=y;,void,showXY,(),(,点,(x,,,y),为,+(+x+,,,+y+);,public class,classInitExample,public static void,main(String,args,),Point p1=new Point();,Point p2=new Point(6,,,18);,p1.showXY();,p2.showXY();,p1=p2;,p1.showXY();,p2.showXY();,图,3-6,内存映像示意图,Point p1=new Point();,10,y,0 x125,p1,67,x,Point p1=new Point(6,18);,18,y,0 xA75,p2,6,x,p1=p2;,18,y,0 xA75,p1,6,x,3.5,方法,3.5.1,方法概述,3.5.2,方法分类,3.5.3,方法中值传递,3.5.4,三个重要方法,3.5.5,方法的递归调用,3.5.1,方法概述,方法是类的动态属性,。,对象的行为是由其方法来实现的,。,一个对象可以通过调用另一对象的方法来访问该对象,。,一定条件下,同一类中,不同的方法之间可以相互调用。,在方法声明时,通过修饰符可以对方法访问实施控制。在方法中,可以对类的成员变量进行访问,但不同类型的方法对不同类型的成员变量的访问是有限制的。,访问控制修饰符,其他修饰符,返回值类型,方法名称,(,形式参数列表,),抛出异常,可以对方法的访问实施控制,因其在前面已介绍,故在此不再赘述。,可以是任何合法的,Java,数据类型。若方法没有返回值,则类型应定义为,void,。返回值由,return,语句来返回。,可以是任何合法的,Java,标识符。,可以是任何合法的,Java,语句集合。,由方法运行时需要接收的数据及其类型组成,即格式如下:,,,,,3.5.2,方法分类,实例方法和类方法,实例方法能对类变量和实例变量操作,而类方法只能对类变量进行操作;,类方法不仅可以由对象调用而且还可以直接由类名调用,而实例方法不能由类名调用。,一个类中的方法可以相互调用,但静态方法只能调用静态方法,不能调用实例方法。,在创建对象之前,实例变量没有分配内存,实例方法也没有入口地址。,【,实例,3-10】/,指出方法类型,class A,int,a;,static float b;,float,max(float,x,,,float y),static float show(),【,实例,3-11】,指出错误,class A,int,i;,static,int,j;,void set1(int x,,,int,y),i=,x;j,=y;,static void set2(int z),i=,z;j,=z*z;,void,showXY,(),System.out.println(i,=+i+.j=+j);,public class,methodvarExample,public static void,main(String,args,),A a=new A();,a.set1(10,,,20);,a.showXY,();,a.set2(30);,a.showXY,();,说明:在本实例中,在类,A,中方法,set1(),是实例方法,方法,set2(),是类方法,变量,x,是实例变量,变量,y,是类变量。类方法只能操作类变量。上述程序中,类方法,set2(),中对实例变量,x,操作,显然是不合规则的。因此提示,i=z,有错。,【,实例,3-12】,指出错误,class A,int,i;,static,int,j;,void set1(int x,,,int,y),i=,x;j,=y;,static void set2(int z),j=z*z;,void,showXY,(),System.out.println(i,=+i+.j=+j);,【,实例,3-11】,指出错误,public class methodvarExample2,public static void,main(String,args,),A a=new A();,a.set1(10,,,20);,a.showXY,();,a.set2(30);,a.showXY,();,A.set1(10,,,20);,A.showXY,();,A.set2(30);,A.showXY,();,说明:在本实例中,在类,A,中方法,set1(),和,showXY,是实例方法,方法,set2(),是类方法,类方法不仅可以由对象调用而且还可以直接由类名调用,而实例方法不能由类名调用。因此会出现上述错误。,3.5.3,方法调用中数据传递,1、值传递方法,2、引用传递方法,3、返回值方法,4、实例变量和类变量传递方式,1,、值传递方法,将调用方法的实参的值计算出来赋予被调用方法对应形参的一种数据传递方法。,在这种数据传递方法下,被调用方法对形参的计算、加工与对应的实参已完全脱离关系。当被调方法执行结束,形参中的值可能发生变化,但是返回后,这些形参中的值将不会带到对应的实参中。“数据的单向传递,”,class A,int,square(int,x),x=x*x;,return x;,public class paraTransExample1,public static void,main(String,args,),int,y,,,z;,A a=new A();,y=10;,z=,a.square(y,);,System.out.println(y,=+y+.z=+z);,输出结果:,x=10.y=100,说明:,类,A,中方法,square,有参数变量,x,(非引用型),在,paraTransExample1,中创建对象,a,后,通过,a,调用方法,square,,此时是通过值传递来实现给方法,square,的参数赋值的,由于是值传递,因此尽管方法,square,中参数变量,x,发生了改变,但这种改变并不影响调用方法的实参,y,,即在调用方法,square,前,实参,y,的值为,10,,调用方法,square,后,实参,y,的值仍然为,10,。,2,、引用传递方法,使用引用传递方法时,方法的参数类型一般是复合类型(引用类型)。复合类型变量中存储的是对象的引用,所以在参数转送中是传送引用,方法接收参数的引用,因此任何对形参的改变都会影响到对应的实参。“引用的单向传送,数据的双向传送”。以下举例说明:,class Point,int,x,,,y;,void,setXY(int,x1,,,int,y1),x=x1;,y=y1;,void,squarePoint(Point,p),p.x,=,p.x,*,p.x,;,p.y,=,p.y,*,p.y,;,public class paraTransExample2,public static void,main(String,args,),Point p0=new Point();,p0.setXY(10,,,20);,System.out.println(x,=+p0.x+.y=+p0.y);,p0.squarePoint(p0);,System.out.println(x,=+p0.x+.y=+p0.y);,运行结果为:,x=10.y=20,x=100.y=400,说明:,在本实例中,类,A,中方法,squarePoint,有参数变量,x,是引用型,在,paraTransExample2,中创建对象,a,后,通过,a,调用方法,squarePoint,,当方法,squarePoint,中对,x,和,y,进行改变后,这种改变的结果会反映在实参,p0,中,这就是为什么调用方法,squarePoint,前,x,和,y,分别是,10,和,20,,调用方法,squarePoint,后,x,和,y,分别是,100,和,400,。,3,、返回值方法,返回值方法不是在形参和实参之间传递数据,而是被调方法通过方法调用后直接将返回值送到调用方法中。使用返回值方法时,方法的返回值类型不能为,void,,且方法体中必须有带表达式的,return,语句,其中表达式的值就是方法的返回值。,/Exam030508.java,public class Exam030508,public static void,main(String,args,),int,v1,v2;,v1=10;v2=12;,System.out.println(max(+v1+,+v2+)=+max(v1,v2);,static,int,max(int,x,int,y),if(xy)return x;,else return y;,4,、实例变量和类变量传递方式,实例变量和类变量传递方式也不是在形参和实参之间传递数据,而是利用在类中定义的实例变量和类变量是类中诸方法共享的变量的特点来传递数据,/Exam030509.java,class A,static,int,x;,int,y;,void,setxy(int,x1,int y1),x=x1;y=y1;,int,getx,(),return x;,int,gety,(),return y;,运行结果为:,a1(x,y)=(0,0),a2(x,y)=(0,0),a1(x,y)=(1,2),a2(x,y)=(1,0),a1(x,y)=(3,2),a2(x,y)=(3,4),说明:在本实例中,类,A,中成员变量,x,为,static,型,因为以,A,为基础创建的对象,a1,和,a2,对成员变量,x,公用一个相同的存储空间,则,a1,和,a2,调用方法,setxy(),都能改变成员变量,x,的值。,3.5.3,三个重要方法,1、构造方法,2、main方法,3、finalize方法,1,、构造方法,Java通过构造方法来保证对每个对象进行初始化。,构造方法是一种特殊的方法。Java中的每个类都有构造方法,用来初始化该类的一个新的对象。构造方法具有和类名相同的名称,而且不返回任何数据类型,即void类型(void可以省略)。在构造方法的实现中,也可以进行方法重载。在类中没有构造方法时,使用默认的构造方法。,构造方法在创建一个新对象时,同时给这个新对象分配内存,创建对象进行初始化一般格式为:,新对象名,=new,构造方法();,一个类中可能没有构造方法,此时使用默认的构造方法,.,使用默认的构造方法时,按照默认的方式对变量进行初始化,即数值型初始化为,0,,引用型初始化为,null,,逻辑型初始化为,false,。,一个类中存在一个或多个构造方法,【,实例,3-16】,内中无构造方法,class Point,int,x,,,y;,void,showXY,(),(,点,(x,,,y),为,+(+x+,,,+y+);,public class methodsExample1,public static void,main(String,args,),Point p1=new Point();,p1.showXY();,运行结果为:,点,(x,,,y),为,(0,,,0),说明:,在本实例中,类,A,中没有构造方法,则使用默认的构造方法,,x,和,y,被初始化为,0,。,【,实例,3-17】,内中多个构造方法,class Point,int,x,,,y;,Point(),x=1;y=1;,Point(int,x1,,,int,y1),x=x1;y=y1;,void,showXY,(),(,点,(x,,,y),为,+(+x+,,,+y+);,public class methodsExample2,public static void,main(String,args,),Point p1=new Point();,Point p2=new Point(2,,,2);,p1.showXY();,p2.showXY();,运行结果为:,点,(x,,,y),为,(1,,,1),点,(x,,,y),为,(2,,,2),说明:,在本实例中,类,A,中有两个构造方法,在,methodsExample2,中通过参数来识别所调用的构造方法,当没有参数时调用构造方法,Point(),,当有参数时调用构造方法,Point(x,,,y),。,注意事项:,一旦定义了构造函数,,Java,就不能再调用系统缺省构造函数;,2,、,main,方法,Java独立应用程序,(,Application,程序),都从main开始执行,一个程序中只有一个main方法,其使用形式为:,public static void main(String args),main方法中参数args是用来传递命令行参数的。以下举例说明,【,实例,3-18】,class A,void,show(int,i,,,String,str,),(,第,+i+,参数是,+,str,);,public class commmandparaExample1,public static void,main(String,args,),A a=new A();,int,i;,for(i,=0;i,args.length;i,+),a.show(i,,,argsi,);,编译完毕后,按如下方式运行:,java commmandparaExample1 ch1 ch2 ch3,则显示如下运行结果:,第,0,参数为,ch1,第,1,参数为,ch2,第,2,参数为,ch3,说明:,在本实例中,数组类,args,的属性,length,用于记录数组元素个数,,args0,存储第一个参数的值,,args1,存储第二个参数的值,依此类推。,3,、,finalize,方法,finalize解决了“垃圾清理”这类不安全因素,即在进行垃圾清理时执行一些重要的清理工作。,正常情况下,垃圾回收器Garbage Collection(以下简称gc)周期性地检查内存中不再被使用的对象,然后将它们回收,释放它们占用的空间。,gc 只能清除在堆上分配的内存(纯java语言的所有对象都在堆上使用new分配内存),而不能清除栈上分配的内存(当使用JNI技术时,可能会在栈上分配内存,例如java调用c程序,而该c程序使用malloc分配内存时)。因此,如果某些对象被分配了栈上的内存区域,那gc就管不着了,对这样的对象进行内存回收就要靠finalize()。,例如,当,java,调用非,java,方法时(这种方法可能是,c,或是,c+,的),在非,java,代码内部也许调用了,c,的,malloc(),函数来分配内存,而且除非调用那个了,free(),否则不会释放内存,(,因为,free(),是,c,的函数,),,这个时候要进行释放内存的工作,,gc,是不起作用的,因而需要在,finalize(),内部的一个固有方法调用它,(free(),。,finalize,的工作原理,一旦垃圾收集器准备好释放对象占用的存储空间,它首先调用,finalize(),,而且只有在下一次垃圾收集过程中,才会真正回收对象的内存。所以如果使用,finalize(),,就可以在垃圾收集期间进行一些重要的清除或清扫工作。,在以下三种情况将使用,finalize,:,(,1,)所有对象被,Garbage Collection,时自动调用,比如运行,System.gc(),的时候。,(,2,)程序退出时为每个对象调用一次,finalize,方法。,(,3,)显式的调用,finalize,方法。,3.5,方法,除此以外,正常情况下,当某个对象被系统收集为无用信息的时候,,finalize(),将被自动调用,但是,JVM,不保证,finalize(),一定被调用,也就是说,,finalize(),的调用是不确定的,这也就是为什么,sun,不提倡使用,finalize(),的原因,.,使用,finalize,的方式非常简单,只需在类中增加,finalize,方法。,Finalize,格式为:,class,类名,protected void finalize()throws Throwable,3.5.5,方法的递归调用,所谓递归是指一个方法直接或间接调用自身的行为。,直接递归,是指方法在执行中调用了自身,间接递归,是指方法在执行中调用了其他方法,而其他方法在执行中又调用了该方法。,/,程序名称:,Exam030514.java,/,功能:利用递归计算,1+2+n,class,TestRecu
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传
相似文档                                   自信AI助手自信AI助手

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服