《2014下第4章 面向对象编程.ppt》由会员分享,可在线阅读,更多相关《2014下第4章 面向对象编程.ppt(104页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第4章章面向对象编程面向对象编程主要任务主要任务:理解面向对象编程的基本概念理解面向对象编程的基本概念了解类的封装方法了解类的封装方法如何创建类和对象如何创建类和对象了解成员变量和成员方法的特性了解成员变量和成员方法的特性学习使用学习使用OOP方式进行程序设计方式进行程序设计本章主要内容本章主要内容l1.面向对象基本概念面向对象基本概念l2.Java的类与对象的类与对象l3.成员变量与访问权限成员变量与访问权限l4.成员方法成员方法4.1面向对象基本概念面向对象基本概念lJava是完全面向对象编程语言。面向对是完全面向对象编程语言。面向对象编程(象编程(OOP)是一种全新的编程理)是一种全新
2、的编程理念。念。l什么是对象?类又是什么?它们之间有什么是对象?类又是什么?它们之间有什么关系?对象是如何通过消息和外部什么关系?对象是如何通过消息和外部通讯的?通讯的?l下面的内容就讨论这些问题。下面的内容就讨论这些问题。l面向过程就是分析出解决问题所需要的步骤,面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。例如五的时候一个一个依次调用就可以了。例如五子棋,面向过程的设计思路就是首先分析问子棋,面向过程的设计思路就是首先分析问题的步骤:题的步骤:v1、开始游戏,、开始游戏,v2、黑子先走,、
3、黑子先走,v3、绘制画面,、绘制画面,v4、判断输赢,、判断输赢,v5、轮到白子,、轮到白子,v6、绘制画面,、绘制画面,v7、判断输赢,、判断输赢,v8、返回步骤、返回步骤2,v9、输出最后结果。、输出最后结果。l面向对象是把事务分解成各个对象,建立对象面向对象是把事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。而某个事物在整个解决问题的步骤中的行为。而面向对象的设计时整个五子棋可以分为:面向对象的设计时整个五子棋可以分为:v1、黑白双方,这两方的行为是一模一样的,、黑白双方,这两方的行为是一模
4、一样的,v2、棋盘系统,负责绘制画面,、棋盘系统,负责绘制画面,v3、规则系统,负责判定诸如犯规、输赢等。、规则系统,负责判定诸如犯规、输赢等。面向对象面向对象技术基础知识技术基础知识1.面向对象的基本思想面向对象的基本思想l面向对象是一种程序设计方法。面向对象是一种程序设计方法。l基本思想:使用对象、类、继承、封装、消息等基基本思想:使用对象、类、继承、封装、消息等基本概念来进行程序设计。本概念来进行程序设计。l优点:优点:符合人们日常自然的思维习惯(符合人们日常自然的思维习惯(因为它是因为它是从现实从现实世界中客观存在的事物(即对象)出发来构造软件世界中客观存在的事物(即对象)出发来构造软
5、件系统,并且在系统构造中尽可能运用人类的自然思系统,并且在系统构造中尽可能运用人类的自然思维方式)。维方式)。降低、分解问题的难度和复杂性,提高整个求解降低、分解问题的难度和复杂性,提高整个求解过程的可控制性、可监视性、可扩充性和可维护性过程的可控制性、可监视性、可扩充性和可维护性面向对象技术基础知识面向对象技术基础知识2.面向对象的设计思想面向对象的设计思想7分析问题时,不再分解其每一个过程。而是分析问题时,不再分解其每一个过程。而是l首先要考虑的是该问题域中涉及到哪些类(对象)首先要考虑的是该问题域中涉及到哪些类(对象)l这些类(对象)各有哪些属性和方法;这些类(对象)各有哪些属性和方法;
6、l这些类(对象)之间的关系如何。这些类(对象)之间的关系如何。面向对象技术面向对象技术基础知识基础知识3.类与对象之间的关系类与对象之间的关系8对象对象是表示现实世界中某个具体的事物;类类是对对象的抽象描述。张三 类(CLASS)如:“man class”对对象进行抽象为类对类进行实例化4.1.1对象对象l在开发软件的信息世界中,对象定义为在开发软件的信息世界中,对象定义为相关数据和方法的集合。相关数据和方法的集合。l对象是现实世界对象的抽象模型。从现对象是现实世界对象的抽象模型。从现实世界对象中抽象出来的对象,一般通实世界对象中抽象出来的对象,一般通过变量描述其状态,通过方法实现其行过变量描
7、述其状态,通过方法实现其行为。为。l变量是一种有名称的数据实体,而方法变量是一种有名称的数据实体,而方法则是和对象相关的函数或过程。则是和对象相关的函数或过程。l对象是类的实例。对象是类的实例。类类汽车汽车对象对象具体具体客车客车抽象抽象实例化实例化4.1.2类类l类就是对象的软件图纸、模板或原型,它定类就是对象的软件图纸、模板或原型,它定义了同类对象共有的变量和方法。义了同类对象共有的变量和方法。l类和对象二者不太容易区分。一方面,由于类和对象二者不太容易区分。一方面,由于软件对象都是现实对象或抽象概念的电子模软件对象都是现实对象或抽象概念的电子模型,另一方面,经常不加区分地将对象和类型,另
8、一方面,经常不加区分地将对象和类统称为统称为“对象对象”。lJava编程就是编程就是设计类设计类,可以采用自定义方法,可以采用自定义方法或继承方法设计一个类,然后使用它的实例或继承方法设计一个类,然后使用它的实例对象完成具体的功能。对象完成具体的功能。l类是具有共同特性和行为的事物的抽象,类是具有共同特性和行为的事物的抽象,是一种特殊数据类型。在类中包含了数是一种特殊数据类型。在类中包含了数据和与数据有关的操作(方法)。据和与数据有关的操作(方法)。汽车类计算机中计算机中的对象的原型的对象的原型 现实生活现实生活中的对象中的对象创建Car类例例1:classCarintcolor;intcar
9、_number;Stringcar_brand;intspeed;voidadd_oil()/方法体方法体voidspeedUp()/方法体方法体voidslowDown()/方法体方法体 定义共定义共有的方法有的方法 定义共定义共有的变量有的变量l类是类是java中一种复合的数据类型,创建一个中一种复合的数据类型,创建一个新类,就是创建一种新的数据类型。新类,就是创建一种新的数据类型。l实例化一个类,就得到一个对象。实例化一个类,就得到一个对象。l类有两种基本成分:变量和方法,成为成员类有两种基本成分:变量和方法,成为成员变量和成员方法。变量和成员方法。l类的成员变量可以是基本数据类型的数据
10、或类的成员变量可以是基本数据类型的数据或数组或类的实例。数组或类的实例。l方法在类中定义,调用方法是完成消息传递。方法在类中定义,调用方法是完成消息传递。l类提供外界访问其成员的权限。类提供外界访问其成员的权限。classAprivateinta;publicvoidsetA(intx)a=x;publicintgetA()returna;publicclassClassDemopublicstaticvoidmain(Stringargs)Aa=newA();a.setA(5);inti=a.getA();System.out.print(“i=“+i);4.1.3封装封装l封装的含义是把类
11、设计成一个黑箱,使封装的含义是把类设计成一个黑箱,使用者只能看见类中定义的公共方法,而用者只能看见类中定义的公共方法,而看不到方法实现的细节,也不能直接对看不到方法实现的细节,也不能直接对类的数据进行操作,迫使用户通过接口类的数据进行操作,迫使用户通过接口去访问数据。去访问数据。l相关数据和方法封装到一个包里,为程相关数据和方法封装到一个包里,为程序员带来了两个好处:序员带来了两个好处:模块化和数据隐模块化和数据隐藏藏。4.1.4消息消息l对象的行为由方法来实现,对象的行为由方法来实现,消息传递是消息传递是对象之间进行交互的主要方式对象之间进行交互的主要方式。l构成消息的三个要素是:构成消息的
12、三个要素是:接收消息的对象接收消息的对象接收消息后进行处理的方法接收消息后进行处理的方法方法所需要的参数方法所需要的参数4.1.5继承继承l继承(继承(inheritance)不但可以发生在同一个层)不但可以发生在同一个层次上,也可以发生在不同层次上。所有层次的次上,也可以发生在不同层次上。所有层次的类都是从类都是从Object类那里直接或间接地衍生下来类那里直接或间接地衍生下来的。一般来说,的。一般来说,层次越高,类就越抽象,反之层次越高,类就越抽象,反之层次越高,类就越抽象,反之层次越高,类就越抽象,反之类就越具体类就越具体类就越具体类就越具体。l继承使父类的代码得到重用,在继承父类提供继
13、承使父类的代码得到重用,在继承父类提供的共同特性基础上添加新的代码,有效提高了的共同特性基础上添加新的代码,有效提高了编程效率。编程效率。父类子类一般一般 特殊特殊Car(superclass)Trash_CarSports_CarTaxi(subclass)在如图的继承关系中,在如图的继承关系中,CarCar具有一般性,它具有所有汽车的共性,是父类。具有一般性,它具有所有汽车的共性,是父类。Trash_CarTrash_Car、Sports_CarSports_Car、TaxiTaxi作为汽车类的子类,具有一切汽车的共性,还作为汽车类的子类,具有一切汽车的共性,还具有各自的特性。为什么要使用
14、继承呢,它的具有各自的特性。为什么要使用继承呢,它的好处好处在那里呢?在那里呢?l可将多个类共有的功能放在一个超类中,这样就可以在更底层的子类中重复使可将多个类共有的功能放在一个超类中,这样就可以在更底层的子类中重复使用这些功能,使编程不必一切从头开始,提高了编程效率。同时也允许子类添加用这些功能,使编程不必一切从头开始,提高了编程效率。同时也允许子类添加自己特有的属性和操作,这样可以让程序员更专注于编写子类特有的代码,不仅自己特有的属性和操作,这样可以让程序员更专注于编写子类特有的代码,不仅减少了代码的数量,而且提高了代码的质量;减少了代码的数量,而且提高了代码的质量;l对超类的修改将自动反
15、映到其所有的子类、子类的子类当中,而无需修改或重对超类的修改将自动反映到其所有的子类、子类的子类当中,而无需修改或重新编译更底层的类,他们将通过继承获得新的信息。新编译更底层的类,他们将通过继承获得新的信息。4.1.6接口接口l接口(接口(interface)可以看成是为两个不相关)可以看成是为两个不相关的实体提供交流途径的设备。的实体提供交流途径的设备。在在Java中,接中,接口就是为两个不相关的类提供交流的设备。口就是为两个不相关的类提供交流的设备。接口非常类似于协议(接口非常类似于协议(protocol一种共同行为一种共同行为的约定),是一个包含方法定义和常量值的的约定),是一个包含方法
16、定义和常量值的集合。集合。l接口不需要建立继承关系,就可以使两个不接口不需要建立继承关系,就可以使两个不相关的类进行交互。接口提取了类的某些共相关的类进行交互。接口提取了类的某些共同点,声明一些能被多个类实现的方法,但同点,声明一些能被多个类实现的方法,但不给出方法体不给出方法体。例例4.1设计一个设计一个Applet小程序,使其可以进行小程序,使其可以进行简单的加法运算。简单的加法运算。/源程序名:源程序名:Addition.javaimportjava.awt.*;importjava.awt.event.*;importjava.applet.Applet;publicclassAddi
17、tionextendsAppletimplementsActionListenerLabellabel1=newLabel(+);Labellabel2=newLabel(=);TextFieldfield1=newTextField(6);TextFieldfield2=newTextField(6);TextFieldfield3=newTextField(6);Buttonbutton1=newButton(相加相加);publicvoidinit()/初始化初始化add(field1);add(label1);add(field2);add(label2);add(field3);ad
18、d(button1);button1.addActionListener(this);publicvoidactionPerformed(ActionEvente)/处理按钮事件处理按钮事件intx=Integer.parseInt(field1.getText()+Integer.parseInt(field2.getText();field3.setText(Integer.toString(x);/数值转数值转换为字符串换为字符串4.2Java的类与对象的类与对象lJava程序的所有数据类型都是用类来实现的,程序的所有数据类型都是用类来实现的,Java语言是建立在类这个逻辑结构之上,所语
19、言是建立在类这个逻辑结构之上,所以以Java是一种完全面向对象的程序设计语言。是一种完全面向对象的程序设计语言。l类是类是Java的核心,的核心,Java程序都由类组成,一程序都由类组成,一个程序至少要包含一个类,也可以包含多个个程序至少要包含一个类,也可以包含多个类。类。对象是类的实例对象是类的实例,Java程序中可以使用程序中可以使用标识符表示对象,并通过对象引用类中的变标识符表示对象,并通过对象引用类中的变量和方法。量和方法。4.2.1类的创建类的创建l类通过关键字类通过关键字class来创建,下面的声明语句来创建,下面的声明语句格式给出了可能出现的符号和顺序:格式给出了可能出现的符号和
20、顺序:publicabstractfinalextends父类父类implements接口接口其中,其中,表示为可选项,表示为可选项,表示为必选项。表示为必选项。关键字含义说明如下:关键字含义说明如下:1class类名类名lclass关键字告诉编译器这是一个类,类关键字告诉编译器这是一个类,类名是可以自由选取但必须是合法的标识名是可以自由选取但必须是合法的标识符。符。l在声明类的语句中,在声明类的语句中,class前面的关键字前面的关键字称为类的修饰符。称为类的修饰符。2访问限制修饰词访问限制修饰词l(1)public(公共的)(公共的)带有带有public修饰符的类,称为公共类,是访问限制最
21、修饰符的类,称为公共类,是访问限制最宽宽的修的修饰词,饰词,公共类可以被任何包中的类使用公共类可以被任何包中的类使用。注意:在同一个源程序文件中只能有一个注意:在同一个源程序文件中只能有一个public类。类。l(2)private(私有的)(私有的)带有带有private修饰符的类,称为私有类,是访问限制最修饰符的类,称为私有类,是访问限制最窄窄的的修饰词,只能被该类的对象访问,其子类不能访问,更不能跨修饰词,只能被该类的对象访问,其子类不能访问,更不能跨包访问包访问。l(3)protect(保护的)(保护的)带有带有protect修饰符的类,称为保护类,修饰符的类,称为保护类,能被该类的对
22、象与能被该类的对象与子类访问,即使子类在不同包中也可以子类访问,即使子类在不同包中也可以。l(4)default(默认的)(默认的)带有带有default修饰符的类,称为默认类,与没有任何修饰符相修饰符的类,称为默认类,与没有任何修饰符相同,默认情况下,类只能被同一个包中的其他类访问。同,默认情况下,类只能被同一个包中的其他类访问。293Abstract(抽象的)(抽象的)l有时,定义的类代表了一个抽象的概念,就有时,定义的类代表了一个抽象的概念,就不能用它来实例化一个对象。不能用它来实例化一个对象。l同样在同样在OOP中,可能建立了一个不需要产生中,可能建立了一个不需要产生对象的类。例如,对
23、象的类。例如,java.lang包中的包中的Number类类代表了数这个抽象概念,可以用它在程序中代表了数这个抽象概念,可以用它在程序中产生一个数的子类,如产生一个数的子类,如Interger或或Float,但,但从从Number中直接生成对象是没有意义的。中直接生成对象是没有意义的。labstract说明的类称为抽象类,不能用它实例说明的类称为抽象类,不能用它实例化一个对象,它只能被继承化一个对象,它只能被继承。4final(最终的)(最终的)lfinal说明的类称为最终类。一个最终类说明的类称为最终类。一个最终类不可能有子类,也就是说它不能被继承。不可能有子类,也就是说它不能被继承。l黑客
24、常用的一个攻击技术是设计一个子黑客常用的一个攻击技术是设计一个子类,然后用它替换原来的父类。子类和类,然后用它替换原来的父类。子类和父类很相象,但做的事情却大不一样。父类很相象,但做的事情却大不一样。5Extends(继承)父类名(继承)父类名lextends告诉编译器创建的类是从父类告诉编译器创建的类是从父类继承下来的子类,父类必须是继承下来的子类,父类必须是Java系统系统类或已经定义的类。类或已经定义的类。l从父类继承,可以提高代码的重用性,从父类继承,可以提高代码的重用性,不必从头开始设计程序。大部分情况下不必从头开始设计程序。大部分情况下应该利用继承的手段编程,只在没有合应该利用继承
25、的手段编程,只在没有合适的类可以继承时才自己设计类。适的类可以继承时才自己设计类。6Implements(实现)接口名(实现)接口名limplements告诉编译器类实现的接口,告诉编译器类实现的接口,接口必须有定义,一般为系统类。接口必须有定义,一般为系统类。l接口是消息传递的通道,通过接口,消接口是消息传递的通道,通过接口,消息才能传递到处理方法中进行处理。息才能传递到处理方法中进行处理。implements说明你的类可以实现的一个说明你的类可以实现的一个或多个接口,如果有多个接口,要用逗或多个接口,如果有多个接口,要用逗号分隔。号分隔。例例4.2下面这个下面这个Applet程序将在页面上
26、输出两程序将在页面上输出两个矩形,并伴有文字输出。见图:个矩形,并伴有文字输出。见图:程序代码:程序代码:importjava.awt.*;importjava.applet.Applet;publicclassClass1extendsAppletprivateintx,y,width,height;publicvoidinit()width=60;height=60;publicvoidsetPosition(intxPos,intyPos)x=xPos;y=yPos;publicvoidpaint(Graphicsg)setPosition(20,20);g.drawRect(x,y,w
27、idth,height);g.drawString(矩形矩形1的的X位置位置:+x,20,100);g.drawString(矩形矩形1的的Y位置位置:+y,20,120);setPosition(170,20);g.drawRect(x,y,width,height);g.drawString(矩形矩形2的的X位置位置:+x,170,100);g.drawString(矩形矩形2的的Y位置位置:+y,170,120);4.2.2创建对象创建对象l类是对象的产品模板。类是对象的产品模板。在现实世界里,我们在现实世界里,我们使用的是产品而不是产品的图纸。同样道理,使用的是产品而不是产品的图纸。同
28、样道理,Java运行的应该是用类创建的实例化对象。运行的应该是用类创建的实例化对象。l一个典型的一个典型的Java程序会创建很多对象,它们程序会创建很多对象,它们通过消息传递进行相互交流,共同完成程序通过消息传递进行相互交流,共同完成程序的功能。一旦任务完成,对象就会被垃圾收的功能。一旦任务完成,对象就会被垃圾收集器收回,完成它集器收回,完成它从创建、使用到清除的生从创建、使用到清除的生命三步曲命三步曲。l下面介绍对象的创建过程。先看一个例子。下面介绍对象的创建过程。先看一个例子。例例4.3下面这个程序是改写后的例下面这个程序是改写后的例4.2。importjava.awt.*;importj
29、ava.applet.Applet;publicclassClass2extendsAppletMyBoxb1=newMyBox();MyBoxb2=newMyBox(170,20,60,60);publicvoidpaint(Graphicsg)b1.setPosition(20,20);b1.setSize(60,60);b1.draw(g);g.drawString(矩形矩形1的的X位置位置:+b1.getX(),20,100);g.drawString(矩形矩形1的的Y位置位置:+b1.getY(),20,120);b2.draw(g);g.drawString(矩形矩形2的的X位置位
30、置:+b2.getX(),b2.getX(),b2.getY()+80);g.drawString(矩形矩形2的的Y位置位置:+b2.getY(),b2.getX(),b2.getY()+100);程序代码:程序代码:classMyBoxprivateintx,y,width,height;MyBox()x=0;y=0;width=0;height=0;MyBox(intxPos,intyPos,intw,inth)x=xPos;y=yPos;width=w;height=h;publicvoidsetPosition(intxPos,intyPos)x=xPos;y=yPos;publicv
31、oidsetSize(intw,inth)width=w;height=h;publicintgetX()returnx;publicintgetY()returny;publicvoiddraw(Graphicsg)g.drawRect(x,y,width,height);下面给出创建对象和使用对象的方法说明下面给出创建对象和使用对象的方法说明l1创建对象与构造方法创建对象与构造方法首先必须拥有一个合适的类才能创建一个合首先必须拥有一个合适的类才能创建一个合适的对象,有了合适的对象才能完成合适的适的对象,有了合适的对象才能完成合适的工作。工作。下面的三条语句分别创建了三个对象:下面的三条语句
32、分别创建了三个对象:Lablelabel1=newLabel(标签标签);TextFieldfield1=newTextField(10);MyBoxb1=newMyBox(20,20,100,100);创建对象语句创建对象语句l创建对象语句有三个组成部分:声明对创建对象语句有三个组成部分:声明对象、实例化、初始化。象、实例化、初始化。格式为:格式为:=new(参参数列表数列表)创建对象创建对象l创建对象相当于定义一个变量,既可采用上创建对象相当于定义一个变量,既可采用上述方法,也可以把上述步骤分开进行,先声述方法,也可以把上述步骤分开进行,先声明对象,再实例化对象,进行初始化。明对象,再实例
33、化对象,进行初始化。(1)声明对象)声明对象如:如:MyBoxb2(2)实例化和初始化)实例化和初始化=new(参数列表参数列表)MyBoxb2=newMyBox(20,20,100,100);2对象初始化的说明对象初始化的说明l(1)系统如何对变量初始化)系统如何对变量初始化变量声明后没有赋值,在使用变量时变量声明后没有赋值,在使用变量时会出现错误。当用会出现错误。当用new创建了一个对象创建了一个对象时,系统会为对象中的变量进行初始化。时,系统会为对象中的变量进行初始化。l(2)构造方法的作用与构成)构造方法的作用与构成new操作符为对象分配内存后将调用类操作符为对象分配内存后将调用类的构
34、造方法确定对象的初始状态,初始的构造方法确定对象的初始状态,初始化所有变量。也就是说,对象的初始化化所有变量。也就是说,对象的初始化任务要靠构造方法来完成。任务要靠构造方法来完成。例例4.3中定义的两个构造方法:中定义的两个构造方法:MyBox()x=0;y=0;width=0;height=0;MyBox(intxPos,intyPos,intWidth,intHeight)x=xPos;y=yPos;width=Width;height=Height;构造方法比较构造方法比较l第一个是缺省的构造方法第一个是缺省的构造方法MyBox(),没,没有任何参数,它把有任何参数,它把MyBox类的类
35、的4个成员个成员变量赋值为变量赋值为0。l第二个构造方法第二个构造方法MyBox(int,int,int,int)有有4个参数,创建对象时可以传递个参数,创建对象时可以传递4个参个参数给数给MyBox类赋初值。类赋初值。lMyBox()和和MyBox(int,int,int,int)同同为类为类MyBox的构造方法,方法名相同而的构造方法,方法名相同而参数不同,这是类的参数不同,这是类的多态性多态性的体现。的体现。3对象的使用对象的使用l创建对象时,一个对象的所有变量和方法创建对象时,一个对象的所有变量和方法代码(包含对象的类的变量和方法)都被代码(包含对象的类的变量和方法)都被读到专为它开辟
36、的内存区域中。为了让解读到专为它开辟的内存区域中。为了让解释器知道代码的内存地址,使用对象的任释器知道代码的内存地址,使用对象的任何成员时都要加上引用。即在变量和方法何成员时都要加上引用。即在变量和方法的前面加上对象名,并用圆点的前面加上对象名,并用圆点.分隔。格式分隔。格式为:为:.4清除对象清除对象l使用使用new操作符创建对象后,操作符创建对象后,Java虚拟机虚拟机自动为该对象分配内存并保持跟踪。自动为该对象分配内存并保持跟踪。Java虚拟机对不再被引用的对象释放其虚拟机对不再被引用的对象释放其占用的内存。占用的内存。这种定期寻找不再使用的这种定期寻找不再使用的对象并自动释放对象占用内
37、存的过程称对象并自动释放对象占用内存的过程称为垃圾收集。为垃圾收集。lJava虚拟机实际上是利用变量生存期来虚拟机实际上是利用变量生存期来管理内存的,对象的引用被保存在变量管理内存的,对象的引用被保存在变量中,中,当程序跳出变量所在的区域后,它当程序跳出变量所在的区域后,它就会被自动清除。就会被自动清除。OOP的基本思想的基本思想lOOP的基本思想:的基本思想:抽象、封装、继承抽象、封装、继承等。等。l封装是抽象的具体实现。封装就是用操封装是抽象的具体实现。封装就是用操作方法把数据封闭到类中,形成以数据作方法把数据封闭到类中,形成以数据为核心,以方法为外壳的类。封装能保为核心,以方法为外壳的类
38、。封装能保护类的数据免受外界的更改。封装的结护类的数据免受外界的更改。封装的结果是形成了独立的和完整的程序模块。果是形成了独立的和完整的程序模块。4.3成员变量与访问权限成员变量与访问权限l成员变量描述了类和对象的状态,有时成员变量描述了类和对象的状态,有时也称为属性、数据、域(也称为属性、数据、域(field)。)。l对成员变量的操作实际上就是改变类和对成员变量的操作实际上就是改变类和对象的状态,使之能满足程序的需要。对象的状态,使之能满足程序的需要。与类相似,成员变量也有很多修饰符,与类相似,成员变量也有很多修饰符,用来控制对成员变量的访问,实现对类用来控制对成员变量的访问,实现对类和对象
39、的封装。和对象的封装。4.3.1成员变量的声明成员变量的声明l例例4.4显示当前日期和时间,运行结果见图:显示当前日期和时间,运行结果见图:importjava.awt.Graphics;importjava.applet.Applet;importjava.util.Calendar;classTimeprivateCalendart;privateinty,m,d,hh,mm,ss;程序代码:程序代码:Time()t=Calendar.getInstance();y=t.get(t.YEAR);m=t.get(t.MONTH)+1;d=t.get(t.DATE);hh=t.get(t.HO
40、UR_OF_DAY);mm=t.get(t.MINUTE);ss=t.get(t.SECOND);publicStringgetDate()returny+年年+m+月月+d+日日;publicStringgetTime()Strings=hh+时时+mm+分分+ss+秒秒;returns;publicclassShowTimeextendsAppletTimet=newTime();publicvoidpaint(Graphicsg)g.drawString(当前日期:当前日期:+t.getDate(),50,40);g.drawString(当前时间:当前时间:+t.getTime(),5
41、0,80);4.3.2成员变量的修饰成员变量的修饰l成员变量的声明语句有如下格式:成员变量的声明语句有如下格式:publicprivateprotectedpackage/访问控制修饰符访问控制修饰符staticfinaltransientvolatile1访问控制权限访问控制权限l(1)public公共变量公共变量由由public修饰的变量称为公共变量,只有在确认修饰的变量称为公共变量,只有在确认任何外部访问都不会带来不良后果的情况下才将任何外部访问都不会带来不良后果的情况下才将成员声明为公共的。公共变量没有秘密可言,不成员声明为公共的。公共变量没有秘密可言,不具有数据保护功能。具有数据保护
42、功能。l(2)private私有变量私有变量由由private修饰的变量称为私有变量,只能被声明修饰的变量称为私有变量,只能被声明它的类所使用,拒绝任何外部类的访问。私有变它的类所使用,拒绝任何外部类的访问。私有变量是不公开的是对类进行封装时使用的主要方法。量是不公开的是对类进行封装时使用的主要方法。l(3)protected受保护变量受保护变量由由protected修饰的变量称为受保护变量,可被声修饰的变量称为受保护变量,可被声明它的类和派生的子类以及同一个包中的类访问。明它的类和派生的子类以及同一个包中的类访问。l(4)package包变量包变量由由package修饰的变量称为包变量,修饰
43、的变量称为包变量,在声明时在声明时常常省略常常省略package关键字。关键字。包成员可被声明它的包成员可被声明它的类和同一个包中的其它类(包括派生子类)所访类和同一个包中的其它类(包括派生子类)所访问,在其它包中的子类则不能访问父类的包成员。问,在其它包中的子类则不能访问父类的包成员。2static静态变量静态变量lstatic声明的成员变量被视为类的成员声明的成员变量被视为类的成员变量,而不把它当作实例对象的成员变变量,而不把它当作实例对象的成员变量。量。换句话说,静态变量是类固有的,换句话说,静态变量是类固有的,可以直接引用,其它成员变量仅仅被声可以直接引用,其它成员变量仅仅被声明,生成
44、实例对象后才存在,才可以被明,生成实例对象后才存在,才可以被引用。引用。基于这样的事实,也把静态变量基于这样的事实,也把静态变量称为类变量,非静态变量称为实例变量。称为类变量,非静态变量称为实例变量。相应地,静态方法称为类方法,非静态相应地,静态方法称为类方法,非静态方法称为实例方法。方法称为实例方法。例例4.5静态变量的使用。静态变量的使用。classStaticDemostaticintx;inty;staticpublicintgetX()returnx;staticpublicvoidsetX(intnewX)x=newX;程序代码:程序代码:publicintgetY()return
45、y;publicvoidsetY(intnewY)y=newY;publicclassShowDemopublicstaticvoidmain(Stringargs)System.out.println(静态变量静态变量x=+StaticDemo.getX();System.out.println(实例变量实例变量y=+StaticDemo.getY();/非法,编译时将非法,编译时将出错出错StaticDemoa=newStaticDemo();StaticDemob=newStaticDemo();a.setX(1);a.setY(2);b.setX(3);b.setY(4);System
46、.out.println(静态变量静态变量a.x=+a.getX();System.out.println(实例变量实例变量a.y=+a.getY();System.out.println(静态变量静态变量b.x=+b.getX();System.out.println(实例变量实例变量b.y=+b.getY();对上面的源程序进行编译会出现如图所示结果,对上面的源程序进行编译会出现如图所示结果,不能进行运行该程序。不能进行运行该程序。运行结果显示:运行结果显示:将源程序中的出错语句删除或使用解释符将源程序中的出错语句删除或使用解释符/隐藏起来如:隐藏起来如:/System.out.print
47、ln(“实例变量实例变量y=”+StaticDemo.getY();/非法,编译时将出错,非法,编译时将出错,再进行编译,即可执行该程序,结果如图所示。再进行编译,即可执行该程序,结果如图所示。从输出结果中可以得出以下几点结论从输出结果中可以得出以下几点结论:l类的静态变量可以直接引用,例如在程序中类的静态变量可以直接引用,例如在程序中直接使用了直接使用了StaticDemo.getX(),而非静态变,而非静态变量则不行。类的静态变量相当于某些程序语量则不行。类的静态变量相当于某些程序语言的全局变量。言的全局变量。l静态方法只能使用静态变量,不能使用实例静态方法只能使用静态变量,不能使用实例变
48、量。变量。l类的静态变量只有一个版本,所有实例对象类的静态变量只有一个版本,所有实例对象引用的都是同一个版本。引用的都是同一个版本。l对象实例化后,每个实例变量都被制作了一对象实例化后,每个实例变量都被制作了一个副本,它们之间互不影响。个副本,它们之间互不影响。3final最终变量最终变量l一旦成员变量被声明为一旦成员变量被声明为final,在程序运,在程序运行中将不能被改变。这样的成员变量就行中将不能被改变。这样的成员变量就是一个常量。例如:是一个常量。例如:finaldoublePI=3.14159;l该语句声明一个常量该语句声明一个常量PI,如果在后面试,如果在后面试图重新对它赋值,将产
49、生编译错误。另图重新对它赋值,将产生编译错误。另外,常量名一般用大写字母。常量和直外,常量名一般用大写字母。常量和直接量一样不占用内存空间。接量一样不占用内存空间。4transient过渡变量过渡变量lJava语言目前对语言目前对transient修饰符没有明修饰符没有明确说明,它一般用在对象序列化确说明,它一般用在对象序列化(objectserialization)上,说明成员变)上,说明成员变量不许被序列化。量不许被序列化。5volatile易失变量易失变量lvolatile声明的成员变量为易失变量,用声明的成员变量为易失变量,用来防止编译器对该成员进行某种优化。来防止编译器对该成员进行某
50、种优化。这是这是Java语言的高级特性,仅被少数程语言的高级特性,仅被少数程序员使用。序员使用。4.4成员方法成员方法l对象的行为由类的方法实现,其它对象对象的行为由类的方法实现,其它对象可以调用一个对象的方法,通过消息的可以调用一个对象的方法,通过消息的传递实现对该对象行为的控制。传递实现对该对象行为的控制。l下面讨论如何通过方法影响对象的行为。下面讨论如何通过方法影响对象的行为。4.4.1成员方法的设计成员方法的设计l类的设计集中体现在成员方法的设计上。类的设计集中体现在成员方法的设计上。良好的设计可以使类更加强壮,功能更良好的设计可以使类更加强壮,功能更加完善。成员方法的设计应该从类的整