1、1第二章第二章类与对象的基本概念类与对象的基本概念宋继红宋继红JAVA语言程序设计JAVA语言程序设计2目录目录2.1 面向对象的程序设计方法概述面向对象的程序设计方法概述2.2 类与对象类与对象 2.3 对象初始化和回收对象初始化和回收 2.4 应用举例应用举例 2.5 UML简介简介2.6 本章小节本章小节JAVA语言程序设计32.1 面向对象的程序设计方法概述面向对象的程序设计方法概述l面向对象的程序设计面向对象的程序设计 与结构化程序设计方法相比,更符合人类认识现实世界的思维方式 已成为程序设计的主流方向 涉及的主要概念l抽象l封装l继承l多态 JAVA语言程序设计4l对象对象 现实世
2、界中l万物皆对象l都具有各自的属性,对外界都呈现各自的行为 程序中l一切都是对象l都具有标识(identity),属性和行为(方法)通过一个或多个变量来保存其状态 通过方法(method)实现他的行为2.1 面向对象的程序设计方法概述面向对象的程序设计方法概述(续续)面向对象程序设计方法概述JAVA语言程序设计5l类类将属性及行为相同或相似的对象归为一类类可以看成是对象的抽象,代表了此类对象所具有的共有属性和行为在面向对象的程序设计中,每一个对象都属于某个特定的类,面向对象程序设计方法概述2.1 面向对象的程序设计方法概述面向对象的程序设计方法概述(续续)JAVA语言程序设计6l结构化程序设计
3、结构化程序设计 通常由若干个程序模块组成,每个程序模块都可以是子程序或函数 数据和功能分离,代码难于维护和复用l面向对象程序设计面向对象程序设计 基本组成单位是类 程序在运行时由类生成对象,对象是面向对象程序的核心 对象之间通过发送消息进行通信,互相协作完成相应功能2.1 面向对象的程序设计方法概述面向对象的程序设计方法概述(续续)面向对象程序设计方法概述JAVA语言程序设计72.1.1 抽象抽象l抽象抽象忽略问题中与当前目标无关的方面,以便更充分地注意与当前目标有关的方面计算机软件开发中所使用的抽象有l过程抽象l数据抽象面向对象程序设计方法概述JAVA语言程序设计8l过程抽象过程抽象将整个系
4、统的功能划分为若干部分,强调功能完成的过程和步骤,而隐藏其具体的实现任何一个明确定义的功能操作都可被看作单个的实体,尽管这个操作实际上可能由一系列更低级的操作来完成基于过程抽象的两个标准程序设计技术l过程分解l递归技术 2.1.1 抽象抽象(续续)过程抽象过程抽象面向对象程序设计方法概述JAVA语言程序设计9l数据抽象数据抽象 将需要处理的数据和这些数据上的操作结合在一起,抽象成不同的抽象数据类型 每个抽象数据类型既包含了数据,也包含了针对这些数据的操作 相对于过程抽象,数据抽象是更为合理的抽象方法2.1.1 抽象抽象(续续)数据抽象数据抽象面向对象程序设计方法概述JAVA语言程序设计10l例
5、:例:钟表l数据(属性)int Hour;int Minute;int Second;l方法(行为)SetTime();ShowTime();2.1.1 抽象抽象(续续)面向对象程序设计方法概述JAVA语言程序设计11l例:例:人l数据(属性)char*name;char*gender;int age;int id;l方法(行为)生物行为Eat(),Step(),社会行为Work(),Study(),面向对象程序设计方法概述2.1.1 抽象抽象(续续)JAVA语言程序设计122.1.2 封装封装l封装封装 是一种信息隐蔽技术 利用抽象数据类型将数据和基于数据的操作封装在一起用户只能看到对象的封
6、装界面信息,对象的内部细节对用户是隐蔽的封装的目的在于将对象的使用者和设计者分开,使用者不必知道行为实现的细节,只需使用设计者提供的消息来访问对象面向对象程序设计方法概述JAVA语言程序设计13l封装的定义封装的定义 清楚的边界l所有对象的内部信息被限定在这个边界内 接口l对象向外界提供的方法,外界可以通过这些方法与对象进行交互 受保护的内部实现l功能的实现细节,不能从类外访问。2.1.2 封装封装(续续)面向对象程序设计方法概述JAVA语言程序设计14l封装的意义封装的意义 在面向对象的程序设计中,类封装了数据及对数据的操作,是程序中的最小模块 禁止了外界直接操作类中的数据,模块与模块之间只
7、能通过严格控制的接口进行交互,这使得模块之间的偶合度大大降低 保证了模块具有较好的独立性,程序维护和修改较为容易2.1.2 封装封装(续续)面向对象程序设计方法概述JAVA语言程序设计152.1.3 继承继承l继承继承 是指新的类可以获得已有类(称为超类、基类或父类)的属性和行为,称新类为已有类的派生类(也称为子类)在继承过程中派生类继承了基类的特性,包括方法和实例变量 派生类也可修改继承的方法或增加新的方法,使之更适合特殊的需要 有助于解决软件的可重用性问题,使程序结构清晰,降低了编码和维护的工作量面向对象程序设计方法概述JAVA语言程序设计16l单继承单继承 任何一个派生类都只有单一的直接
8、父类 类层次结构为树状结构l多继承多继承 一个类可以有一个以上的直接父类 类层次结构为网状结构,设计及实现比较复杂lJavaJava语言仅支持单继承语言仅支持单继承2.1.3 继承继承(续续)面向对象程序设计方法概述JAVA语言程序设计172.1.4 多态多态l多态多态 一个程序中同名的不同方法共存 主要通过子类对父类方法的覆盖来实现 不同类的对象可以响应同名的消息(方法),具体的实现方法却不同 使语言具有灵活、抽象、行为共享、代码共享的优势,很好地解决了应用程序方法同名问题面向对象程序设计方法概述JAVA语言程序设计18l类与对象类与对象 在程序中,对象是通过一种抽象数据类型来描述的,这种抽
9、象数据类型称为类(Class)一个类是对一类对象的描述。类是构造对象的模板 对象是类的具体实例2.2 类与对象类与对象JAVA语言程序设计192.2.1 类的声明类的声明l声明形式声明形式public abstract|final class 类名称类名称 extends 父类名称父类名称 implements 接口名称列表接口名称列表 变量成员声明及初始化;变量成员声明及初始化;方法声明及方法体;方法声明及方法体;类与对象JAVA语言程序设计20l关键字关键字 Classl表明其后声明的是一个类。extendsl如果所声明的类是从某一父类派生而来,那么,父类的名字应写在extends之后 i
10、mplementsl如果所声明的类要实现某些接口,那么,接口的名字应写在implements之后2.2.1 类的声明类的声明(续续)类与对象JAVA语言程序设计21l修饰符修饰符 可以有多个,用来限定类的使用方式 publicl表明此类为公有类 abstractl指明此类为抽象类 finall指明此类为终结类 l类声明体类声明体 变量成员声明及初始化l可以有多个 方法声明及方法体l可以有多个2.2.1 类的声明类的声明(续续)类与对象JAVA语言程序设计22l钟表类钟表类public class Clock /成员变量成员变量 int hour;int minute;int second;/成
11、员方法成员方法 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类与对象JAVA语言程序设计23l变量和对象变量和对象 变量除了存储基本数据类型的数据,还能存储对象的引用,用来存储对象引用的变量称为引用变量 类的对象也称为类的实例2.2.2 对象的声明与引用对象的声明与引用类与对象JAVA语言程序设计24l对
12、象的声明对象的声明 格式类名 变量名 例如Clock是已经声明的类名,则下面语句声明的变量aclock将用于存储该类对象的引用:Clock aclock;声明一个引用变量时并没有对象生成2.2.2 对象的声明与引用对象的声明与引用(续续)类与对象JAVA语言程序设计25l对象的创建对象的创建 生成实例的格式:new()例如:aclock=new Clock()其作用是:l在内存中为此对象分配内存空间l返回对象的引用(reference,相当于对象的存储地址)引用变量可以被赋以空值例如:aclock=null;2.2.2 对象的声明与引用对象的声明与引用(续续)类与对象JAVA语言程序设计262
13、.2.3 数据成员数据成员l数据成员数据成员表示Java类的状态声明数据成员必须给出变量名及其所属的类型,同时还可以指定其他特性在一个类中成员变量名是唯一的数据成员的类型可以是Java中任意的数据类型(简单类型,类,接口,数组)分为实例变量和类变量类与对象JAVA语言程序设计27 声明格式public|protected|private static finaltransient volatile变量数据类型变量数据类型 变量名变量名1=变量初值变量初值,变量名变量名2=变量初值变量初值,;格式说明lpublic、protected、private 为访问控制符lstatic指明这是一个静态成
14、员变量lfinal指明变量的值不能被修改ltransient指明变量是临时状态lvolatile指明变量是一个共享变量2.2.3 数据成员数据成员(续续)类 与 对 象JAVA语言程序设计28l实例变量实例变量 没有static修饰的变量称为实例变量(Instance Variables)用来存储所有实例都需要的属性信息,不同实例的属性值可能会不同 可通过下面的表达式访问实例属性的值.2.2.3 数据成员数据成员(续续)实例变量实例变量类与对象JAVA语言程序设计29l声明一个表示圆的类,保存在文件声明一个表示圆的类,保存在文件Circle.java 中。中。然后编写测试类,保存在文件然后编写
15、测试类,保存在文件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类与对象JAVA语言程序设计30l编译后运行结果如下:编译后运行结果如下:Circl
16、e26b249radius=0l解释解释 之后的数值为x所指的对象的存储地址 x的值及对象的状态如图2.2.3 数据成员数据成员(续续)例例2_2运行结果运行结果类与对象JAVA语言程序设计31l声明一个表示矩形的类声明一个表示矩形的类,保存在保存在Rectangle.java中;编写测试类,保存在中;编写测试类,保存在ShapeTester.java中,中,二文件保存在相同的目录下二文件保存在相同的目录下public class Rectangle double width=10.128;double height=5.734;public class ShapeTester public
17、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类与对象JAVA语言程序设计32l编译后运行结果如下:编译后运行结果如下:Circle82f0db Rectangle92d342l解释解释 Circle及Rectangle类对象的状态如图2.2.3 数据成员数据成员(续续)例例2_3运行结果运行结果类与对象JAVA语言程序设计33l对对ShapeTester类进行修改,使两个实例具有不
18、同类进行修改,使两个实例具有不同的实例变量值的实例变量值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修改修改类与对象JAVA语言程序设计34l编译后运行结果
19、如下:编译后运行结果如下:50 10.128 68.94l解释解释 Circle及Rectangle类对象的状态如图2.2.3 数据成员数据成员(续续)修改后运行结果修改后运行结果类与对象JAVA语言程序设计35l地址簿程序地址簿程序 一个人的地址通常包括以下信息:姓名,省份,城市,街道,门牌号,邮政编码 采用过程化的程序设计方法,使用简单变量存储,则存储两个人地址的代码如下2.2.3 数据成员数据成员(续续)例例2_4类与对象JAVA语言程序设计36public static void main(String args)String name1,name2;int gateNumber1,g
20、ateNumber2;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;provin
21、ce2=Beijing;postalCode2=102206;/.do something interesting 2.2.3 数据成员数据成员(续续)例例2_4类与对象JAVA语言程序设计37 采用面向对象的程序设计方法,则需要首先声明Address类如下public class Address String name;int gateNumber;String streetName;String city;String province;String postalCode;/方法成员略 2.2.3 数据成员数据成员(续续)例例2_4类与对象JAVA语言程序设计38 主方法改写如下publi
22、c 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;a
23、ddress2.streetName=“BeiNong;address2.city=“Beijing;address2.province=“Beijing;address2.postalCode=“102206;/.do something interesting 2.2.3 数据成员数据成员(续续)例例2_4类与对象JAVA语言程序设计39l类变量类变量 也称为静态变量,声明时需加static修饰符 不管类的对象有多少,类变量只存在一份,在整个类中只有一个值 类初始化的同时就被赋值 适用情况l类中所有对象都相同的属性l经常需要共享的数据l系统中用到的一些常量值 引用格式.2.2.3 数据成员
24、数据成员(续续)类变量类变量类与对象JAVA语言程序设计40l对于一个圆类的所有对象,计算圆的面积对于一个圆类的所有对象,计算圆的面积时,都需用到时,都需用到的值,可在的值,可在Circle类的声明类的声明中增加一个类属性中增加一个类属性PIpublic class Circle static double PI=3.14159265;int radius;当我们生成Circle类的实例时,在每一个实例中并没有存储PI的值,PI的值存储在类中2.2.3 数据成员数据成员(续续)例例2_5类与对象JAVA语言程序设计41 对类变量进行测试public class ClassVariableTes
25、ter 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.141592653.141592653.143.142.2.3 数据成员数据成员(续续)例例2_5运行结果运行结果类与对象JAVA语言程序设计42l声明一个声明一个Point类,有两个私有变量保存点类,有两个私有变
26、量保存点坐标,一个类变量保存已有点的个数坐标,一个类变量保存已有点的个数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类与对象JAVA语言程序设计43l测试类测试类ex2_4class ex2_4 public static void main(String args)Point p=new Point(1,1);Syst
27、em.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类测试类测试类与对象JAVA语言程序设计44l测试结果测试结果12true2 2.2.3 数据成员数据成员(续续)Point类测试结果类测试结果类与对象JAVA语言程序设计45l实例变量和类变量都可被声明为实例
28、变量和类变量都可被声明为finallfinal实例变量必须在每个构造方法结实例变量必须在每个构造方法结束之前赋初值,以保证使用之前会被束之前赋初值,以保证使用之前会被初始化初始化lfinal类变量必须在声明的同时初始化类变量必须在声明的同时初始化2.2.3 数据成员数据成员(续续)final修饰符修饰符类与对象JAVA语言程序设计462.2.4 方法成员方法成员l方法成员方法成员 定义类的行为l一个对象能够做的事情l我们能够从一个对象取得的信息 可以没有,也可以有多个;一旦在类中声明了方法,它就成为了类声明的一部分 分为实例方法和类方法类与对象JAVA语言程序设计47声明格式public|pr
29、otected|private static finalabstract native synchronized返回类型返回类型 方法名方法名(参数列表参数列表)throws exceptionList方法体方法体2.2.4 方法成员方法成员(续续)声明格式声明格式类与对象JAVA语言程序设计48格式说明l方法修饰public、protected、private 为存取控制符static指明方法是一个类方法final指明方法是一个终结方法abstract指明方法是一个抽象方法native用来集成java代码和其它语言的代码synchronized用来控制多个并发线程对共享数据的访问2.2.4
30、方法成员方法成员(续续)格式说明格式说明类与对象JAVA语言程序设计49 格式说明(续)l返回类型 方法返回值的类型,可以是任意的Java数据类型 当不需要返回值时,返回类型为voidl参数类型 简单数据类型,引用类型(数组、类或接口)可以有多个参数,也可以没有参数,方法声明时的参数称为形式参数l方法体 方法的实现 包括局部变量的声明以及所有合法的Java指令 局部变量的作用域只在该方法内部lthrows exceptionList 用来处理异常2.2.4 方法成员方法成员(续续)格式说明格式说明类与对象JAVA语言程序设计50l方法调用方法调用 给对象发消息意味着调用对象的某个方法l从对象中
31、取得信息 l修改对象的状态或进行某种操作 l进行计算及取得结果等 调用格式.(参数列表)称点操作符“.”前面的为消息的接收者(receiver)参数传递l值传递:参数类型为基本数据类型时l引用传递:参数类型为对象类型或数组时2.2.4 方法成员方法成员(续续)方法调用方法调用类与对象JAVA语言程序设计51l 实例方法实例方法 表示特定对象的行为 声明时前面不加static修饰符 使用时需要发送给一个类实例2.2.4 方法成员方法成员(续续)实例方法实例方法类与对象JAVA语言程序设计52l在在Circle类中声明计算周长的方法类中声明计算周长的方法 public class Circle s
32、tatic 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类与对象JAVA语言程序设计53l方法调用测试方法调用测试public class CircumferenceTester public static void main(S
33、tring 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类与对象JAVA语言程序设计
34、54l运行结果运行结果Circle 1 has circumference 314.159265Circle 2 has circumference 62.831853l说明说明 在使用实例方法时,需要将其发送给一个实例对象(也称给对象发送一条消息),radius的值即是接收者对象的值 在执行c1.circumference()时,radius的值为c1的radius属性值;在执行c2.circumference()时,radius的值为c2的radius属性值类与对象2.2.4 方法成员方法成员(续续)例例2_6运行结果运行结果JAVA语言程序设计55l在在Circle类及类及Rectang
35、le类中声明计算面积的方法类中声明计算面积的方法area()2.2.4 方法成员方法成员(续续)例例2_7public 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;类与对象JA
36、VA语言程序设计56l声明测试类,对声明测试类,对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.ar
37、ea();类与对象2.2.4 方法成员方法成员(续续)例例2_7JAVA语言程序设计57l运行结果运行结果Circle has area 7853.981625Rectangle has area 600.0l说明说明 不同的类中可以声明相同方法名的方法 使用时,系统会根据接收者对象的类型找到相应类的方法2.2.4 方法成员方法成员(续续)例例2_7运行结果运行结果类与对象JAVA语言程序设计58l带参数的方法举例:在带参数的方法举例:在Circle类中增加方法改变圆类中增加方法改变圆的半径的半径public class Circle static double PI=3.14159265;i
38、nt 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类与对象JAVA语言程序设计59l测试类测试类public class EnlargeTester public static void main(String args)Circle c1=new Circle();c1.radius=50;C
39、ircle 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类与对象JAVA语言程序设计60l运行结果运行结果Circle 1 的周长:314.159265Circle 2 的周长:62.83185
40、3Circle 2 扩大后的周长:251.3274122.2.4 方法成员方法成员(续续)例例2_8运行结果运行结果类与对象JAVA语言程序设计61l以对象作为参数的方法举例:在以对象作为参数的方法举例:在Circle类中增加类中增加fitsInside方法判断一个圆是否在一个长方形内,方法判断一个圆是否在一个长方形内,需要以需要以Rectangle类的对象作为参数类的对象作为参数public class Circle static double PI=3.14159265;int radius;public double circumference()return 2*PI*radius;p
41、ublic void enlarge(int factor)radius=radius*factor;public boolean fitsInside(Rectangle r)return(2*radius r.width)&(2*radius r.height);2.2.4 方法成员方法成员(续续)例例2_9类与对象JAVA语言程序设计62 测试类测试类 public class InsideTester public static void main(String args)Circle c1=new Circle();c1.radius=8;Circle c2=new Circle()
42、;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类与对象JAVA语言程序设计63l运行结果运行结果Circle 1 fits inside Rectangle:trueCircle 2 fits in
43、side Rectangle:false2.2.4 方法成员方法成员(续续)例例2_9运行结果运行结果类与对象JAVA语言程序设计64l类方法类方法 也称为静态方法,表示类中对象的共有行为 声明时前面需加static修饰符 不能被声明为抽象的 类方法可以在不建立对象的情况下用类名直接调用,也可用类实例调用2.2.4 方法成员方法成员(续续)类方法类方法类与对象JAVA语言程序设计65l将摄氏温度将摄氏温度(centigrade)转换成华氏温度转换成华氏温度(fahrenheit)转换公式为 fahrenheit=centigrade*9/5+32 除了摄氏温度值及公式中需要的常量值,此功能不依
44、赖于具体的类实例的属性值,因此可声明为类方法 转换方法centigradeToFahrenheit放在类Converter中public class Converter public static int centigradeToFahrenheit(int cent)return(cent*9/5+32);方法调用Converter.centigradeToFahrenheit(40)2.2.4 方法成员方法成员(续续)例例2_10类与对象JAVA语言程序设计66l包包 是一组类的集合l一个包可以包含若干个类文件,还可包含若干个包 包的作用l将相关的源代码文件组织在一起l类名的空间管理,利用
45、包来划分名字空间,便可以避免类名冲突l提供包一级的封装及存取权限2.2.5 类的组织类的组织包的概念包的概念类与对象JAVA语言程序设计67l包的命名包的命名 每个包的名称必须是“独一无二”的 Java中包名使用小写字母表示 命名方式建议l将机构的Internet域名反序,作为包名的前导l若包名中有任何不可用于标识符的字符,用下划线替代l若包名中的任何部分与关键字冲突,后缀下划线l若包名中的任何部分以数字或其他不能用作标识符起始的字符开头,前缀下划线2.2.5 类的组织类的组织包的概念包的概念类与对象JAVA语言程序设计68l编译单元与类空间编译单元与类空间 一个Java源代码文件称为一个编译
46、单元,由三部分组成l所属包的声明(省略,则属于默认包)lImport(引入)包的声明,用于导入外部的类l类和接口的声明 一个编译单元中只能有一个public类,该类名与文件名相同,编译单元中的其他类往往是public类的辅助类,经过编译,每个类都会产一个class文件 利用包来划分名字空间,便可以避免类名冲突2.2.5 类的组织类的组织包的概念包的概念(续续)类与对象JAVA语言程序设计69l包的声明包的声明 命名的包(命名的包(Named Packages)l例如:package Mypackage;默认包(未命名的包)默认包(未命名的包)l不含有包声明的编译单元是默认包的一部分2.2.5
47、类的组织类的组织包的概念包的概念(续续)类与对象JAVA语言程序设计70l包与目录包与目录 Java使用文件系统来存储包和类 包名就是文件夹名,即目录名 目录名并不一定是包名 用javac编译源程序时,如遇到当前目录(包)中没有声明的类,就会以环境变量classpath为相对查找路径,按照包名的结构来查找。因此,要指定搜寻包的路径,需设置环境变量classpath2.2.5 类的组织类的组织包的概念包的概念(续续)类与对象JAVA语言程序设计71l引入包引入包 为了使用其它包中所提供的类,需要使用import语句引入所需要的类 Java编译器为所有程序自动引入包java.lang import
48、语句的格式 import package1.package2.(classname|*);l其中package1.package2表明包的层次,它对应于文件目录lclassname则指明所要引入的类名l如果要引入一个包中的所有类,则可以使用星号(*)来代替类名类与对象2.2.5 类的组织类的组织包的概念包的概念(续续)JAVA语言程序设计72l类的访问控制类的访问控制 类的访问控制只有public(公共类)及无修饰符(缺省类)两种 访问权限符与访问能力之间的关系如表类与对象2.2.6 类的访问控制类的访问控制类型类型无修饰无修饰public同一包中的类yesyes不同包中的类noyesJAVA
49、语言程序设计73l类成员的访问控制类成员的访问控制 公有(public)l可以被其他任何对象访问(前提是对类成员所在的类有访问权限)保护(protected)l只可被同一类及其子类的实例对象访问 私有(private)l只能被这个类本身访问,在类外不可见 默认(default)l仅允许同一个包内的访问;又被称为“包(package)访问权限”2.2.6 类成员的访问控制类成员的访问控制类与对象JAVA语言程序设计74类型类型private无修饰无修饰protectedpublic同一类同一类yesyesyesyes同一包中的同一包中的子类子类noyesyesyes同一包中的同一包中的非子类非子
50、类noyesyesyes不同包中的不同包中的子类子类nonoyesyes不同包中的不同包中的非子类非子类nononoyes2.2.6 类成员的访问控制类成员的访问控制(续续)类与对象JAVA语言程序设计75l对例对例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 类成员的访问控制类成员的访问控