《第3章类和对象.ppt》由会员分享,可在线阅读,更多相关《第3章类和对象.ppt(114页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、面向对象的程序设计第第3章章类类和对象和对象雷擎雷擎对外经济贸易大学信息学院对外经济贸易大学信息学院面向对象的程序设计对外经济贸易大学 雷擎content3.1面向对象程序设计的概念面向对象程序设计的概念3.2类和对象类和对象3.3内部类内部类3.4对象的初始化和清除对象的初始化和清除3.5包包实验:类的定义和使用实验:类的定义和使用面向对象的程序设计对外经济贸易大学 雷擎3.1面向对象程序设计的概念面向对象程序设计的概念o面向对象的程序设计面向对象的程序设计n与结构化程序设计方法相比,更符合人类认识与结构化程序设计方法相比,更符合人类认识现实世界的思维方式现实世界的思维方式n已成为程序设计的
2、主流方向已成为程序设计的主流方向n涉及的主要概念涉及的主要概念o抽象抽象o封装封装o继承继承o多态多态面向对象的程序设计对外经济贸易大学 雷擎1.抽象抽象o忽略问题中与当前目标无关的方面,以便更忽略问题中与当前目标无关的方面,以便更充分地注意与当前目标有关的方面充分地注意与当前目标有关的方面o计算机软件开发中所使用的抽象有计算机软件开发中所使用的抽象有n数据抽象数据抽象(数据和操作结合在一起数据和操作结合在一起)n过程抽象过程抽象(功能划分,隐藏具体实现细节功能划分,隐藏具体实现细节)面向对象的程序设计对外经济贸易大学 雷擎抽象例子抽象例子1:学生选课学生选课classStudentintst
3、id;Stringstname;classCourseintcoid;Stringconame;inttotal;intrest;Studentstudents;面向对象的程序设计对外经济贸易大学 雷擎抽象例子抽象例子1:学生选课学生选课o学生学生n数据数据(属性属性)ointstid;oString stname;n方法方法(行为行为)ovoidregisterCourse();ovoidunRegCourse();面向对象的程序设计对外经济贸易大学 雷擎抽象例子抽象例子2:钟表:钟表o数据数据(属性属性)ninthour;nintminute;nintsecond;o方法方法(行为行为)n
4、voidsetTime();nvoidshowTime();面向对象的程序设计对外经济贸易大学 雷擎抽象例子抽象例子3:灯:灯o数据数据(属性属性)nbooleanstatus;o方法方法(行为行为)nvoidon();nvoidoff();面向对象的程序设计对外经济贸易大学 雷擎2.封装封装o是一种信息隐蔽技术是一种信息隐蔽技术o利用抽象数据类型将数据和基于数据的操作利用抽象数据类型将数据和基于数据的操作封装在一起封装在一起o用户只能看到对象的封装界面信息,对象的用户只能看到对象的封装界面信息,对象的内部细节对用户是隐蔽的内部细节对用户是隐蔽的o封装的目的在于将对象的使用者和设计者分封装的目
5、的在于将对象的使用者和设计者分开,使用者不必知道行为实现的细节,只需开,使用者不必知道行为实现的细节,只需使用设计者提供的消息来访问对象使用设计者提供的消息来访问对象面向对象的程序设计对外经济贸易大学 雷擎封装的定义封装的定义o清楚的边界清楚的边界n所有对象的内部信息被限定在这个边界内所有对象的内部信息被限定在这个边界内o接口接口n对象向外界提供的方法,外界可以通过这些方对象向外界提供的方法,外界可以通过这些方法与对象进行交互法与对象进行交互o受保护的内部实现受保护的内部实现n功能的实现细节,不能从类外访问。功能的实现细节,不能从类外访问。面向对象的程序设计对外经济贸易大学 雷擎封装例子:钟表
6、封装例子:钟表privateinthour;privateminute;privatesecond;publicvoidsetTime();publicshowTime();面向对象的程序设计对外经济贸易大学 雷擎封装的意义封装的意义o在面向对象的程序设计中,在面向对象的程序设计中,类类封装了数据及封装了数据及对数据的操作,是程序中的对数据的操作,是程序中的最小模块最小模块o禁止了外界直接操作类中的数据禁止了外界直接操作类中的数据,模块与模,模块与模块之间只能通过严格控制的接口进行交互,块之间只能通过严格控制的接口进行交互,这使得模块之间的偶合度大大降低这使得模块之间的偶合度大大降低o保证了模
7、块具有较好的保证了模块具有较好的独立性独立性,程序维护和,程序维护和修改较为容易修改较为容易面向对象的程序设计对外经济贸易大学 雷擎3.继承继承o是指新的类可以获得是指新的类可以获得已有类(称为超类、已有类(称为超类、基类或父类)的属性基类或父类)的属性和行为,称新类为已和行为,称新类为已有类的派生类(也称有类的派生类(也称为子类)为子类)o在继承过程中派生类在继承过程中派生类继承了基类的特性,继承了基类的特性,包括方法和实例变量包括方法和实例变量o派生类也可修改继承派生类也可修改继承的方法或增加新的方的方法或增加新的方法,使之更适合特殊法,使之更适合特殊的需要的需要o有助于解决软件的可有助于
8、解决软件的可重用性问题,使程序重用性问题,使程序结构清晰,降低了编结构清晰,降低了编码和维护的工作量码和维护的工作量面向对象的程序设计对外经济贸易大学 雷擎4.多态多态o一个程序中同名的不同方法共存一个程序中同名的不同方法共存o主要通过子类对父类方法的覆盖来实现主要通过子类对父类方法的覆盖来实现o不同类的对象可以响应同名的消息不同类的对象可以响应同名的消息(方法方法),具体,具体的实现方法却不同的实现方法却不同o使语言具有灵活、抽象、行为共享、代码共享的优使语言具有灵活、抽象、行为共享、代码共享的优势,很好地解决了应用程序方法同名问题势,很好地解决了应用程序方法同名问题面向对象的程序设计对外经
9、济贸易大学 雷擎面向对象程序设计面向对象程序设计o基本组成单位是类基本组成单位是类o程序在运行时由类生成对象,对象是面向对程序在运行时由类生成对象,对象是面向对象程序的核心象程序的核心o对象之间通过发送消息进行通信,互相协作对象之间通过发送消息进行通信,互相协作完成相应功能完成相应功能面向对象的程序设计对外经济贸易大学 雷擎对象对象o现实世界中现实世界中n万物皆对象万物皆对象n都具有都具有各自的属性,对外界都呈现各自的行为各自的属性,对外界都呈现各自的行为o程序中程序中n一切都是对象一切都是对象n都具有标识都具有标识(identity),属性和行为属性和行为(方法方法)o通过一个或多个变量来保
10、存其状态通过一个或多个变量来保存其状态o通过方法通过方法(method)实现他的行为实现他的行为面向对象的程序设计对外经济贸易大学 雷擎类类o将属性及行为相同或相似的对象归为一类将属性及行为相同或相似的对象归为一类o类可以看成是对象的抽象,代表了此类对象类可以看成是对象的抽象,代表了此类对象所具有的共有属性和行为所具有的共有属性和行为o在面向对象的程序设计中,每一个对象都属在面向对象的程序设计中,每一个对象都属于某个特定的类于某个特定的类面向对象的程序设计对外经济贸易大学 雷擎Java中类与对象的关系中类与对象的关系o类是一种复合数据类型,是类是一种复合数据类型,是Java程序的基程序的基本组
11、成要素,描述了一类对象的状态和行为,本组成要素,描述了一类对象的状态和行为,其基本成分包括:其基本成分包括:n成员变量成员变量n成员方法成员方法o类相当于程序中数据类型,对象是一个具体类相当于程序中数据类型,对象是一个具体的变量。的变量。BACK面向对象的程序设计对外经济贸易大学 雷擎3.2类和对象类和对象o3.2.1类的定义类的定义o3.2.2对象的创建与使用对象的创建与使用o3.2.3类成员变量类成员变量o3.2.4类成员方法类成员方法o3.2.5静态代码块静态代码块o3.2.6访问控制访问控制BACK面向对象的程序设计对外经济贸易大学 雷擎3.2.1类的定义类的定义o定义形式定义形式pu
12、blicabstract|finalclass类名称类名称 extends父类名称父类名称implements接口名称列表接口名称列表变量成员声明及初始化;变量成员声明及初始化;方法声明及方法体;方法声明及方法体;面向对象的程序设计对外经济贸易大学 雷擎最简单的类最简单的类classLightclassCircleBACK面向对象的程序设计对外经济贸易大学 雷擎3.2.2对象的对象的创建创建与与使使用用o变量和对象变量和对象n变量除了存储基本数据类型的数据,还能存储变量除了存储基本数据类型的数据,还能存储对象的引用,用来存储对象引用的变量称为引对象的引用,用来存储对象引用的变量称为引用变量用变
13、量n类的对象也称为类的实例类的对象也称为类的实例面向对象的程序设计对外经济贸易大学 雷擎创建对象创建对象o创建对象的两个步骤创建对象的两个步骤声明对象名声明对象名分配内存空间分配内存空间面向对象的程序设计对外经济贸易大学 雷擎对象的声明对象的声明o格式格式类名称类名称变量名称变量名称例如例如Circle是已经声明的类名,则下面语句声明是已经声明的类名,则下面语句声明的变量的变量acircle将用于存储该类对象的引用:将用于存储该类对象的引用:CircleaCircle;o声明一个引用变量时并没有对象生成声明一个引用变量时并没有对象生成面向对象的程序设计对外经济贸易大学 雷擎分配内存空间分配内存
14、空间o生成实例的格式:生成实例的格式:new()例如:例如:aCircle=newCircle()n其作用是:其作用是:o在内存中为此对象分配内存空间在内存中为此对象分配内存空间o返回对象的引用返回对象的引用(reference,相当于对象的存储,相当于对象的存储地址地址)o变量可以被赋以空值变量可以被赋以空值例如:例如:aCircle=null;面向对象的程序设计对外经济贸易大学 雷擎类的使用类的使用o格式:格式:对象名对象名.成员成员n成员包括成员方法和成员变量成员包括成员方法和成员变量n例:例:intx=Integer.MAX;System.out.println(Strings);BA
15、CK面向对象的程序设计对外经济贸易大学 雷擎3.2.3类成员变量类成员变量o声明格式声明格式public|protected|privatestaticfinaltransientvolatile变量数据类型变量数据类型变量名变量名1=变量初值变量初值,变量名变量名2=变量初值变量初值,;面向对象的程序设计对外经济贸易大学 雷擎类成员变量的分类类成员变量的分类o类成员变量分为两类:类成员变量分为两类:实例变量实例变量o声明时没有声明时没有static修饰修饰类变量(静态变量)类变量(静态变量)o声明时用声明时用static修饰修饰面向对象的程序设计对外经济贸易大学 雷擎实例变量实例变量o变量声
16、明中没有变量声明中没有static修饰。修饰。o变量所指向的对象必须有创建的步骤变量所指向的对象必须有创建的步骤,如果,如果所属的对象没有被创建,对象就不存在。所属的对象没有被创建,对象就不存在。o所有对象都是实例成员变量。所有对象都是实例成员变量。o引用格式:引用格式:n对象名对象名.实例变量实例变量面向对象的程序设计对外经济贸易大学 雷擎类的实例变量成员的定义类的实例变量成员的定义classLightbooleanstatus=false;/数据类型数据类型变量名初始化值变量名初始化值classCircleintradius=0;面向对象的程序设计对外经济贸易大学 雷擎类变量(静态变量)类
17、变量(静态变量)o声明时需加声明时需加static修饰符修饰符o不管类的对象有多少,类变量只存在一份,在整个不管类的对象有多少,类变量只存在一份,在整个类中只有一个值类中只有一个值o类初始化的同时就被赋值类初始化的同时就被赋值o适用情况适用情况n类中所有对象都相同的属性类中所有对象都相同的属性n经常需要共享的数据经常需要共享的数据n系统中用到的一些常量值系统中用到的一些常量值o引用格式引用格式.面向对象的程序设计对外经济贸易大学 雷擎类变量(静态变量)例子类变量(静态变量)例子classCirclestaticdoublePI=3.1415926535intradius=0;面向对象的程序设计
18、对外经济贸易大学 雷擎Java的类成员变量定义练习的类成员变量定义练习1o用一个类来描述三维空间中的球用一个类来描述三维空间中的球n类名:类名:Balln成员变量:成员变量:球心坐标球心坐标x球心坐标球心坐标y球心坐标球心坐标z半径半径radius颜色颜色colorn定义一个测试类定义一个测试类BallTester,说明两个,说明两个Ball类类型的变量型的变量b1、b2,分别给他们的成员变量赋值,分别给他们的成员变量赋值,并打印出他们的半径。并打印出他们的半径。面向对象的程序设计对外经济贸易大学 雷擎Java的类成员变量定义练习的类成员变量定义练习2o用一个类来定义银行帐号用一个类来定义银行
19、帐号n类名:类名:BankAccountn成员变量成员变量姓名姓名(ownerName)帐号帐号(accountNumber)余额余额(balance)利率利率(rate)/静态变量静态变量n定义一个测试类定义一个测试类BankAccountTester,说明,说明两个两个BankAccount类的变量类的变量b1、b2,分别,分别给他们的成员变量赋值,分别打印出两个变量给他们的成员变量赋值,分别打印出两个变量的各成员变量的各成员变量面向对象的程序设计对外经济贸易大学 雷擎比较实例变量和静态变量的访问比较实例变量和静态变量的访问o在例在例1和例和例2的测试类中:的测试类中:n分别在创建对象之前
20、,使用类名来访问实例变分别在创建对象之前,使用类名来访问实例变量和静态变量,如量和静态变量,如BallTester.color等等n分别在创建对象之后,使用类名来访问实例变分别在创建对象之后,使用类名来访问实例变量和静态变量,如量和静态变量,如BallTester.color等等n比较结果,观察现象比较结果,观察现象BACK面向对象的程序设计对外经济贸易大学 雷擎3.2.4类类成员成员方法方法o成员方法成员方法n定义类的行为定义类的行为o一个对象能够做的事情一个对象能够做的事情o我们能够从一个对象取得的信息我们能够从一个对象取得的信息n类里可以不定义成员方法,也可以定义多个;类里可以不定义成员
21、方法,也可以定义多个;一旦在类中声明了方法,它就成为了类声明的一旦在类中声明了方法,它就成为了类声明的一部分一部分o成员方法分为实例方法和类方法成员方法分为实例方法和类方法面向对象的程序设计对外经济贸易大学 雷擎方法成员方法成员声明声明o声明格式声明格式public|protected|privatestaticfinalabstractnativesynchronized返回类型返回类型方法名方法名(参数列表参数列表)throwsexceptionList方法体方法体面向对象的程序设计对外经济贸易大学 雷擎类成员方法的分类类成员方法的分类o类成员方法分为两类:类成员方法分为两类:实例方法实例
22、方法o声明时没有声明时没有static修饰修饰类方法(静态方法)类方法(静态方法)o声明时用声明时用static修饰修饰面向对象的程序设计对外经济贸易大学 雷擎实例方法实例方法o方法声明中没有方法声明中没有static修饰。修饰。o实例方法表示特定对象的行为实例方法表示特定对象的行为。在使用实例。在使用实例方法之前,必须实例化类,即必须创建引用方法之前,必须实例化类,即必须创建引用变量指向的对象,通过对象来引用。如果对变量指向的对象,通过对象来引用。如果对象没有被创建,则方法就不能调用。象没有被创建,则方法就不能调用。o引用格式:引用格式:n对象名对象名.实例方法实例方法面向对象的程序设计对外
23、经济贸易大学 雷擎常用的实例方法常用的实例方法oset方法和方法和get方法方法nset()是给属性赋值的方法,是给属性赋值的方法,get()是取得属性是取得属性值的方法。值的方法。n在在java程序中成员属性一般用程序中成员属性一般用private限制访限制访问,不允许直接属性直接操作,只能通过问,不允许直接属性直接操作,只能通过set()和和get()访问,使得访问,使得java程序具有很好的封装程序具有很好的封装性和安全性。性和安全性。面向对象的程序设计对外经济贸易大学 雷擎例:例:set方法的定义方法的定义publicclassCircledoubler=0;/成员变量成员变量Stri
24、ngcolor=“white”;/成员变量成员变量publicvoidsetR(doublenum)r=num;/给给r赋值为参数赋值为参数num的值的值publicvoidsetColor(Stringstr)color=str;/给给color赋值为参数赋值为参数str的的值值面向对象的程序设计对外经济贸易大学 雷擎例:例:set方法的引用方法的引用publicclassCircleTesterpublicstaticvoidmain(Stringstr)Circlec1,c2;c1=newCircle();/创建对象创建对象c1.setR(3);c1.setColor(“red”);c2
25、=newCircle();/创建对象创建对象c2.setR(5);c1.setColor(“blue”);面向对象的程序设计对外经济贸易大学 雷擎例:例:get方法的定义方法的定义publicclassCircleprivatedoubler=0;/成员变量成员变量privateStringcolor=“white”;/成员变量成员变量publicdoublegetR()returnr;/返回属性返回属性r的值的值publicStringgetColor()returncolor;/返回返回color的值的值面向对象的程序设计对外经济贸易大学 雷擎例:例:get方法的引用方法的引用public
26、classCircleTesterpublicstaticvoidmain(Stringstr)Circlec1,c2;c1=newCircle();/创建对象创建对象c1.setR(3);c1.setColor(“red”);Sytem.out.println(c1.getR()+”半径半径的球颜色是的球颜色是”+c1.getColor();面向对象的程序设计对外经济贸易大学 雷擎常用的实例方法常用的实例方法otoString方法方法ntoString是是Object类定义的方法,返回的是类定义的方法,返回的是“类名类名hashcode”。可以重新定义,返回自。可以重新定义,返回自己想要的信
27、息。己想要的信息。otoString()方法的几点说明方法的几点说明n必须被声明为必须被声明为publicn返回类型为返回类型为Stringn方法的名称必须为方法的名称必须为toString,且没有参数,且没有参数面向对象的程序设计对外经济贸易大学 雷擎例:例:toString方法重定义方法重定义publicclassCirclepublicStringtoString()return“类名:类名:Ball球的半径:球的半径:”+r+”颜色:颜色:”+color面向对象的程序设计对外经济贸易大学 雷擎例:例:toString方法的引用方法的引用publicclassCircleTesterpu
28、blicstaticvoidmain(Stringstr)Circlec1,c2;System.out.println(c1.toString);System.out.println(c2.toString);面向对象的程序设计对外经济贸易大学 雷擎Java的类成员方法定义练习的类成员方法定义练习1o类定义:类定义:n类名:类名:Balln成员变量:成员变量:球心坐标球心坐标x,y,z半径半径radius颜色颜色colorn成员方法:成员方法:设置半径、获取半径值设置半径、获取半径值设置坐标设置坐标x,y,z获取坐标获取坐标x,y,z计算球体积计算球体积Vn在测试类在测试类BallTester
29、中,设置中,设置b1的各属性变的各属性变量,打印出量,打印出b1的颜色和体积的颜色和体积面向对象的程序设计对外经济贸易大学 雷擎Java的类成员方法定义练习的类成员方法定义练习2o类定义:类定义:n类名:类名:BankAccountn成员变量:成员变量:姓名姓名(ownerName)帐号帐号(accountNumber)余额余额(balance)n成员方法:设置、获取帐号成员方法:设置、获取帐号getAccountNumber设置姓名设置姓名setName获取姓名获取姓名getName获取余额获取余额getbalance存款存款deposit取款取款withdrawn在测试类在测试类BankA
30、ccountTester中,设置中,设置b1的各的各属性变量,打印出属性变量,打印出b1的的姓名和余额姓名和余额面向对象的程序设计对外经济贸易大学 雷擎类方法类方法o也称为静态方法,表示类中对象的共有行为也称为静态方法,表示类中对象的共有行为o声明时前面需加声明时前面需加static修饰符修饰符o不能被声明为抽象的不能被声明为抽象的o类方法可以在不建立对象的情况下用类名直类方法可以在不建立对象的情况下用类名直接调用,也可用类实例调用接调用,也可用类实例调用面向对象的程序设计对外经济贸易大学 雷擎对在成员方法中对类成员的访问对在成员方法中对类成员的访问ostatic(静态变量静态变量/静态方法静
31、态方法)classTest publicvoidprint(intx)System.out.println(x);publicstaticvoidmain(Stringargs)intx=3;print(x);D:javac Test.javaTest.java:9:non-static method print(int)cannot be referenced from a static context print(x);1 errorclass Test public void print(int x)System.out.println(x);public static void mai
32、n(String args)int x=3;Test t=new Test();t.print(x);class Test public static void print(int x)System.out.println(x);public static void main(String args)int x=3;print(x);static方法中仅仅可以调用其他static方法面向对象的程序设计对外经济贸易大学 雷擎例:类方法(静态方法)的定义例:类方法(静态方法)的定义publicclassCirclepublicstaticdoublePI=3.14;publicstaticdoub
33、legetArea(doublenum)returnPI*num*num;面向对象的程序设计对外经济贸易大学 雷擎例:类方法(静态方法)的引用例:类方法(静态方法)的引用publicclassCircleTesterpublicstaticvoidmain(Stringstr)Circlec1,c2;.doublex1,x2;x1=Circle.getArea(1.23);/类引用类引用c1=newCircle();x2=c1.getArea(c1.getR();/实例引用实例引用面向对象的程序设计对外经济贸易大学 雷擎类方法的应用类方法的应用o将摄氏温度将摄氏温度(centigrade)转换
34、成华氏温度转换成华氏温度(fahrenheit)n转换公式为转换公式为fahrenheit=centigrade*9/5+32n除了摄氏温度值及公式中需要的常量值,此功除了摄氏温度值及公式中需要的常量值,此功能不依赖于具体的类实例的属性值,因此可声能不依赖于具体的类实例的属性值,因此可声明为类方法明为类方法面向对象的程序设计对外经济贸易大学 雷擎例子:类方法的声明例子:类方法的声明o转换方法转换方法centigradeToFahrenheit放放在类在类Converter中中publicclassConverterpublicstaticintcentigradeToFahrenheit(in
35、tcent)return(cent*9/5+32);面向对象的程序设计对外经济贸易大学 雷擎Java的类方法练习的类方法练习o在在Ball类中定义静态常量类中定义静态常量PI,定义类方法,定义类方法获取获取PI的值的值BACK面向对象的程序设计对外经济贸易大学 雷擎3.2.5静态代码块静态代码块o在类中,可以将一块代码声明为静态,这样在类中,可以将一块代码声明为静态,这样的程序块叫静态初始化段。的程序块叫静态初始化段。o格式格式static语句序列语句序列面向对象的程序设计对外经济贸易大学 雷擎静态代码块说明静态代码块说明o静态代码块只能定义在类里面,它独立于任何方法,不静态代码块只能定义在类
36、里面,它独立于任何方法,不能定义在方法里面。能定义在方法里面。o静态代码块里面的变量都是局部变量,只在本块内有效。静态代码块里面的变量都是局部变量,只在本块内有效。o静态代码块会在类被加载时自动执行,而无论加载者是静态代码块会在类被加载时自动执行,而无论加载者是JVM还是其他的类。还是其他的类。o一个类中允许定义多个静态代码块,执行的顺序根据定一个类中允许定义多个静态代码块,执行的顺序根据定义的顺序进行。义的顺序进行。o静态代码块只能访问类的静态成员,而不允许访问实例静态代码块只能访问类的静态成员,而不允许访问实例成员。成员。面向对象的程序设计对外经济贸易大学 雷擎例:静态代码块例:静态代码块
37、publicclassStaticBlock/定义一个普通的定义一个普通的main()方法方法publicstaticvoidmain(Stringargs)System.out.println(Thisismainmethod.);/定义一个静态代码块定义一个静态代码块staticSystem.out.println(Thisisstaticblock.);intstVar=0;/这是一个局部变量,只在本块内有效这是一个局部变量,只在本块内有效面向对象的程序设计对外经济贸易大学 雷擎代码执行分析代码执行分析o输出:输出:ThisisstaticblockThisismainmethodo静态
38、代码块在静态代码块在main()方法之前执行方法之前执行o静态代码块在程序启动时主动执行静态代码块在程序启动时主动执行o与静态方法的区别与静态方法的区别n静态方法被调用时才执行静态方法被调用时才执行面向对象的程序设计对外经济贸易大学 雷擎例:与静态方法的比较例:与静态方法的比较publicclassUseStaticBolckpublicstaticvoidmain(Stringargs)newStaticBlock();/创建一个创建一个staticBlock的对象的对象o输出:输出:ThisisstaticblockBACK面向对象的程序设计对外经济贸易大学 雷擎3.2.6访问控制访问控制
39、o访问控制符的作用访问控制符的作用n说明被声明的内容(类、属性、方法和构造方说明被声明的内容(类、属性、方法和构造方法)的访问权限。法)的访问权限。n降低类之间的耦合性降低类之间的耦合性n隐藏类的保密信息和功能细节隐藏类的保密信息和功能细节n提高代码的可维护性提高代码的可维护性面向对象的程序设计对外经济贸易大学 雷擎访问控制权限的种类访问控制权限的种类opublic公共的公共的oprotected受保护的受保护的o无访问控制符无访问控制符默认默认oprivate私有的私有的面向对象的程序设计对外经济贸易大学 雷擎类定义中成员的访问控制权限类定义中成员的访问控制权限名称名称名称名称 访问权修饰访
40、问权修饰访问权修饰访问权修饰符符符符类本身类本身类本身类本身子类子类子类子类包包包包所有类所有类所有类所有类公共公共公共公共 publicpublic 默认默认默认默认 无访问控制无访问控制无访问控制无访问控制 保护保护保护保护 protectedprotected *私有私有私有私有 privateprivate *指子类与父类不在同一个包中的情况面向对象的程序设计对外经济贸易大学 雷擎public(公共变量公共变量/公共方法公共方法)o容许全权访问,无任何限制容许全权访问,无任何限制(先构造对象,再访问先构造对象,再访问)classApublicintx;publicvoidprint()
41、classBvoidtest()Aa=newA();a.x=100;a.print();面向对象的程序设计对外经济贸易大学 雷擎protected(保护变量保护变量/保护方法保护方法)o容许类本身、子类容许类本身、子类(有一定有一定限制限制)以及同一个包中所有以及同一个包中所有类访问类访问(先构造对象,再访先构造对象,再访问问)classAprotectedintx;protectedvoidprint()classBvoidtest()Aa=newA();a.x=100;a.print();面向对象的程序设计对外经济贸易大学 雷擎无修饰无修饰o容许类本身以及同一个包中所有类访问容许类本身以及
42、同一个包中所有类访问classAintx;voidprint()classBvoidtest()Aa=newA();a.x=100;a.print();面向对象的程序设计对外经济贸易大学 雷擎private(私有变量私有变量/私有方法私有方法)D:javac A.javaA.java:8:x has private access in A a.x=100;A.java:9:print()has private access in A a.print();2 errorso仅能在其所定义的类中被访问仅能在其所定义的类中被访问(先构造对象,再访问先构造对象,再访问)classAprivateint
43、x;privatevoidprint()classBvoidtest()Aa=newA();a.x=100;a.print();BACK面向对象的程序设计对外经济贸易大学 雷擎3.3内部类内部类o内部类内部类也称为嵌入类也称为嵌入类(nestedclass),它是,它是定义在其他类的内部。定义在其他类的内部。o内部类作为其外部类的一个成员,与其他成内部类作为其外部类的一个成员,与其他成员一样,可以直接访问其外部类的数据和方员一样,可以直接访问其外部类的数据和方法。法。o内部类作为一个成员,可以被任意修饰符修内部类作为一个成员,可以被任意修饰符修饰。饰。面向对象的程序设计对外经济贸易大学 雷擎3
44、.3内部类内部类o3.3.1内部类的语法规则内部类的语法规则o3.3.2局部内部类局部内部类o3.3.3匿名内部类匿名内部类o3.3.4静态内部类静态内部类面向对象的程序设计对外经济贸易大学 雷擎3.3.1内部类的语法规则内部类的语法规则o内部类的语法是比较复杂的内部类的语法是比较复杂的,根据不同的内,根据不同的内部类,语法规则不同部类,语法规则不同面向对象的程序设计对外经济贸易大学 雷擎3.3.2局部内部类局部内部类o局部局部(有名有名)内部类声明格式内部类声明格式:classOuterclassInner/内部类属性声明内部类属性声明/内部类方法声明内部类方法声明/内部类构造方法内部类构造
45、方法面向对象的程序设计对外经济贸易大学 雷擎局部内部类的初始化局部内部类的初始化o局部内部类初始化格式:局部内部类初始化格式:classOuterclassInnerInnergetInner()returnnewInner();面向对象的程序设计对外经济贸易大学 雷擎局部内部类的使用局部内部类的使用o局部内部类使用格式局部内部类使用格式:classOuterTesterOuterouter=newOuter();Outer.Innerinner;inner=outer.getInner();inner.方法名方法名;面向对象的程序设计对外经济贸易大学 雷擎例:局部内部类的使用例:局部内部类的
46、使用publicclassTest3_5publicstaticvoidmain(Stringargs)Outerouter=newOuter();outer.print();Outer.Innerinner=outer.getInner();inner.print();面向对象的程序设计对外经济贸易大学 雷擎classOuterprivateintindex=10;classInnerprivateintindex=20;voidprint()intindex=30;System.out.println(this);/theobjectcreatedfromtheInnerSystem.ou
47、t.println(Outer.this);/theobjectcreatedfromtheOuterSystem.out.println(index);/outputis30System.out.println(this.index);/outputis20System.out.println(Outer.this.index);/outputis10面向对象的程序设计对外经济贸易大学 雷擎voidprint()Innerinner=newInner();/得到内部类的引用得到内部类的引用inner.print();InnergetInner()returnnewInner();/在在Out
48、er类内部,直接引用类内部,直接引用Inner内部类,当然内部类,当然也可以通过外部类引用也可以通过外部类引用面向对象的程序设计对外经济贸易大学 雷擎3.3.3匿名内部类匿名内部类o匿名内部类的特点:匿名内部类的特点:n必须扩展一个基类或实现一个接口,但不能有必须扩展一个基类或实现一个接口,但不能有显示的显示的extends或或implementsn必须实现父类及接口中的所有抽象方法必须实现父类及接口中的所有抽象方法n总是使用父类的无参构造方法来创建实例总是使用父类的无参构造方法来创建实例o匿名内部类声明和初始化格式:匿名内部类声明和初始化格式:newinterfacename().;或或ne
49、wsuperclassname().;面向对象的程序设计对外经济贸易大学 雷擎例:匿名内部类的使用例:匿名内部类的使用abstractclassAabstractpublicvoidsayHello();面向对象的程序设计对外经济贸易大学 雷擎classOuterpublicstaticvoidmain(Stringargs)newOuter().callInner(newA()publicvoidsayHello()System.out.println(this);/theobjectcreatedfromtheanonymousInnerSystem.out.println(Hello!)
50、;);publicvoidcallInner(Aa)a.sayHello();面向对象的程序设计对外经济贸易大学 雷擎3.3.4静态内部类静态内部类o声明为声明为static,也叫嵌套类,也叫嵌套类o与非静态内部类的区别与非静态内部类的区别n目的是把一个修安排类隐藏在另一个类中目的是把一个修安排类隐藏在另一个类中n没有指向外部类的引用没有指向外部类的引用n非静态的内部类不能有静态数据、静态方法和非静态的内部类不能有静态数据、静态方法和静态内部类,而静静态内部类,而静态类中可以有所有的内容态类中可以有所有的内容n静态内部类实例化时,可以直接实例化内部类,静态内部类实例化时,可以直接实例化内部类,