《第3章抽象与封装.ppt》由会员分享,可在线阅读,更多相关《第3章抽象与封装.ppt(79页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第3章抽象与封装 3.1 抽象与封装的实现技术 实现抽象和封装实现抽象和封装 类和对象类和对象 一个对象包含了若干个成员变量和成员方法,它是现实世一个对象包含了若干个成员变量和成员方法,它是现实世界中特定实体在程序中的具体体现。其中,成员变量反映界中特定实体在程序中的具体体现。其中,成员变量反映实体的属性状态,成员方法反映实体具有的行为能力,这实体的属性状态,成员方法反映实体具有的行为能力,这些内容的规格描述将由类承担,类是对具有类似特征的对些内容的规格描述将由类承担,类是对具有类似特征的对象的抽象说明,对象是类的实例。象的抽象说明,对象是类的实例。对象体的构成起/终点、线形、粗细和颜色绘制直
2、线获取属 性值设置属 性值成员方法3.2 类 3.2.1 3.2.1 类的定义类的定义 JavaJava语言中语言中,类主要有两个来源途径类主要有两个来源途径JavaJava类库类库 用户自定义的类用户自定义的类所有的类都是所有的类都是ObjectObject类的子类。如果在自定义类类的子类。如果在自定义类时,没有写明父类,则默认的父类为时,没有写明父类,则默认的父类为ObjectObject。从严从严格意义上讲格意义上讲,Java,Java程序中定义的所有类都是子类。程序中定义的所有类都是子类。最简单的类定义格式为 class ClassNameClassBody /类体类体 classcl
3、ass为关键字,为关键字,ClassNameClassName为定义的类名称为定义的类名称ClassBodyClassBody为类体,包含为类体,包含成员变量、成员方成员变量、成员方法法、类、接口、构造方法、静态初始化器类、接口、构造方法、静态初始化器 类的一般定义格式修饰符修饰符 class 类名类名 extends 父类名父类名 implements 接口名接口名 类成员变量声明;类成员变量声明;类方法声明;类方法声明;类的UML表示一个类的一个类的UMLUML图形表示如图图形表示如图 一个Box类的UML表示 BOXBOX类的类的UMLUML表示表示Box类的定义 public clas
4、s Box int long,width,height;void setLong(int longValue)long=longValue;void setWidth(int widthValue)width=widthValue;void setHeight(int heightValue)height=heightValue;void setBox(int longValue,int widthValue,int heightValue)long=longValue;width=widthValue;height=heightValue;int getLong()return long;i
5、nt getWidth()return width;int getHeight()return height;JAVAJAVA类的存储类的存储有两种存储方式:有两种存储方式:一种是将两个类定义存放在一个文件中一种是将两个类定义存放在一个文件中(最多最多只能有一个公有类只能有一个公有类)另一种是将两个类分别存放在两个不同的文件中另一种是将两个类分别存放在两个不同的文件中不管类定义的源代码是多个类存放在一个不管类定义的源代码是多个类存放在一个文件中,还是一个类存放在一个文件中,文件中,还是一个类存放在一个文件中,编译后都将一个类生成一个字节码文件,编译后都将一个类生成一个字节码文件,且文件名的且文
6、件名的前缀为前缀为类名类名,后缀为后缀为.class.class 含有属于另外一个类的含有属于另外一个类的成员变量成员变量的典型例子的典型例子 class Date int year,month,day;/描述年、月、日的三个成员变量描述年、月、日的三个成员变量 void setYear(int y)year=y;void setMonth(int m)month=m;void setDay(int d)day=d;void setDate(int y,int m,int d)year=y;month=m;day=d;int getYear()return year;int getMonth(
7、)return month;int getDay()return day;BookBook类定义类定义class Book /书籍类书籍类 String name;String author;Date publishDate;float price;/其他一些成员变量其他一些成员变量 /成员方法成员方法 DateDate是描述日期的类,是描述日期的类,BookBook是描述书籍的类。是描述书籍的类。在在BookBook类类中,设一个表示出版日期的成员变量,它属于中,设一个表示出版日期的成员变量,它属于DateDate类。类。BookBook类与类与DateDate类关系类关系可以将这两个类看成
8、具有可以将这两个类看成具有“整体整体-部分部分”的关系。即的关系。即BookBook类是类是由由DateDate类对象和一些其他类型的成员变量类对象和一些其他类型的成员变量组合而成的,它们共同地反映了书籍信息。下面是组合而成的,它们共同地反映了书籍信息。下面是这种关系的这种关系的UMLUML图形符号:图形符号:3.2.2 3.2.2 成员变量的定义与初始化成员变量的定义与初始化 实例变量的定义实例变量的定义(不用(不用static修饰)修饰)ModifiersModifiers DataTypeDataType MemberNameMemberName;ModifiersModifiers:修
9、饰符修饰符,决定成员变量的存储方式和访问权限决定成员变量的存储方式和访问权限DataTypeDataType:成员变量的类型成员变量的类型(基本数据类型或引用类型)(基本数据类型或引用类型)MemberNameMemberName:是成员变量的名称是成员变量的名称(符合标识符命名规则和命(符合标识符命名规则和命名规范)名规范)成员变量和成员方法两种形式成员变量和成员方法两种形式 实例变量和实例方法实例变量和实例方法 每个变量和方法惟一地与一个对象相关联,即每个变量和方法惟一地与一个对象相关联,即在创建某个对象时,同时为每个对象创建所有实例在创建某个对象时,同时为每个对象创建所有实例变量的副本,
10、关联所有的实例方法变量的副本,关联所有的实例方法类变量和类方法类变量和类方法(后续章节)(后续章节)long=200width=300;height=500成员方法成员方法box1long=100width=250;height=400成员方法成员方法box2box1.getLong()=200box2.getLong()=100初始化实例变量主要有初始化实例变量主要有5 5个途径个途径q每个数据类型有默认的初始值每个数据类型有默认的初始值q可以在定义的同时赋予相应的初值可以在定义的同时赋予相应的初值q利用初始化块对成员变量进行初始化利用初始化块对成员变量进行初始化q在一个成员方法中在一个成员
11、方法中,为每个实例变量赋值为每个实例变量赋值q在类的构造方法中实现初始化实例变量在类的构造方法中实现初始化实例变量初始化块、构造方法初始化成员变量初始化块、构造方法初始化成员变量 class Point int x,y;/初始化块初始化块(创建对象时,首先调用初始化快,后构造方法)(创建对象时,首先调用初始化快,后构造方法)x=10;y=20;System.out.println(Point initialization block);Point();/无参数的构造方法无参数的构造方法 Point(int dx,int dy)/带两个参数的构造方法带两个参数的构造方法 x=dx;y=dy;Sy
12、stem.out.println(Point construct method);3.2.3 3.2.3 成员方法的定义成员方法的定义 成员方法主要承担外部操作对象属性的成员方法主要承担外部操作对象属性的作用作用。在一个类中,至少应该包含对类。在一个类中,至少应该包含对类中的每个成员变量赋值,获取每个成员变量中的每个成员变量赋值,获取每个成员变量的当前值等功能的一系列成员方法。的当前值等功能的一系列成员方法。成员方法也包含成员方法也包含静态(静态(staticstatic)和和非静态非静态两种形式,分别被称为两种形式,分别被称为类方法类方法和和实例方法实例方法。实例方法实例方法 定义格式为:定
13、义格式为:Modifiers ResultType MethodName(parameterList)throws exceptions MethodBody Modifiers:Modifiers:修饰符修饰符 ResultTypeResultType:方法返回类型方法返回类型MethodNameMethodName:方法名称方法名称parameterListparameterList:参数列表参数列表(调用该方法时传递的参数格式)(调用该方法时传递的参数格式)throws exceptions:throws exceptions:列出方法能够抛出的异常种类列出方法能够抛出的异常种类 时间类
14、时间类TimeTime的定义的定义public class Time /时间类时间类 int hour,minute,second;/时、分、秒时、分、秒 void setTime(int h,int m,int s)/设置时间设置时间 hour=(h0)?0:h%24;minute=(m0):0;m%60;second=(s0):0;s%60;int getHour()return hour;/返回时返回时 int getMinute()return minute;/返回分返回分 int getSecond()return second;/返回秒返回秒 成员方法中处理的数据主要来源途径成员方
15、法中处理的数据主要来源途径 q传递给成员方法的参数传递给成员方法的参数q类中的成员变量,包括实例变量和类变量类中的成员变量,包括实例变量和类变量q在方法体内定义的局部变量在方法体内定义的局部变量q在方法中调用其他成员方法所得到的返回值在方法中调用其他成员方法所得到的返回值3.2.4 3.2.4 成员方法的重载成员方法的重载 重载重载 在一个类中,同一个名称的成员方法可在一个类中,同一个名称的成员方法可以被以被定义多次定义多次的现象的现象 。一个成员方法重载的例子一个成员方法重载的例子 在在TimeTime类,我们又增加了一个设置时间的成员类,我们又增加了一个设置时间的成员方法,但这个成员方法的
16、参数属于方法,但这个成员方法的参数属于StringString类,时间类,时间将以将以“12:04:35”12:04:35”的格式传递给该成员方法的格式传递给该成员方法 class Time int hour,minute,second;void setTime(double h,double m,double s)/参数为三个参数为三个int变量变量 hour=(h0)?0:h%24;minute=(m0)?0:m%60;second=(s0)?0:s%60;void setTime(String time)/参数为一个参数为一个String类对象类对象 hour=Integer.parse
17、Int(time.substring(0,1);hour=hour0?0:hour%24;minute=Integer.parseInt(time.substring(3,4);minute=minute0?0:minute%60;second=Integer.parseInt(time.substring(6,7);second=second0?0:second%60;int getHour()return hour;int getMinute()return minute;int getSecond()return second;/end of class Timepublic class
18、 TestTime /测试类测试类public static void main(String args)Time t=new Time();/创建创建Time对象对象 t.setTime(13:04:20);/调用参数为调用参数为String 的的setTime()方法方法 System.out.println(t.getHour()+:“+t.getMinute()+:“+t.getSecond();t.setTime(20,30,38);/调用参数为三调用参数为三个个int的的setTime()方方法法 System.out.println(t.getHour()+:“+t.getMin
19、ute()+:+t.getSecond()将上面这两个类定义存储在一个文件名为将上面这两个类定义存储在一个文件名为TestTime.javaTestTime.java中。经过编译生成中。经过编译生成Time.class和和TestTime.class 运行的结果为:运行的结果为:13:4:2013:4:20 20:30:38 20:30:38 3.2.5 3.2.5 构造方法构造方法构造方法构造方法 在构造类对象时使用的一种特殊的成员方在构造类对象时使用的一种特殊的成员方法,其主要作用是初始化成员变量法,其主要作用是初始化成员变量(无返回(无返回数据类型)数据类型)。构造方法的定义格式为:构造
20、方法的定义格式为:public ClassName(parameterList)publicpublic:控制访问权限的修饰符控制访问权限的修饰符ClassNameClassName:类名称类名称parameterListparameterList:参数表参数表 简单的例子简单的例子class Point int x,y,;Point(int dx,int dy)x=dx;y=dy;/其他的成员方法其他的成员方法 构造方法构造方法PointPoint(intint dx,intdx,int dydy)仅对两个成员变量仅对两个成员变量x x和和y y赋予了初值。在利用赋予了初值。在利用newne
21、w运算符创建运算符创建PointPoint类对象时,类对象时,系统会自动地调用这个构造方法,实现对实例变量初始化,系统会自动地调用这个构造方法,实现对实例变量初始化,而不需要用户显式地调用它,而不需要用户显式地调用它,每个构造方法默认返回一个每个构造方法默认返回一个自身对象的引用。自身对象的引用。Point ptpt=new =new Point(10,20);(10,20);(请思考请思考:利用构造方法初始化成员变量与取默认值或通过初利用构造方法初始化成员变量与取默认值或通过初始化快初始化成员变量的区别始化快初始化成员变量的区别?)?)构造方法的重载构造方法的重载public class T
22、ime int hour,minute,second;Time(int h,int m,int s)/含有三含有三个个int类型参数的构造方法类型参数的构造方法 Time(long time)/含有一个含有一个long类型参数的构造方法类型参数的构造方法 Time(String time)/含有一个含有一个String类参数的构造方法类参数的构造方法 void setTime(int h,int m,int s)int getHour()int getMinute()int getSecond()在这个类中,有三个构造方法,它们的参数表均不相同。在这个类中,有三个构造方法,它们的参数表均不相同
23、。这样,就可以用三种不同形式的参数创建并初始化对象。这样,就可以用三种不同形式的参数创建并初始化对象。TimeTime tm1=new tm1=new TimeTime(10,20,30),tm2=new(10,20,30),tm2=new TimeTime(110610),(110610),tm3=new tm3=new TimeTime(“5:10:40”);(“5:10:40”);默认构造方法默认构造方法 如果在定义类的时候,没有定义任何构如果在定义类的时候,没有定义任何构造方法,系统将提供一个参数表为空的造方法,系统将提供一个参数表为空的默认默认构造方法构造方法。在这个默认的构造方法的
24、方法体。在这个默认的构造方法的方法体中,只有一个调用父类无参数构造方法的语中,只有一个调用父类无参数构造方法的语句句super()super(),如果定义了构造方法,系统就如果定义了构造方法,系统就不再提供默认构造方法。不再提供默认构造方法。例如:例如:public class Pointint x,y;/其他的成员方法其他的成员方法等价于等价于public class Pointint x,y;public Point()super();/其他的成员方法其他的成员方法 Point pt=new Point();3.3 对 象 对象是对现实世界中实体进行映射的结对象是对现实世界中实体进行映射的
25、结果,现实世界中的任何实体都可以映射成对果,现实世界中的任何实体都可以映射成对象,而解决问题的过程就是对对象分析、处象,而解决问题的过程就是对对象分析、处理的过程。从面向对象程序设计的观点看,理的过程。从面向对象程序设计的观点看,程序是由程序是由有限个对象有限个对象构成的,对象是程序操构成的,对象是程序操作的基本单位。作的基本单位。所谓程序运行,就是对象之所谓程序运行,就是对象之间不断地发送消息及响应消息的过程。间不断地发送消息及响应消息的过程。3.3.1 3.3.1 对象的创建对象的创建声明对象的语法格式为:声明对象的语法格式为:ClassNameClassName objectName,o
26、bjectNameobjectName,objectName;例如:例如:Date Date dateObjectdateObject;Time Time timeObject1timeObject1,timeObject2timeObject2;newnew运算符运算符newnew运算符主要完成的操作运算符主要完成的操作:一为对象分配存储空间一为对象分配存储空间 二根据提供的参数格式调用与之匹配的构造方法二根据提供的参数格式调用与之匹配的构造方法创建对象的格式为:创建对象的格式为:new ClassName(parameterList)ClassName:对象所属的类名称对象所属的类名称pa
27、rameterList:创建对象时提供的参数创建对象时提供的参数例如例如:dateObject=new Date(2003,5,23,10,34,56)public class Time int hour,minute,second;Time(int h,int,m,int s)/含有含有三个三个int类型参数的构造方法类型参数的构造方法 Time(long time)/含有一个含有一个long类型参数的构造方法类型参数的构造方法 Time(String time)/含有一个含有一个String类参数的构造方法类参数的构造方法 void setTime(int h,int m,int s)in
28、t getHour()int getMinute()int getSecond()Time timeObject1=new Time(09,20,45);Time timeObject2=new Time(“14:50:24”);Hour=14Minute=50Second=24成员方法成员方法Hour=09Minute=20Second=45成员方法成员方法成员方法成员方法 所有对象共享一个成员方法的代码副所有对象共享一个成员方法的代码副本本(每个对象只存储代码区地址每个对象只存储代码区地址)。每个每个成员方法都有一个成员方法都有一个this引用型变量,指向引用型变量,指向不同的对象。不同的
29、对象。timeObject1timeObject23.3.2 3.3.2 对象成员的使用对象成员的使用 对象创建后,就可以在对象之间相互发送对象创建后,就可以在对象之间相互发送及响应消息,以便驱动程序的运作。在及响应消息,以便驱动程序的运作。在JavaJava语语言中,所谓言中,所谓对象发送消息就是发出调用自身或对象发送消息就是发出调用自身或其他类对象的成员方法的命令,其他类对象的成员方法的命令,所谓对象响应所谓对象响应消息就是具体地执行上述的调用命令消息就是具体地执行上述的调用命令。在对对象操作时,可能会引用成员变量或调在对对象操作时,可能会引用成员变量或调用成员方法。下面是引用成员变量和调
30、用成员用成员方法。下面是引用成员变量和调用成员方法的语法格式。方法的语法格式。objectName.memberVariableNameobjectName.memberMethodName(parameterList)调用对象成员方法实际上就是向该对象发送调用对象成员方法实际上就是向该对象发送请求操作的消息请求操作的消息 timeObject1.setTime(10,20,30);例例 3.3.1 3.3.1 对象作为数组元素对象作为数组元素 class ScoreClass /成绩类成绩类 int No;/学号学号 int score;/成绩成绩 ScoreClass()/无参数的构造方法
31、无参数的构造方法 No=1000;score=0;ScoreClass(int n,int s)/有两个参数的构造方法有两个参数的构造方法 No=n;score=s;void setInfo(int n,int s)/设置成绩设置成绩 No=n;score=s;int getNo()return No;/获取学号获取学号 int getScore()return Score;/获取成绩获取成绩 public class ScoreTest /测试类测试类public static void main(String args)ScoreClass student=new ScoreClass10
32、;/声明并创建一维数组声明并创建一维数组 for(int i=0;i10;i+)studenti=new ScoreClass(1000+i,(int)(Math.random()*100);/创建对象创建对象 for(int i=0;i10;i+)System.out.println(studenti.getNo()+t+studenti.getScore();可见,如果数组元素为对象,需要经过下面几个操作步骤:可见,如果数组元素为对象,需要经过下面几个操作步骤:首先要利用首先要利用newnew运算符创建数组。此时,每个数组元素为运算符创建数组。此时,每个数组元素为nullnull引用。引用
33、。再利用循环结构,为每个数组元素创建对象。再利用循环结构,为每个数组元素创建对象。通过引用成员变量或调用成员方法对数组中每个对象进行操作。通过引用成员变量或调用成员方法对数组中每个对象进行操作。例例 3.3.2 3.3.2 类中的成员变量为对象类中的成员变量为对象 class Point /点坐标点坐标int x,y;/x、y坐标坐标Point()x=0;y=0;Point(int dx,int dy)x=dx;y=dy;void setXY(int dx,int dy)x=dx;y=dy;/设置设置x、yint getX()return x;/返回返回xint getY()return y;
34、/返回返回ypublic String toString()/将坐标信息转换将坐标信息转换成成String形式形式 return(+x+,+y+);class Rect /矩形类矩形类Point leftTop,rightBottom;/矩形左上角坐标矩形左上角坐标,右下角坐标右下角坐标Rect()leftTop=new Point();rightBottom=new Point();Rect(int x1,int y1,int x2,int y2)leftTop=new Point(x1,y1);rightBottom=new Point(x2,y2);Rect(Point lefttop,
35、Point rightbottom)leftTop=lefttop;rightBottom=rightbottom;Point getLeftTop()return leftTop;/返回左上角坐返回左上角坐标标Point getRightBottom()return rightBottom;/返回右下角坐返回右下角坐标标public String toString()/将矩形信息转换成将矩形信息转换成String形形式式 return leftTop.toString()+rightBottom.toString();/end of class Rectpublic class RectTe
36、st /测试类测试类public static void main(String args)Rect r1,r2,r3;Point p1,p2;r1=new Rect(10,20,30,40);p1=new Point();p2=new Point(100,100);r2=new Rect(p1,p2);r3=new Rect();System.out.println(r1:+r1.toString();System.out.println(r2:+r2.toString();System.out.println(“r3”+r3.toString();运行这个程序后,应该得到如图所示的结果运行
37、这个程序后,应该得到如图所示的结果通过这个例子,可以看出,对于含有成员对象的通过这个例子,可以看出,对于含有成员对象的类,类,首先要创建每个成员对象首先要创建每个成员对象,然后才能对其进行,然后才能对其进行操作。建议最好将它们放置在构造方法中实现。操作。建议最好将它们放置在构造方法中实现。3.3.3 3.3.3 对象的清除对象的清除 创建对象的主要任务是为对象分配存储空间,创建对象的主要任务是为对象分配存储空间,而清除对象的主要任务是回收存储空间。为了而清除对象的主要任务是回收存储空间。为了提高系统资源的利用率提高系统资源的利用率,JavaJava语言提供了语言提供了“自自动回收垃圾动回收垃圾
38、”的机制。即在的机制。即在JavaJava程序的运行过程序的运行过程中,系统会周期地监控对象是否还被使用,程中,系统会周期地监控对象是否还被使用,如果发现某个对象不再被使用,就自动地回收如果发现某个对象不再被使用,就自动地回收为其分配的存储空间。为其分配的存储空间。(finializefinialize()()方法方法)3.4 3.4 访问属性控制访问属性控制 定义的每一个类和接口,以及其中的每一定义的每一个类和接口,以及其中的每一个成员变量和成员方法都存在是否可以被他个成员变量和成员方法都存在是否可以被他人访问的访问属性。人访问的访问属性。不同的访问属性,标识不同的访问属性,标识着不同的可访
39、问性。着不同的可访问性。所谓可访问性是一种在所谓可访问性是一种在编译时确定的静态特性。编译时确定的静态特性。在在JavaJava语言中,也语言中,也正是利用访问属性机制实现正是利用访问属性机制实现数据隐藏数据隐藏,限制,限制用户对不同包和类的访问权限。用户对不同包和类的访问权限。4 4种访问属性种访问属性 q默认访问属性默认访问属性 qpublicpublic(公有)访问属性公有)访问属性 qprivateprivate(私有)访问属性私有)访问属性 qprotectedprotected(保护)访问属性保护)访问属性 为类、接口、成员变量和成员方法指定为类、接口、成员变量和成员方法指定访问属
40、性的格式为:访问属性的格式为:public|private|protected ClassName;public|private|protected memberVariableName;public|private|protected memberMethodName(parameterList);由于除默认访问属性外,指定其他三种访由于除默认访问属性外,指定其他三种访问属性需要写在定义之前,所以,又将它们问属性需要写在定义之前,所以,又将它们称为称为修饰符修饰符。3.4.1 3.4.1 默认访问属性默认访问属性 如果在定义类、接口、成员变量和成员方如果在定义类、接口、成员变量和成员方法时法
41、时没有指定访问修饰符没有指定访问修饰符,它们的访问属性,它们的访问属性就为就为默认访问属性默认访问属性。具有默认访问属性的。具有默认访问属性的类类、成员变量和成员方法,、成员变量和成员方法,只能被本类和同只能被本类和同一个包中的其他类、接口及成员方法引用一个包中的其他类、接口及成员方法引用。3.4.2 public3.4.2 public访问属性访问属性 拥有拥有publicpublic访问属性的类、接口、成员访问属性的类、接口、成员变量、成员方法可以被变量、成员方法可以被本类本类和和其他任何类及其他任何类及成员方法引用成员方法引用。它们既可以位于同一个包。它们既可以位于同一个包中,也可以位于
42、不同包中。中,也可以位于不同包中。例例 3.4.13.4.1不同包之间的类访问不同包之间的类访问 下面定义的三个下面定义的三个类类Point、Line和和Test分别放在两个分别放在两个不同的包中。其定义如下:不同的包中。其定义如下:package PointPackage;/将将Point和和Line类放入类放入PointPackage包包public class Point public int x,y;public void move(int dx,int dy)x+=dx;y+=dy;/其他的成员方法其他的成员方法 ;class Line Point start,end;Line()s
43、tart=new Point();end=new Point();public setLine(Point p1,Point p2)./其他的成员方法其他的成员方法 ;将将Point和和Line类定义保存类定义保存为为Point.java文件。文件。package PointsUser;/将将Test类放入类放入PointsUser包包import PointPackage.*;/加载加载PointPackage包中的包中的Pointpublic class Test/和和Line类类 public static void main(String args)Point p=new Point(
44、);System.out.println(p.x+p.y);将这个类定义保存为将这个类定义保存为Test.java文件。文件。3.4.3 private3.4.3 private访问属性访问属性privateprivate访问属性可以应用于访问属性可以应用于类中的成员类中的成员,包括,包括成员变量、成员方法和内部类或内部接口。具有成员变量、成员方法和内部类或内部接口。具有privateprivate访问属性的成员只能被本类访问属性的成员只能被本类直接引用直接引用。数据隐藏是面向对象的程序设计倡导的设计思数据隐藏是面向对象的程序设计倡导的设计思想。将数据与其操作封装在一起,并将数据的组织想。将数
45、据与其操作封装在一起,并将数据的组织隐藏起来,利用成员方法作为对外的操作接口,将类隐藏起来,利用成员方法作为对外的操作接口,将类定义中的数据成员设置定义中的数据成员设置为为privateprivate访问属性访问属性是实现是实现数据隐藏机制的最佳方式。数据隐藏机制的最佳方式。3.4.4 protected3.4.4 protected访问属性访问属性 具有具有protectedprotected访问属性的类成员可以被访问属性的类成员可以被本类、本包和其他包中的子类本类、本包和其他包中的子类访问。它的可访问。它的可访问性介于访问性介于默认默认和和publicpublic之间。如果你希望之间。如果
46、你希望只对本包之外的子类开放,就应该将其指定只对本包之外的子类开放,就应该将其指定为为protectedprotected访问属性。访问属性。归纳上述归纳上述4 4种不同的访问属性,可以将各种不同的访问属性,可以将各种访问属性的可访问权限总结在表中种访问属性的可访问权限总结在表中:同一个类同一个包不同包中的子类不同包中的非子类private可以不不不默认可以可以不不protected可以可以可以不public可以可以可以 可以3.5 3.5 静态成员静态成员3.5.1 3.5.1 类变量的定义及初始化类变量的定义及初始化 在类中定义成员变量时,如果在访问属性修饰在类中定义成员变量时,如果在访问
47、属性修饰符之后,加上符之后,加上staticstatic修饰符,它们就属于静态成修饰符,它们就属于静态成员。例如:员。例如:public static int staticMember;静态成员变量只在加载类时创建一个副本,不静态成员变量只在加载类时创建一个副本,不管未来创建多少个这个类的对象,都将共享这一个管未来创建多少个这个类的对象,都将共享这一个副本副本。3.5 3.5 静态成员静态成员public class student public int No;protected float score;public static float salary;/每个月的生活补贴每个月的生活补贴
48、static salary=80;public student(int stuNo,float stuScore)No=stuNo;score=stuScore;public int getNo()return No;public float getScore()return score;3.5 3.5 静态成员静态成员No=31score=90score=89No=32No=33score=93No=34score=98Salary=80student1student2student3student4student student1=new student(31,90);student st
49、udent2=new student(32,89);student student3=new student(33,93);student student4=new student(34,98);student.salary=80;Student1.salary=80;Student4.salary=80;Student.salary=80;类变量的引用类变量的引用 由于类被加载后,就立即创建类变量,所以即由于类被加载后,就立即创建类变量,所以即使在该类没有创建一个对象的时候,类变量也已经使在该类没有创建一个对象的时候,类变量也已经存在。若在此时引用类变量,就只能存在。若在此时引用类变量,就只
50、能用类名作为前用类名作为前缀缀。如果创建了该类的对象,则。如果创建了该类的对象,则既可以通过类名引既可以通过类名引用类变量,也可以通过对象名引用类变量用类变量,也可以通过对象名引用类变量。类变量不能在构造方法中初始化。类变量不能在构造方法中初始化。因为构造方因为构造方法只有在创建对象时才被调用,而类变量在没有创法只有在创建对象时才被调用,而类变量在没有创建对象之前就已经存在,并可以被引用;另外每创建对象之前就已经存在,并可以被引用;另外每创建一个对象,构造方法就要被调用一次,而类变量建一个对象,构造方法就要被调用一次,而类变量应该只被初始化一次。应该只被初始化一次。类变量的初始化器类变量的初始