类与对象的基本概念课件

上传人:vosvybf****vycfil... 文档编号:243144510 上传时间:2024-09-16 格式:PPT 页数:138 大小:433.50KB
返回 下载 相关 举报
类与对象的基本概念课件_第1页
第1页 / 共138页
类与对象的基本概念课件_第2页
第2页 / 共138页
类与对象的基本概念课件_第3页
第3页 / 共138页
点击查看更多>>
资源描述
,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,单击此处编辑母版标题样式,JAVA,语言程序设计,第,二,章,类与对象的基本概念,宋继红,JAVA,语言程序设计,1,目录,2.1,面向对象的程序设计方法概述,2.2 类与对象,2.3 对象初始化和回收,2.4 应用举例,2.5 UML,简介,2.6,本章小节,2,2.1 面向对象的程序设计方法概述,面向对象的程序设计,与结构化程序设计方法相比,更符合人类认识现实世界的思维方式,已成为程序设计的主流方向,涉及的主要概念,抽象,封装,继承,多态,3,对象,现实世界中,万物皆对象,都具有,各自的属性,对外界都呈现各自的行为,程序中,一切都是对象,都具有标识,(identity),属性和行为(方法,),通过一个或多个变量来保存其状态,通过方法,(method),实现他的行为,2.1 面向对象的程序设计方法概述(续),面向对象程序设计方法概述,4,类,将属性及行为相同或相似的对象归为一类,类可以看成是对象的抽象,代表了此类对象所具有的共有属性和行为,在面向对象的程序设计中,每一个对象都属于某个特定的类,,,面向对象程序设计方法概述,2.1 面向对象的程序设计方法概述(续),5,结构化程序设计,通常由若干个程序模块组成,每个程序模块都可以是子程序或函数,数据和功能分离,代码难于维护和复用,面向对象程序设计,基本组成单位是类,程序在运行时由类生成对象,对象是面向对象程序的核心,对象之间通过发送消息进行通信,互相协作完成相应功能,2.1 面向对象的程序设计方法概述(续),面向对象程序设计方法概述,6,2.1.1 抽象,抽象,忽略问题中与当前目标无关的方面,以便更充分地注意与当前目标有关的方面,计算机软件开发中所使用的抽象有,过程抽象,数据抽象,面向对象程序设计方法概述,7,过程抽象,将整个系统的功能划分为若干部分,强调功能完成的过程和步骤,而隐藏其具体的实现,任何一个明确定义的功能操作都可被看作单个的实体,尽管这个操作实际上可能由一系列更低级的操作来完成,基于过程抽象的两个标准程序设计技术,过程分解,递归技术,2.1.1 抽象(续),过程抽象,面向对象程序设计方法概述,8,数据抽象,将需要处理的数据和这些数据上的操作结合在一起,抽象成不同的抽象数据类型,每个抽象数据类型既包含了数据,也包含了针对这些数据的操作,相对于过程抽象,数据抽象是更为合理的抽象方法,2.1.1 抽象(续),数据抽象,面向对象程序设计方法概述,9,例:,钟表,数据(属性),int,Hour,;,int,Minute,;,int,Second,;,方法(行为),SetTime,(),;,ShowTime(),;,2.1.1 抽象(续),面向对象程序设计方法概述,10,例:,人,数据(属性),char *,name,; char *,gender,;,int,age,;,int,id,;,方法(行为),生物行为,Eat,(),Step,(),社会行为,Work,(),Study,(),面向对象程序设计方法概述,2.1.1 抽象(续),11,2.1.2 封装,封装,是一种信息隐蔽技术,利用抽象数据类型将数据和基于数据的操作封装在一起,用户只能看到对象的封装界面信息,对象的内部细节对用户是隐蔽的,封装的目的在于将对象的使用者和设计者分开,使用者不必知道行为实现的细节,只需使用设计者提供的消息来访问对象,面向对象程序设计方法概述,12,封装的定义,清楚的边界,所有对象的内部信息被限定在这个边界内,接口,对象向外界提供的方法,外界可以通过这些方法与对象进行交互,受保护的内部实现,功能的实现细节,不能从类外访问。,2.1.2 封装(续),面向对象程序设计方法概述,13,封装的意义,在面向对象的程序设计中,类封装了数据及对数据的操作,是程序中的最小模块,禁止了外界直接操作类中的数据,模块与模块之间只能通过严格控制的接口进行交互,这使得模块之间的偶合度大大降低,保证了模块具有较好的独立性,程序维护和修改较为容易,2.1.2 封装(续),面向对象程序设计方法概述,14,2.1.3 继承,继承,是指新的类可以获得已有类(称为超类、基类或父类)的属性和行为,称新类为已有类的派生类(也称为子类),在继承过程中派生类继承了基类的特性,包括方法和实例变量,派生类也可修改继承的方法或增加新的方法,使之更适合特殊的需要,有助于解决软件的可重用性问题,使程序结构清晰,降低了编码和维护的工作量,面向对象程序设计方法概述,15,单继承,任何一个派生类都只有单一的直接父类,类层次结构为树状结构,多继承,一个类可以有一个以上的直接父类,类层次结构为网状结构,设计及实现比较复杂,Java,语言仅支持单继承,2.1.3 继承(续),面向对象程序设计方法概述,16,2.1.4 多态,多态,一个程序中同名的不同方法共存,主要通过子类对父类方法的覆盖来实现,不同类的对象可以响应同名的消息(方法) ,具体的实现方法却不同,使语言具有灵活、抽象、行为共享、代码共享的优势,很好地解决了应用程序方法同名问题,面向对象程序设计方法概述,17,类与对象,在程序中,对象是通过一种抽象数据类型来描述的,这种抽象数据类型称为类(,Class),一个类是对一类对象的描述。,类是构造对象的模板,对象是类的具体实例,2.2 类与对象,18,2.2.1 类的声明,声明形式,public, ,abstract,|,final, class,类名称,extends,父类名称,implements,接口名称列表,变量成员声明及初始化;,方法声明及方法体;,类与对象,19,关键字,Class,表明其后声明的是一个类。,extends,如果所声明的类是从某一父类派生而来,那么,父类的名字应写在,extends,之后,implements,如果所声明的类要实现某些接口,那么,接口的名字应写在,implements,之后,2.2.1 类的声明(续),类与对象,20,修饰符,可以有多个,用来限定类的使用方式,public,表明此类为公有类,abstract,指明此类为抽象类,final,指明此类为终结类,类声明体,变量成员声明及初始化,可以有多个,方法声明及方法体,可以有多个,2.2.1 类的声明(续),类与对象,21,钟表类,public,class,Clock, /,成员变量,int,hour ;,int,minute ;,int,second ;,/,成员方法,public void,setTime,(,int newH,int newM,int newS,), hour=,newH,;,minute=,newM,;,second=news ;,public void,showTime,(), System.out.,println,(hour+:+minute+:+second);,2.2.1 类的声明(续),例2_1,类与对象,22,变量和对象,变量除了存储基本数据类型的数据,还能存储对象的引用,用来存储对象引用的变量称为引用变量,类的对象也称为类的实例,2.2.2 对象的声明与引用,类与对象,23,对象的声明,格式,类名 变量名,例如,Clock,是已经声明的类名,则下面语句声明的变量,aclock,将用于存储该类对象的引用:,Clock,aclock,;,声明一个引用变量时并没有对象生成,2.2.2 对象的声明与引用(续),类与对象,24,对象的创建,生成实例的格式:,new,(),例如:,aclock,=new Clock(),其作用是:,在内存中为此对象分配内存空间,返回对象的引用(,reference ,,相当于对象的存储地址),引用变量可以被赋以空值,例如:,aclock=null;,2.2.2 对象的声明与引用(续),类与对象,25,2.2.3 数据成员,数据成员,表示,Java,类的状态,声明数据成员必须给出变量名及其所属的类型,同时还可以指定其他特性,在一个类中成员变量名是唯一的,数据成员的类型可以是,Java,中任意的数据类型(简单类型,类,接口,数组),分为实例变量和类变量,类与对象,26,声明格式,public,|,protected,|,private,static,final,transient, ,volatile,变量数据类型,变量名1=变量初值,变量名2=变量初值, ,;,格式说明,public、protected、private,为访问控制符,static,指明这是一个静态成员变量,final,指明变量的值不能被修改,transient,指明变量是临时状态,volatile,指明变量是一个共享变量,2.2.3 数据成员(,续,),类 与 对 象,27,实例变量,没有,static,修饰的变量称为实例变量(,Instance Variables),用来存储所有实例都需要的属性信息,不同实例的属性值可能会不同,可通过下面的表达式访问实例属性的值,.,2.2.3 数据成员(,续,),实例变量,类与对象,28,声明一个表示圆的类,保存在文件,Circle.java,中。然后编写测试类,保存在文件,ShapeTester,.java,中,并与,Circle.java,放在相同的目录下,public class,Circle,int,radius,;,public class,ShapeTester,public static void main(String,args,) ,Circle x;,x = new Circle();,System.out.,println,(x);,System.out.,println,(radius = + x.radius);,2.2.3 数据成员(,续,),例2_2,类与对象,29,编译后运行结果如下:,Circle26b249,radius =0,解释,之后的数值为,x,所指的对象的存储地址,x,的值及对象的状态如图,2.2.3 数据成员(,续,),例2_2运行结果,类与对象,30,声明一个表示矩形的类,,,保存在,Rectangle.java,中;编写测试类,保存在,ShapeTester,.java,中,二文件保存在相同的目录下,public class,Rectangle,double,width,= 10.128;,double,height,= 5.734;,public class,ShapeTester,public static void main(String,args,) ,Circle x;,Rectangle y;,x = new Circle();,y = new Rectangle();,System.out.,println,(x + + y);,2.2.3 数据成员(,续,),例2_3,类与对象,31,编译后运行结果如下:,Circle82f0db,Rectangle92d342,解释,Circle,及,Rectangle,类对象的状态如图,2.2.3 数据成员(,续,),例2_3运行结果,类与对象,32,对,ShapeTester,类进行修改,使两个实例具有不同的实例变量值,public class,ShapeTester,public static void main(String,args,) ,Circle x;,Rectangle y, z;,x = new Circle();,y = new Rectangle();,z = new Rectangle();,x.radius,= 50;,z.width,= 68.94;,z.height,= 47.54;,System.out.,println,(x.radius + + y.width + + z.width);,2.2.3 数据成员(,续,),例2_3修改,类与对象,33,编译后运行结果如下:,50 10.128 68.94,解释,Circle,及,Rectangle,类对象的状态如图,2.2.3 数据成员(,续,),修改后运行结果,类与对象,34,地址簿程序,一个人的地址通常包括以下信息:,姓名,省份,城市,街道,门牌号,邮政编码,采用过程化的程序设计方法,使用简单变量存储,则存储两个人地址的代码如下,2.2.3 数据成员(,续,),例2_4,类与对象,35,public static void main(String,args,) ,String,name1,name2,;,int,gateNumber1, gateNumber2,;,String,streetName1,streetName2,;,String,city1,city2,;,String,province1,province2,;,String,postalCode1,postalCode2,;,name1 = Zhang Li;,gateNumber1 = 15;,streetName1 = ,Tsinghua,East Road;,city1 = Beijing;,province1 =,“Beijing;,postalCode1 = 100084;,name2 = Li Hong;,gateNumber2 = 2;,streetName2 = ,BeiNong,;,city2 = Beijing;,province2 = ,Beijing;,postalCode2 = 102206;,/.do something interesting,2.2.3 数据成员(,续,),例2_4,类与对象,36,采用面向对象的程序设计方法,则需要首先声明,Address,类如下,public class Address ,String name;,int,gateNumber,;,String,streetName,;,String,city,;,String,province,;,String,postalCode,;,/,方法成员略,2.2.3 数据成员(,续,),例2_4,类与对象,37,主方法改写如下,public static void main(String,args,) ,Address,address1,= new Address(),address2,= new Address();,address1,.,name,= “Zhang Li;,address1.,streetNumber,= 15;,address1.,streetName,= “,Tsinghua,East Road;,address1.city = “Beijing;,address1.province = “Beijing;,address1.,postalCode,= “100084;,address2,.,name,= “Li Hong;,address2.,streetNumber,= 2;,address2.,streetName,= “,BeiNong,;,address2.city = “Beijing;,address2.province = “Beijing;,address2.,postalCode,= “102206;,/.do something interesting,2.2.3 数据成员(,续,),例2_4,类与对象,38,类变量,也称为静态变量,声明时需加,static,修饰符,不管类的对象有多少,类变量只存在一份,在整个类中只有一个值,类初始化的同时就被赋值,适用情况,类中所有对象都相同的属性,经常需要共享的数据,系统中用到的一些常量值,引用格式,.,2.2.3 数据成员(,续,),类变量,类与对象,39,对于一个圆类的所有对象,计算圆的面积时,都需用到,的值,可在,Circle,类的声明中增加一个类属性,PI,public class Circle ,static,double,PI,= 3.14159265;,int,radius;,当我们生成,Circle,类的实例时,在每一个实例中并,没有存储,PI,的值,,PI,的值存储在类中,2.2.3 数据成员(,续,),例2_5,类与对象,40,对类变量进行测试,public class,ClassVariableTester,public static void main(String,args,) ,Circle,x,= new Circle();,System.out.,println,(,x.PI,);,System.out.,println,(,Circle.PI,);,Circle.PI,= 3.14;,System.out.,println,(,x.PI,);,System.out.,println,(,Circle.PI,);,测试结果,3.14159265,3.14159265,3.14,3.14,2.2.3 数据成员(,续,),例2_5运行结果,类与对象,41,声明一个,Point,类,有两个私有变量保存点坐标,一个类变量保存已有点的个数,public class Point,private,int,x;,private,int,y;,public,static,int,pointCount,=0;,public Point(,int,x,int,y), this.x = x; this.y = y;,pointCount,+;,2.2.3 数据成员(,续,),Point.java,类与对象,42,测试类,ex2_4,class ex2_4,public static void main(String,args,),Point,p,= new Point(1,1);,System.out.,println,(,p.,pointCount,);,Point,q,= new Point(2,2);,System.out.,println,(,q.,pointCount,);,System.out.,println,(q.,pointCount,=,Point.,pointCount,);,System.out.,println,(,Point.,pointCount,);,2.2.3 数据成员(,续,),Point,类测试,类与对象,43,测试结果,1,2,true,2,2.2.3 数据成员(,续,),Point,类测试结果,类与对象,44,实例变量和类变量都可被声明为,final,final,实例变量必须在每个构造方法结束之前赋初值,以保证使用之前会被初始化,final,类变量必须在声明的同时初始化,2.2.3 数据成员(,续,),final,修饰符,类与对象,45,2.2.4 方法成员,方法成员,定义类的行为,一个对象能够做的事情,我们能够从一个对象取得的信息,可以没有,也可以有多个;一旦在类中声明了方法,它就成为了类声明的一部分,分为实例方法和类方法,类与对象,46,声明格式,public,|,protected,|,private,static,final,abstract, ,native, ,synchronized,返回类型,方法名,(参数列表,) throws,exceptionList,方法体,2.2.4 方法成员(,续,),声明格式,类与对象,47,格式说明,方法修饰,public、protected、private,为存取控制符,static,指明方法是一个类方法,final,指明方法是一个终结方法,abstract,指明方法是一个抽象方法,native,用来集成,java,代码和其它语言的代码,synchronized,用来控制多个并发线程对共享数据的访问,2.2.4 方法成员(,续,),格式说明,类与对象,48,格式说明(续),返回类型,方法返回值的类型,可以是任意的,Java,数据类型,当不需要返回值时,返回类型为,void,参数类型,简单数据类型,,引用类型(数组、类或接口),可以有多个参数,也可以没有参数,方法声明时的参数称为形式参数,方法体,方法的实现,包括局部变量的声明以及所有合法的,Java,指令,局部变量的作用域只在该方法内部,throws,exceptionList,用来处理异常,2.2.4 方法成员(,续,),格式说明,类与对象,49,方法调用,给对象发消息意味着调用对象的某个方法,从对象中取得信息,修改对象的状态或进行某种操作,进行计算及取得结果等,调用格式,.,(参数列表),称点操作符,“.”,前面的为消息的接收者(,receiver),参数传递,值传递:参数类型为基本数据类型时,引用传递:参数类型为对象类型或数组时,2.2.4 方法成员(,续,),方法调用,类与对象,50,实例方法,表示特定对象的行为,声明时前面不加,static,修饰符,使用时需要发送给一个类实例,2.2.4 方法成员(,续,),实例方法,类与对象,51,在,Circle,类中声明计算周长的方法,public class Circle ,static double PI = 3.14159265;,int,radius;,public double,circumference(),return 2 * PI * radius;,由于,radius,是实例变量,在程序运行时,,Java,会自动取其接收者对象的属性值,也可将,circumference,方法体改为:,return 2 * PI *,this.,radius;,关键字,this,代表此方法的接收者对象,2.2.4 方法成员(,续,),例2_6,类与对象,52,方法调用测试,public class,CircumferenceTester,public static void main(String,args,) ,Circle,c1,= new Circle();,c1.radius = 50;,Circle,c2,= new Circle();,c2.radius = 10;,double circum1 =,c1.circumference(),;,double circum2 =,c2.circumference(),;,System.out.,println,(Circle 1 has circumference + circum1);,System.out.,println,(Circle 2 has circumference + circum2);,2.2.4 方法成员(,续,),例2_6,类与对象,53,运行结果,Circle 1 has circumference 314.159265,Circle 2 has circumference 62.831853,说明,在使用实例方法时,需要将其发送给一个实例对象(也称给对象发送一条消息),,radius,的值即是接收者对象的值,在执行,c1.circumference(),时,,radius,的值为,c1,的,radius,属性值;在执行,c2.circumference(),时,,radius,的值为,c2,的,radius,属性值,类与对象,2.2.4 方法成员(,续,),例2_6运行结果,54,在,Circle,类及,Rectangle,类中声明计算面积的方法,area(),2.2.4 方法成员(,续,),例2_7,public class Circle ,static double PI = 3.14159265;,int,radius;,public double circumference() ,return 2 * PI * radius;,public double,area(),return PI * radius * radius;,public class Rectangle ,double width;,double height;,public double,area(),return width * height;,类与对象,55,声明测试类,对,Circle,类及,Rectangle,类的,area(),方法进行测试,public class,AreaTester,public static void main(String,args,) ,Circle c = new Circle();,c.radius = 50;,Rectangle r = new Rectangle();,r.width = 20;,r.height = 30;,System.out.,println,(Circle has area + c.area();,System.out.,println,(Rectangle has area + r.area();,类与对象,2.2.4 方法成员(,续,),例2_7,56,运行结果,Circle has area 7853.981625,Rectangle has area 600.0,说明,不同的类中可以声明相同方法名的方法,使用时,系统会根据接收者对象的类型找到相应类的方法,2.2.4 方法成员(,续,),例2_7运行结果,类与对象,57,带参数的方法举例:在,Circle,类中增加方法改变圆的半径,public class Circle ,static double PI = 3.14159265;,int,radius;,public double circumference() ,return 2 * PI * radius;,public double area() ,return PI * radius * radius;,public,void,enlarge,(,int,factor) ,radius = radius * factor;,2.2.4 方法成员(,续,),例2_8,类与对象,58,测试类,public class,EnlargeTester,public static void main(String,args,) ,Circle,c1,= new Circle();,c1.radius = 50;,Circle,c2,= new Circle();,c2.radius = 10;,System.out.,println,(Circle 1,的周长: +,c1.circumference();,System.out.,println,(Circle 2,的周长: +,c2.circumference();,c2.enlarge(4);,System.out.,println,(Circle 2,扩大后的周长: +,c2.circumference();,2.2.4 方法成员(,续,),例2_8,类与对象,59,运行结果,Circle 1,的周长: 314.159265,Circle 2,的周长: 62.831853,Circle 2,扩大后的周长: 251.327412,2.2.4 方法成员(,续,),例2_8运行结果,类与对象,60,以对象作为参数的方法举例:在,Circle,类中增加,fitsInside,方法判断一个圆是否在一个长方形内,需要以,Rectangle,类的对象作为参数,public class Circle ,static double PI = 3.14159265;,int,radius;,public double circumference() ,return 2 * PI * radius;,public void enlarge(,int,factor) ,radius = radius * factor;,public,boolean,fitsInside,(Rectangle r) ,return (2 * radius r.width) ,2.2.4 方法成员(,续,),例2_9,类与对象,61,测试类,public class,InsideTester,public static void main(String,args,) ,Circle,c1,= new Circle();,c1.radius = 8;,Circle,c2,= new Circle();,c2.radius = 15;,Rectangle,r,= new Rectangle();,r.width = 20;,r.height = 30;,System.out.,println,(,Circle 1 fits inside Rectangle:,+,c1.,fitsInside,(,r,),);,System.out.,println,(,Circle 2 fits inside Rectangle:,+,c2.,fitsInside,(,r,),);,2.2.4 方法成员(,续,),例2_9,类与对象,62,运行结果,Circle 1 fits inside Rectangle: true,Circle 2 fits inside Rectangle: false,2.2.4 方法成员(,续,),例2_9运行结果,类与对象,63,类方法,也称为静态方法,表示类中对象的共有行为,声明时前面需加,static,修饰符,不能被声明为抽象的,类方法可以在不建立对象的情况下用类名直接调用,也可用类实例调用,2.2.4 方法成员(,续,),类方法,类与对象,64,将摄氏温度,(,centigrade),转换成华氏温度,(,fahrenheit,),转换公式为,fahrenheit,= centigrade * 9 / 5 + 32,除了摄氏温度值及公式中需要的常量值,此功能不依赖于具体的类实例的属性值,因此可声明为类方法,转换方法,centigradeToFahrenheit,放在类,Converter,中,public class Converter ,public static,int centigradeToFahrenheit,(,int,cent), return (cent * 9 / 5 + 32);,方法调用,Converter.,centigradeToFahrenheit,(40),2.2.4 方法成员(,续,),例2_10,类与对象,65,包,是一组类的集合,一个包可以包含若干个类文件,还可包含若干个包,包的作用,将相关的源代码文件组织在一起,类名的空间管理,利用包来划分名字空间,便可以避免类名冲突,提供包一级的封装及存取权限,2.2.5 类的组织包的概念,类与对象,66,包的命名,每个包的名称必须是“独一无二”的,Java,中包名使用小写字母表示,命名方式建议,将机构的,Internet,域名反序,作为包名的前导,若包名中有任何不可用于标识符的字符,用下划线替代,若包名中的任何部分与关键字冲突,后缀下划线,若包名中的任何部分以数字或其他不能用作标识符起始的字符开头,前缀下划线,2.2.5 类的组织包的概念,类与对象,67,编译单元与类空间,一个,Java,源代码文件称为一个编译单元,由三部分组成,所属包的声明(省略,则属于默认包),Import (,引入)包的声明,用于导入外部的类,类和接口的声明,一个编译单元中只能有一个,public,类,该类名与文件名相同,编译单元中的其他类往往是,public,类的辅助类,经过编译,每个类都会产一个,class,文件,利用包来划分名字空间,便可以避免类名冲突,2.2.5 类的组织包的概念(续),类与对象,68,包的声明,命名的包(,Named Packages,),例如:,package,Mypackage,;,默认包(未命名的包),不含有包声明的编译单元是默认包的一部分,2.2.5 类的组织包的概念(续),类与对象,69,包与目录,Java,使用文件系统来存储包和类,包名就是文件夹名,即目录名,目录名并不一定是包名,用,javac,编译源程序时,如遇到当前目录(包)中没有声明的类,就会以环境变量,classpath,为相对查找路径,按照包名的结构来查找。因此,要指定搜寻包的路径,需设置环境变量,classpath,2.2.5 类的组织包的概念(续),类与对象,70,引入包,为了使用其它包中所提供的类,需要使用,import,语句引入所需要的类,Java,编译器为所有程序自动引入包,java.,lang,import,语句的格式,import package1.package2. (,classname,|*);,其中,package1.package2,表明包的层次,它对应于文件目录,classname,则指明所要引入的类名,如果要引入一个包中的所有类,则可以使用星号(*)来代替类名,类与对象,2.2.5 类的组织包的概念(续),71,类的访问控制,类的访问控制只有,public(,公共类)及无修饰符(缺省类)两种,访问权限符与访问能力之间的关系如表,类与对象,2.2.6 类的访问控制,类型,无修饰,public,同一包中的类,yes,yes,不同包中的类,no,yes,72,类成员的访问控制,公有(,public),可以被其他任何对象访问(前提是对类成员所在的类有访问权限),保护(,protected),只可被同一类及其子类的实例对象访问,私有(,private),只能被这个类本身访问,在类外不可见,默认(,default),仅允许同一个包内的访问;又被称为“包(,package),访问权限”,2.2.6 类成员的访问控制,类与对象,73,类型,private,无修饰,protected,public,同一类,yes,yes,yes,yes,同一包中的,子类,no,yes,yes,yes,同一包中的,非子类,no,yes,yes,yes,不同包中的,子类,no,no,yes,yes,不同包中的,非子类,no,no,no,yes,2.2.6 类成员的访问控制(续),类与对象,74,对例2-6中的,Circle,类声明进行修改,给实例变量加上,private,修饰符,public class Circle ,static double PI = 3.14159265;,private,int,radius;,public double circumference() ,return 2 * PI * radius;,2.2.6 类成员的访问控制(续),例2_11,类与对象,75,再编译,CircumferenceTester,.java,public class,CircumferenceTester,public static void main(String,args,) ,Circle,c1,= new Circle();,c1.radius = 50;,Circle,c2,= new Circle();,c2.radius = 10;,double circum1 = c1.circumference();,double circum2 = c2.circumference();,System.out.,println,(Circle 1 has circumference + circum1);,System.out.,println,(Circle 2 has circumference + circum2);,2.2.6 类成员的访问控制(续),例2_11,类与对象,76,编译时会提示出错,在编译语句“,c1.radius = 50;”,及“,c2.radius =,10;”,时会提示存在语法错误,“,radius has private access in Circle”,说明,由于在,Circle,类声明中变量,radius,被声明为,private,,因此在其它类中不能直接对,radius,进行存取,如果要允许其它类访问,radius,的值,就需要在,Circle,类中声明相应的公有方法。通常有两类典型的方法用于访问属性值,,get,方法及,set,方法,2.2.6 类成员的访问控制(续),例2_11编译,类与对象,77,get,方法,功能是取得属性变量的值,get,方法名以“,get”,开头,后面是实例变量的名字,一般具有以下格式:,public ,get,() ,return ;,对于实例变量,radius,,声明其,get,方法如下:,public,int,getRadius,(),return radius;,2.2.6 类成员的访问控制(续),get,方法,类与对象,78,set,方法,功能是修改属性变量的值,set,方法名以“,set”,开头,后面是实例变量的名字,一般具有以下格式,public void,set,( ) , = ;,声明实例变量,radius,的,set,方法如下:,public void,setRadius,(,int,r),radius = r;,2.2.6 类成员的访问控制(续),set,方法,类与对象,79,关键字,this,的使用,如果形式参数名与实例变量名相同,则需要在实例变量名之前加,this,关键字,否则系统会将实例变量当成形式参数。,在上面的,set,方法中,如果形式参数为,radius,,则需要在成员变量,radius,之前加上关键字,this。,代码如下:,public void,setRadius,(,int,radius),this,.radius = radius;,2.2.6 类成员的访问控制(续),set,方法,类与对象,80,2.3 对象初始化和回收,对象初始化,系统在生成对象时,会为对象分配内存空间,并自动调用,构造方法,对实例变量进行初始化,对象回收,对象不再使用时,系统会调用,垃圾回收程序,将其占用的内存回收,81,2.3.1 构造方法,构造方法,一种和类同名的特殊方法,用来初始化对象,Java,中的每个类都有构造方法,用来初始化该类的一个新的对象,没有定义构造方法的类,系统自动提供默认的构造方法,对象初始化和回收,82,构造方法的特点,方法名与类名相同,没有返回类型,修饰符,void,也不能有,通常被声明为公有的(,public),可以有任意多个参数,主要作用是完成对象的初始化工作,不能在程序中显式的调用,在生成一个对象时,系统会自动调用该类的构造方法为新生成的对象初始化,2.3.1 构造方法(续),对象初始化和回收,83,系统提供的默认构造方法,如果在类的声明中没有声明构造方法,则,Java,编译器会提供一个默认的构造方法,默认的构造方法没有参数,其方法体为空,使用默认的构造方法初始化对象时,如果在类声明中没有给实例变量赋初值,则对象的属性值为零或空,对象初始化和回收,2.3.1 构造方法(续),默认构造方法,84,声明一个银行帐号类及测试代码,public class,BankAccount,String,ownerName,;,int,accountNumber,;,float,balance,;,public class,BankTester,public static void main(String,args,),BankAccount,myAccount,= new,BankAccount,();,System.out.,println,(,ownerName,= +,myAccount,.,ownerName,);,System.out.,println,(,accountNumber,= +,myAccount,.,accountNumber,);,System.out.,println,(balance= +,myAccount,.,balance,);,2.3.1 构造方法(续),例2_12(使用默认构造方法),对象初始化和回收,85,运行结果,ownerName,=null,accountNumber,=0,balance=0.0,对象初始化和回收,2.3.1 构造方法(续),例2_12运行结果,86,自定义构造方法与方法重载,可在生成对象时给构造方法传送初始值,使用希望的值给对象初始化,构造方法可以被重载,构造方法的重载和方法的重载一致,一个类中有两个及以上同名的方法,但参数表不同,这种情况就被称为方法重载。在方法调用时,,Java,可以通过参数列表的不同来辨别应调用哪一个方法,对象初始化和回收,2.3.1 构造方法(续),自定义构造方法,87,为,BankAccount,声明一个有三个参数的构造方法,public,BankAccount,(String,initName,int initAccountNumber, float,initBalance,) ,ownerName,=,initName,;,accountNumber,=,initAccountNumber,;,balance =,initBalance,;,假设一个新帐号的初始余额可以为0,则可增加一个带有两个参数的构造方法,public,BankAccount,(String,initName,int initAccountNumber,) ,ownerName,=,initName,;,accountNumber,=,initAccountNumber,;,balance = 0.0f;,对象初始化和回收,2.3.1 构造方法(续),例2_13,88,自定义无参的构造方法,无参的构造方法对其子类的声明很重要。如果在一个类中不存在无参的构造方法,则要求其子类声明时必须声明构造方法,否则在子类对象的初始化时会出错,在声明构造方法时,好的声明习惯是,不声明构造方法,如果声明,至少声明一个无参构造方法,对象初始化和回收,2.3.1 构造方法(续),自定义无参构造方法,89,构建一个,Bush,类,有两个有参数的构造方法,class Bush ,Bush(,int,i) ,Bush(double d) ,如果写:,new Bush();,编译器将要告诉你找不到对应的构造方法,说明,用户在进行类声明时,如果没有声明任何构造方法,系统会赋给此类一个默认(无参)的构造方法。但是,只要用户声明了构造方法,即使没有声明无参的构造方法,系统也不再赋默认的构造方法,2.3.1 构造方法(续),Bush.java,对象初始化和回收,90,在例2_13基础上再声明一个无参的构造方法,public,BankAccount,() ,ownerName,= ;,accountNumber,= 999999;,balance = 0.0f;,对象初始化和回收,2.3.1 构造方法(续),例2_14,91,创建一个拥有两个构造方法的,Tree,类,一个有参,一个无参。,import java.util.*;,class Tree,int,height;,Tree(),prt,(Planting a seedling); height = 0; ,Tree(,int,i),prt,(Creating new Tree that is + i + feet tall);,height = i;,void,info(),prt,(Tree is + height + feet tall); ,void,info(String s),prt,(s + : Tree is + height + feet tall); ,static void,prt,(String s) System.out.,println,(s); ,2.3.1 构造方法(续),Tree.java,对象初始化和回收,92,测试,Tree,类,public class Overloading,public static void main(String,args,),for(,int,i = 0; i 5; i+),Tree t = new Tree(i);,t.info();,t.info(overloaded method);,new Tree();,2.3.1 构造方法(续),Overloading.java,对象初始化和回收,93,测试结果,Creating new Tree that is 0 fe
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 教学培训


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!