版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第4章 面向对象的基本概念,4.1 类和对象 4.2 类的定义和实现 4.3 类的继承和派生 4.4 包 4.5 方法,4.1 类和对象,面向对象程序设计(Object-Oriented Programming,OOP)是近代程序设计领域的一大革命,它提高了程序设计者的工作效率和软件的重复使用率,并降低维护成本。面向对象程序设计实际上是围绕组成问题领域的事物进行的程序设计,所关心的是对象以及对象间的相互关系,整个程序系统只由对象组成,对象间的联系只通过消息传递进行,系统运行就是多个对象经过消息传递互相联系,共同完成某一工作。 面向对象程序设计的基本原理是:对要处理的问题实现自然分割,按照通常的
2、思维方式建立问题领域的模型,设计尽可能自然地表现问题求解的程序。 Java语言是一种完全对象化、结构严谨的语言,它通过类、对象等概念来组织和构建整个程序,因此,掌握面向对象程序设计的基本概念和方法是学习Java编程的前提和基础,下面就先介绍面向对象编程中的几个基本概念。,下一页,返回,4.1 类和对象,(1)对象(object) “对象”原本是描述自然界时常使用的一个词语。例如,现实生活中的电话、电视、钟表等都可称为对象。仔细观察这些对象,就会发现它们有两方面的特征:一是它们的状态特征,如电视的色彩值、记忆频道等;二是它们的行为特征,如电视可以对画面进行色彩调整,可以进行频道设置等。面向对象的
3、思想就是将世界看成是由许多彼此之间相互联系的对象所组成的。 当用Java语言来解决现实世界中的问题时,就借用了“对象”这个词语来描述这些对象。在Java程序设计中,对象的状态是处于相对静止的,用“变量”来描述和表达;对象的行为是动态的,是通过“方法”来实现的,所以方法是实现对象行为的语句块。,下一页,上一页,返回,4.1 类和对象,从功能上说,这里的方法和C语言中的函数、子程序很相似。实际计算机中的对象的状态是用数据来表示的,而方法的功能是通过对数据的操作和修改来体现的。 总之,对象就是一个包含了数据和程序代码的实体。面向对象编程,就是在程序设计时着重考虑组成一个系统的实体以及在这些实体上进行
4、的操作。而把具有相同属性(状态和行为)的对象进行抽象,就形成了类。类是对一个或多个相似对象的抽象描述,类中的一个具体对象被称为是这个类的一个实例。类把对象的数据以及对这些数据进行操作的方法进行了封装。 对象有两个特征:状态(state)和行为(behavior),例如汽车的型号、价格、耗油量、速度等状态,并由有它的行为,如修理、出售、开车、停车等,如图4-1所示。,下一页,上一页,返回,图4-1,返回,4.1 类和对象,提示:在程序设计中,软件对象的概念由真实世界而来,状态保存在变量或数据字段里,而行为则借助方法为工具来实现。 (2)类(class) 在Java的世界里,一切事物都可以用类来描
5、述。更确切地说,类是对一个或几个相似对象的描述,是对象的抽象模块。类有自己的名字,它可用以表示该类所代表的对象的类型(集合)。类是Java的核心,它是整个Java语言的基本元素单元。一个类的实例就是对象,类是对象的基础,以类和对象为中心的设计思路也正是面向对象程序设计的关键。类是面向对象程序设计中最重要的概念之一,Java语言正是通过类和对象等基本概念来组织和构建程序,因此掌握类和对象的使用是实现面向对象的程序设计的前提和基础,有着十分重要的意义。,下一页,上一页,返回,4.1 类和对象,(3)实例(instance) 实例是被某个特定的类所描述的一个对象,是对象的具体实现。类是各个实例的相似
6、性的描述,每个对象都是某个类的一个实例。实例的特征是由它所属的类决定的,每个实例各自拥有自己的变量。 类的一个最重要作用是客观存在地定义了一种新的数据类型,它封装了一类对象的状态和方法,是这一类对象的原型。一旦该类型被定义,就可以利用它来创建新的对象,一个对象就是一个类的实例,以后将经常看到“对象”和“实例”两个词交互使用。,下一页,上一页,返回,4.1 类和对象,(4)方法(method) 方法是用来描述对象对属性的动作,在C+语言中,使用成员函数来实现这一功能,在Java语言中,没有函数的概念,统一使用方法的概念。因此,在Java语言中,方法的定义都是在类的定义中完成。 (5)属性(pro
7、perty) 属性是对象的状态和本质,在Java语言中,属性用变量和方法来表示。虽然很多时候,属性起到和变量或函数相似的作用,但它的定义决定了它是对对象的描述和应用。,下一页,上一页,返回,4.1 类和对象,(6)子类和超类(subclass and supperclass) 子类是指由某一个类派生出的类,它在共享该类的描述后,再对这些描述进行某些修改,或添加一些新的描述,这样就形成了一个新类。父类的概念和子类相对应,子类被派生出来后,被派生的类就是这个子类的父类,也叫超类。例如,类A派生于类B,这样类A就成为类B的子类,而类B也成为类A的超类。如图4-2所示。,下一页,上一页,返回,图4-2
8、,返回,4.1 类和对象,(7)封装(encapsulation) 封装是改变用户使用数据和代码的方式和的一个重要方法,它也是面向对象程序设计中的又一个重要概念。所谓封装就是把一些方法和数据包含在一起并构成一个独立的单元,可通过设定单元内各成员的特性来控制该成员的访问范围。封装性将数据和方法同等对待,二者可以相互依赖。使用封装技术有助于提供模块的程序,建立良好的接口,以帮助用户设计、实现复杂的任务。 封装的用意,是避免数据成员被不正当的地存取,以达到信息隐藏的效果,避免错误存取发生。比如,汽车类的一个对象只能使用汽车类的方法,而不能使用家具类的方法。,下一页,上一页,返回,4.1 类和对象,(
9、8)继承(inheritance) 我们可能根据类的某种属性把对象进行分类,一旦属性被确定下来,所有在它之下的类都将自动地包含该属性。而Java中的类是有层次的,可以从一个较简单、较基本的类中继承它的特性,并在此基础上扩展成一个更复杂、更明确的类,这种机制就是继承。继承性提供了通用的功能,用户根据需要进行更具体的定义,这样用户就可以在已有类的基础上,建立自己的更完善的类体系。,下一页,上一页,返回,4.1 类和对象,(9)重载(overload) 重载就是用户可能根据需要设计具有相同名字的多个方法,但使用时可以带不同的数据类型。这样做的好处就是提供了代码的可读性,通常我们根据方法的功能来定义其
10、名称,这样很可能发生一些不必要的冲突。但有了重载的概念后,只要各方法的参数表不同,就可根据参数类型的区别来选择正确的方法,使这些同名、同功能的方法可以对不同的数据进行恰当的操作。,下一页,上一页,返回,4.1 类和对象,(10)消息(message) 单一对象本身并不是很有用处,而通常是成为一个包含许多对象的较大型程序的一个组件时,通过程序中这些对象的交互,程序可以达到更高级的功能以及更复杂的行为,如计算机(一个对象)自己本身不会发生行为,而当你(另一个对象)打开计算机,运行程序时,计算机内部就发生一系列复杂的行为。 软件对象是通过传送消息给其他对象来达到交互沟通的作用。消息由3个元素组成:消
11、息的目标对象(即消息是给哪个对象的)、执行的行为名称、行为所需的参数。,上一页,返回,4.2 类的定义和实现,4.2.1 Java系统定义的类 随着学习的逐渐深入,读者会体会到,Java程序设计就是定义类的过程。除用户自定义的类之外,还应该充分利用Java系统提供的类库。Java系统为用户提供了大量已定义好的类,称为Java应用程序接口,简称Java API(Application Program Interface)。Java API是一组由软件供应商编写好的Java程序模块,每个模块通常对应一种特殊的基本功能和任务。用户在编程时可以直接引用这些功能,而不需要另外再编写程序代码。所以Java
12、的基本语法规则是进行Java程序设计的基础,而学习如何使用Java API,则是提高编程效率和提高代码质量的有效途径。,下一页,返回,4.2 类的定义和实现,Java系统定义好的类根据实现功能的不同,可以分为不同的集合,每个集合是一个包(Package),所有的包合称为类库。包的概念在本章的后面会详细的地讲解。使用Java类库中定义好的类有三种方式:一是继承系统类,就是在用户程序里创建系统类的子类,例如,每个Java Applet的主类都是java.applet包中的Applet类的子类;二是创建系统类的对象,例如,当图形用户界面程序中要接受用户的输入时,可以创建一个系统类TextField类
13、的对象来完成这个任务;三是直接使用系统类,如在字符界面向系统标准输出输入/输出字符串时,使用的方法System.out.println()就是系统类System的静态属性out的方法。,下一页,上一页,返回,4.2 类的定义和实现,无论采用哪种方式,用户都需要用import语句引入它所用到的类或类所在的包。类库中的程序都是以字节码形式存在的,用import语句将一个类库引入到程序里,相当于在编程过程中将该类库中所用到的类或是类的方法的字节码加入到用户的Java程序中。这样,用户的Java程序就可以直接使用系统类库中的各种功能,从而避免了代码的重复和可能的错误,大大提高了编程效率。 例如: im
14、port java.awt. *; import java.applet.Applet; 在程序的开始处声明了这些语句之后,在接下来的Java程序段中凡是需要用到上述声明包中的类和方法时,均可以直接使用类名,而不再需要使用包名。,下一页,上一页,返回,4.2 类的定义和实现,4.2.2 用户定义的类 用户程序自定义的类是用户在程序设计过程中,为解决某一特定问题而自己定义的类。类是Java语言的基本组成单元。类的一个重要作用就是定义了一种新的数据类型,一旦该数据类型被定义,就可以利用它来创建新的对象。 类是通过关键字class来定义的,它的一般语法格式如下: 类修饰符 class 类名称 ext
15、ends 类 implements 接口 类型 变量 1; 类型 变量 2; 类型 变量 n; 类型 方法 1 (形式参数) 方法体 类型 方法 2 (形式参数) 方法体 类型 方法 n (形式参数) 方法体 ,下一页,上一页,返回,4.2 类的定义和实现,(1)Java语言的类修饰符有4种:abstract(抽象的)、final(最终的)、public(公共的)和默认的共4种,它们的含义将在4.2.4节中介绍。 (2)class是类的说明关键字。 (3)类名称是用户定义的Java标识符,每个类说明中必须有class关键字和类名称。 (4)extends关键字用于说明用户定义类继承的直接父类。
16、 (5)implements关键字用于说明用户定义的类将实现哪些接口。 (6)在类的定义中,第一行是类头部分,由一对大括号扩括起来的部分是类体部分,类体通常由变量和方法两部分组成,在类体部分不能再定义其他的类。这两种组成成分通常称为类的成员变量和方法。在具体地创建类的对象后,则称为实例变量和实例方法。 例如我们定义一个表示车的类Car,其具体代码如下:,下一页,上一页,返回,4.2 类的定义和实现,class Car String ID; String name; int speed; public String ShowCar() return(ID: +ID+name: +name+spe
17、ed: +speed); 其中,第1句定义了类头,第210句定义了类体。类体包括三个3成员变量和一个方法。在Java语言中,类中可以定义的成员变量和方法的数量不受限制。在类体中,ID是字符串变量,表示车牌;name也是字符串变量,表示车主;speed是整型变量,表示车速;ShowCar()方法用于返回某一特定车的信息。,下一页,上一页,返回,4.2 类的定义和实现,4.2.3 类的构造函数与重载 1. 构造函数 每创建一个实例就要对其中的实例变量进行初始化,这是一件非常枯燥的工作,最简便的方法是在创建对象时完成这些初始化设置工作。Java允许通过构造函数(Constructor)来完成这一工作
18、。 构造函数与类同名,一旦定义了构造函数,在对象被创建时就可自动调用。从语法角度上看它是一种特殊的方法。但它与一般方法不同的是它没有返回类型。这是因为类的构造函数隐式的返回类型是类型本身。 为方便说明,举例如下:,下一页,上一页,返回,4.2 类的定义和实现,public class Car public int gearNum;/排挡数 public float engine;/引擎排气量 Car ( ) this.gearNum = 0; this.engine = 0.0; Car ( int x, float y ) this.gearNum = x; this.engine = y;
19、 ,下一页,上一页,返回,4.2 类的定义和实现,上面的例子中,类Car中定义了两个同名的构造函数,并分别对排挡数和引擎排气量赋下不同的初值。这种定义构造函数的方法就是所谓的“构造函数的重载”,它是重载技术的一个重要应用。 提示:为什么一定要使用构造函数呢?其原因就在于Java类对象的生成机理。当用运算符new为一个对象分配内存时,即使用户没有定义和类同名的构造函数,Java语言内部也会生成一个默认的构造函数(不可见),只不过这个构造函数并不进行任何的操作而已。如果用户自己定义了新的构造函数,就会覆盖这个毫无用处的默认构造函数,而在创建对象时被自动调用,对该对象进行初始化。因此,使用构造函数可
20、以避免在生成对象后每次都要调用对象的初始化方法。,下一页,上一页,返回,4.2 类的定义和实现,2. 方法的重载 上面已经介绍了重载的基本概念,下面就对它做一些简要的介绍。 在Java语言中,可以在同一类中以相同的名字定义两个方法,只要它们的参数列表不同即可,这种技术就叫做方法的重载。方法重载是Java实现多态性的方法之一,大大方便了程序员在不同情况下对该类的使用,是使编写的程序更加具有可读性。如果没有使用其他具有多态性的编程语言的经验,也许觉得多态性比较陌生,但其实这不过是Java提供的一种提高代码可读性的手段。 为方便理解,下面将举例说明: / 文件名为OverloadTest.java,
21、下一页,上一页,返回,4.2 类的定义和实现,public class OverloadTest public static void main (String args ) Overload Test = new Overload (); Test.get ( 0 ); Test.get ( 1.1, 4.2 ); Test.get ( A String! ); class Overload int i; double x, y;,下一页,上一页,返回,4.2 类的定义和实现,String s; public void get ( int i) System.out.println (Get
22、 a one int data); System.out.println (i = + i); public void get ( double x, double y) System.out.println ( Get two double data ); System.out.println ( x = + x + , y = + y ); ,下一页,上一页,返回,4.2 类的定义和实现,public void get (String s) System.out.println ( Get a one string data ); System.out.println ( s = + s
23、); 编译运行,结果在消息窗口中的输出如下: Get one int data i = 0 Get two double data x = 1.1,y = 4.2 Get one string data s = A String!,下一页,上一页,返回,4.2 类的定义和实现,注意:Java是根据参数的类型和数量来确定调用哪个重载的方法,但不区分方法的返回类型,因此重载方法之间一定要有不同的参数列表(或者是参数类型不同,或者是参数数目不同)。如果两个方法的参数的类型和个数都相同,只是返回类型不同时,编译过程将会出错。 在不支持方法重载的语言中,即使几个方法实现完全相同的功能(只是所用的数据类型
24、不同),也必须使用不同的名称。比如,C语言中的求绝对值运算,abs() 返回整数的绝对值;labs() 返回长整数的绝对值;而fabs() 返回浮点数的绝对值。由于C语言不支持方法重载,每个函数必须有一个唯一的名字,即使3个函数做完全相同的事情,这使实现变得复杂。可是在Java中,由于方法是可以重载的。可以方便的地实现“一个接口,多个方法”,上述的问题就不存在了。例如,Java中,通过数学类math的abs() 方法,可以计算所有数字类型的绝对值。,下一页,上一页,返回,4.2 类的定义和实现,4.2.4 类的修饰符 用户在自定义类时,指定不同的修饰符,就可以让类和其他类之间具备不同的存取权限
25、。一个类总是能够访问和调用它自己定义的成员变量和方法的,但是在这个类之外的其他类能否访问和调用,除了与类的修饰符有关外,还取决于类的成员变量和方法的访问控制符。本节就讨论各种不同类型的类修饰符的意义。 1. public修饰符 用public修饰符修饰的类称为公共类。一个类被声明为公共类,表明它可以被当前包之外的类使用,也就是说,可以在程序的其他部分创建这个类的对象。能否访问这个类的成员变量和调用它的方法,将取决于这些成员变量和方法的访问控制符。,下一页,上一页,返回,4.2 类的定义和实现,2. 默认修饰符 如果一个类没有修饰符,就说明它具有默认的访问控制特性。默认修饰符的类只允许与该类处于
26、同一个包中的类访问和调用,而不允许被其他包中的类使用。 3. abstract修饰符 用abstract修饰符修饰的类称为抽象类。抽象类是一种比较特殊的类,它的特殊性在于这种类不能创建对象,而只能由其派生子类。类是分层排列的,位于上层的类被称为父类,由父类所派生的类称为子类。在抽象类中还可以包含有一种只给出定义,但不包含具体实现语句的方法,称为抽象方法,抽象方法的具体实现必须由继承它的子类来完成。抽象类中不一定包含抽象方法,但是包含抽象方法的类一定是抽象类。,下一页,上一页,返回,4.2 类的定义和实现,4. final修饰符 如果一个类被final修饰符所修饰,则这个类被称为最终类。最终类是
27、那些不能再有子类的类。定义最终类的目的是为了避免盲目地继承。例如,Java类库中的String类和Array类都是最终类。 下面是一个说明最终类的例子。 final class MyFinalClass class MyClass extends MyFinalClass /错误!不能继承最终类。 将一个类声明为最终类可以提高系统的安全性。计算机病毒攻击系统的方法之一是通过创建一些关键信息类的子类,然后用子类来代替系统原来的类,从而达到破坏系统的目的。为防止意外情况的发生,可以将某些处理关键问题的信息类说明为最终类。,下一页,上一页,返回,4.2 类的定义和实现,另外,将一些具有固定作用的类说
28、明为最终类,可以保证调用这个类时所实现的功能正确无误。例如,Java系统用来实现网络功能的InetAddress, Socket及ServerSocket等类都是最终类,因为实现网络应用程序需要与服务器进行通信,对安全性的要求比较高。 需要注意的是,abstract和final修饰符不能同时修饰同一个类,因为抽象类必须要由子类来实现它的抽象方法,而当一个类被说明为最终类后,也就隐含地说明了它的所有方法是最终的。,下一页,上一页,返回,4.2 类的定义和实现,4.2.5 对象 所谓对象就是类的实例化,一个对象就是类中所定义的一组变量和相关方法的集合。对象的变量构成对象的核心,不同对象的变量是分离
29、的。对象通过成员变量和类方法进行相互间的交流,以实现各种复杂的行为。 类和对象的关系就是共性和个性的关系,由于许多对象常常具有一些共性,因此将这些共性抽象出来,就成为了类。通过创建类的一个实例来创建该类的一个对象,通过赋予各个对象不同的值来实现各对象不同的个性。,下一页,上一页,返回,4.2 类的定义和实现,1. 对象的创建和使用 定义一个类后,可以生成多个不同的对象。对象的生成是通过构造函数完成的,调用工作由new运算符实现。其构造过程如下:首先要为对象开辟空间,并对对象的成员变量进行默认的初始化,如果定义了新的构造函数,就用它对对象的成员变量进行指定的初始化,这样就将生成一个新的实例。例如
30、: /文件名为mytest.java import java.awt.*; import java.awt.event.*; import javax.swing.*; class car public Color color; /车辆颜色 public String tireType; /轮胎型号,下一页,上一页,返回,4.2 类的定义和实现,public int gearNum; /排档数 public float engine; /引擎排气量 public car(Color c,String t,int g,float e) this.color = null; this.tireTy
31、pe =t; this.gearNum =g; this.engine = e; public void Equipment () System.out.println ( 轿车颜色 + color); System.out.println ( 轿车排档数 + gearNum); System.out.println ( 轿车轮胎型号 + tireType); System.out.println ( 轿车排气量 + engine); ,下一页,上一页,返回,4.2 类的定义和实现,public class mytest public static void main (String args
32、 ) car test=new car(0,3号,3,13); test.Equipment() ; 编译运行,结果在消息窗口中的输出如下: 轿车颜色null 轿车排挡数3 轿车车胎型号3号 轿车排气量13.0 由上例可见,在对象的创建过程中,必须使用new操作符,它可以为按类的定义为对象分配空间。在此过程中,可以直接将对象初始化,也可以在对象创建后再单独初始化,下一页,上一页,返回,4.2 类的定义和实现,例如: Car Transit = new car(0, BridgeStone110SL, 5, 1980.3); 该语句的作用有三层,首先声明了一个名为Transit的对象;其次它使用
33、new关键字创建了一个类Car的实例;再在创建实例的同时,它还调用构造函数对该实例进行了初始化,这样就可以方便地调用该实例的变量了。 注意:声明本身并不能使对象实例化。也就是说,在使用new操作符之前,创建的实例没有被分配空间,因此也无法调用。 调用对象的变量和方法必须要使用点运算符“.”,访问的格式为“对象名.方法”或“对象名.变量”(必须是公有的)。上面的代码定义了类Car的一个实例Transit,这样就可以用点运算符来调用类Car中定义的变量和方法,例如: Transit.engine = 2014.4; Transit.Enquipment ();,下一页,上一页,返回,4.2 类的定
34、义和实现,2. 对象的生命周期 一个对象的生命周期包括三个阶段:生成、使用和清除,下面就分别介绍。 (1)对象的生成。对象的生成包括:生成、实例化和初始化三个方面,通常的格式如下: type objectName = new type (paramlist); 运算符new为对象分配了内存空间,实例化了一个对象,new运算符调用了对象的构造方法,返回对该对象的一个引用(即该对象所在的内存地址),用new运算符可以对一个类实例化多个不同的对象,这些对象分别占用不同的内存空间,所以改变一个对象的状态是不会影响其他的对象状态。,下一页,上一页,返回,4.2 类的定义和实现,生成对象的最后一步是执行类
35、中定义的构造方法,对其进行初始化。构造方法可以进行重载,所以通过给出不同个数或者类型的参数分别调用不同的构造方法(如果存在不同的构造函数)。 虽然new运算符返回的是一个对象的引用,但是与C和C+中的指针是不同的,对象的引用是指向一个中间数据结构,它存储有关的数据类型信息以及当前对象的所在的堆栈地址,而对于对象据的实际内存地址是不可操作的,保证了安全性。 (2)(2)对象的使用:。对象的使用包括引用对象的成员变量和方法,通过点运算符“”可以实现对变量的访问和方法的调用,变量和方法可以通过设定访问权限来允许或者禁止其他对象对其进行访问,其通常的格式如下: 对象名.成员变量名 对象名.成员方法名,
36、下一页,上一页,返回,4.2 类的定义和实现,例如,先定义一个类Car: public class Car int gearNum; floar engine; public Car () public Equipment (int g, float e) this.gearNum = g; this.engine = e; ,下一页,上一页,返回,4.2 类的定义和实现,然后,使用如下的语句: Car Transit = new Car (); 生成一个Car的对象Transit。这样就可以用Transit.gearNum和Transit.engine来访问该车的排挡数和排气量,例如: Tr
37、ansit.gearNum = 4; Transit.engine = 1600.4; 也可以用Transit.Equipment ()来改变该车的设置: Transit.Equipment (5, 1980.5 ); 另外,也可以用new运算符生成对象的引用,然后直接调用它的方法,例如: new Car ().Equipment (4, 1990.4);,下一页,上一页,返回,4.2 类的定义和实现,(3)对象的清除。:在C语言中,不再使用的内存要通过free运算符来释放,在C+语言中,不再使用的内存则是通过delete运算符来释放。但这种内存管理需要跟踪内存的使用情况,不仅复杂,而且还容易
38、造成系统崩溃。Java采用自动垃圾收集进行内存管理,使程序员不需要跟踪每个生成的对象,从而避免了上述问题的产生。 Java运行时系统通过垃圾收集周期性的地释放无用的对象所使用的内存,完成对象的清除,当不存在对一个对象的引用(当前的代码段不属于对象的作用域或者把对象的引用赋值为null)时,该对象成为一个无用对象,Java的垃圾收集器会定期自动扫描对象的动态内存区,对被引用的对象加以标记,然后把没有引用的对象作为垃圾收集起来并释放内存,这个过程就是所谓的“垃圾收集”。,下一页,上一页,返回,4.2 类的定义和实现,垃圾收集工作在一个低优先级的线程(关于线程的概念在后面的章节中介绍)上运行,并根据
39、系统实际运行状态采用同步或异步运行方式。当系统运行出现内存溢出或Java程序发出一个请求时,垃圾收集采用同步方式工作,Java程序可以随时调用System.gc() 来完成垃圾的清理工作,垃圾自动收集的时间间隔约为20 ms,如果采用同步方式工作,注意不要使程序的其他部分和它发生冲突。 4.2.6 访问权限 成员变量和成员方法如何被访问由在声明成员时的访问修饰来确定。Java提供了一组访问修饰,包括public, private, protected, final和friendly。,下一页,上一页,返回,4.2 类的定义和实现,在Java语言中,访问权限的默认修饰符是public。当成员被声
40、明为public时,该成员可以被其他的类自由访问。当被声明为private时,该成员只能被本类的其他成员访问,对外界是不可见的。当被声明为protected时,访问范围在private的基础以上扩展到了本类的派生类。当被声明为friendly时,可以被同一个包中的其他类访问。 在表4-1中列出了不同范围中的访问权限。 下面将对这些访问权限作具体地介绍。 1. public修饰符 类中定义为public的成员可以被所有的类访问,它是最普遍的权限设置类型。 其声明格式如下:,下一页,上一页,返回,表4-1,返回,4.2 类的定义和实现,class className public publicVa
41、r; /声明public类型的变量 public publicMethod (paramlist) /定义public类型的方法 提示:由于任何其他类都可以访问类中的公有成员,因此,在声明为公有成员变量时要小心,不要引发一些不必要的冲突。建议把成员变量尽量都声明为私有,而把成员方法声明为公有,这样可以避免很多错误。,下一页,上一页,返回,4.2 类的定义和实现,2. private修饰符 类中限定为private的成员只能被这个类本身所访问,它也是类中的成员变量最常用的访问属性。 其声明格式如下: class className private privateVar; private priv
42、ateMethod ( paramlist ) ,下一页,上一页,返回,4.2 类的定义和实现,注意:同一类的不同对象间可以访问对方的private成员变量或者调用对方的private方法,这是因为private的访问保护是控制在类的级别上的,而不是控制在对象的级别上的。 3. protected修饰符 类中定义为protected的成员可以被这个类本身、它的子类(包括同一个包以及不同包中的子类)以及同一个包中所有的其他类所访问。 其声明格式如下:,下一页,上一页,返回,4.2 类的定义和实现,package packageName; class className protected pro
43、tectedVar; protected protectedMethod ( paramlist ) 其中,语句“package packageName;”用来定义一个包,它的含义是将创建的类加入到此包中,关于包的使用将在后续的章节中介绍。,下一页,上一页,返回,4.2 类的定义和实现,4. friendly修饰符 类中定义为friendly的成员可以被这个类本身和同一个包中的所有类所访问。如果在成员变量和方法前不加任何访问权限的修饰符,即指明它的访问权限为friendly,也就是说,它是默认情况。因此没有必要特意声明。 其声明格式如下: package packageName; class
44、className friendly protectedVar; friendly protectedMethod ( paramlist ) ,下一页,上一页,返回,4.2 类的定义和实现,5. static修饰符 通常,类的成员必须通过类的对象来访问。但有时希望定义一个类的成员,它独立于该类中的任何对象并被所有的对象所共享,也就是说,它的值对所有的对象而言都是唯一的。为了创建这样的成员,只需在声明时,将其声明为static即可。例如: static double pi = 3.1415926; 被声明为static类型的成员(变量或方法)也叫类成员。它是在类的定义中直接声明的,可以直接被使
45、用,而没有必要参考类的特定实例。因此,在类的对象被创建前,可使用类名直接访问类成员。,下一页,上一页,返回,4.2 类的定义和实现,变量和方法都可以被声明为static类型。被声明为static的变量可看作全局的变量(和C语言的全局变量相似)。一旦变量被声明为static,就可以被类的所有实例所共享。被声明为static的方法也叫类方法,它通常起到全局方法的作用。 类方法和类变量的引用可以采用下面的形式: 类名.成员名; 声明为static的方法具有下列约束: 它们仅可以调用其他static方法。 它们仅可以访问static成员。 它们不能参考this或super关键字。,下一页,上一页,返回
46、,4.2 类的定义和实现,6. final修饰符 final关键字可以用来修饰类、类中的变量和类中的方法。它主要有以下3个用途: 修饰变量,可创建与常数一样的变量。 修饰方法,可防止方法被重载。 修饰类,可防止类被继承。 final修饰符的声明格式如下: package packageName; class className final finalVar; /声明final类型的变量 final finalMethod ( paramlist ) /定义final类型的方法,下一页,上一页,返回,4.2 类的定义和实现, 此时,创建的变量finalVar将以常数形式存在,其值将无法被改变;而
47、创建的finalMethod()方法则为该类及其所有子类的通用方法,无法再被改写。,上一页,返回,4.3 类的继承和派生,4.3.1 子类的创建 创建子类的一般语法格式如下: 子类名 extends 父类名; 语法说明如下: (1)Java语言中的继承是通过关键字extends来实现的。关键字extends指明新定义类的父类,新定义的类称为子类。 (2)子类可以从父类那里继承所有非private修饰的属性和方法作为自己的成员。 (3)在子类中可以增加父类中没有的变量和方法。 例如,假定现在需要设计一个如图4-2所示的汽车类。从图中可以看出,从汽车类派生出的客车类,除拥有汽车属性和方法外,还可以
48、定义自己的属性和方法。,下一页,返回,4.3 类的继承和派生,4.3.2 this与super关键字 this和super是Java语言的两个关键字。this用来指明当前对象的成员变量或方法,以区别于同名的局部变量和其他的同名方法。super用于指出父类的成员变量和方法。 1. this关键字 一个对象中的方法一般可以直接访问其本身所拥有的成员变量。但有时为了使程序结构更加简洁,提高可读性,会将具有相似意义的方法体内部的变量与类的成员变量定义成相同的名字。有时也会将方法的入口参数与对象的成员变量定义成相同的名字。在上述情况下,就需要使用关键字this作前缀来指明当前对象的成员变量或当前对象的方
49、法。,下一页,上一页,返回,4.3 类的继承和派生,2. super关键字 和使用this关键字同样的道理,子类的成员变量和方法的名字也有可能与父类的相同。而当需要调用父类的同名变量和方法时,在子类中,可以使用super关键字作前缀来指明直接父类的成员变量和方法。 例如: class CountryString name; void value() name=China; ,下一页,上一页,返回,4.3 类的继承和派生,下面的子类中,子类的成员变量和方法隐藏了超类的成员变量name和方法value()。 class City extends Country String name; void
50、value() name=Hefei; super.value() System.out.println(name); System.out.println(); ,下一页,上一页,返回,4.3 类的继承和派生,为了在子类中引用超类中的成员变量name和方法value(),在代码中我们使用了super关键字,和super.value(); 所以显示的结果为: Hefei China,上一页,返回,4.4 包,如果编写的程序代码较繁杂,参加编写的人员较多,很可能由于类的命名和引用问题引发冲突。为此,Java提供了一种叫做“包(Package)”的机制,从而
51、避免了命名冲突的发生。所谓“包”就是一个设定的命名集合,它是Java提供的组织类和接口的一种有效工具,定义的类都加入某一个包中,并作为包的一部分存在,Java类中的成员变量和成员方法都在类中定义,使用包机制使得每个Java的变量和方法都可以用全限定的名字来表示,包括包名、类名和成员(方法和变量)名,各部分间用点运算符号分隔即可。 简单地说,如果两个不同的程序员编写的代码在命名上有重复,又被放在了同一个名字空间内,必然会引发冲突。但包机制的引入将这些同名的标识符放在了不同的名字空间内,这样在使用时就可以很方便地区分了,不会引发冲突。,下一页,返回,4.4 包,1. 包的创建和引用 创建一个包非常
52、简单,在Java源文件的最开始处包含一个package语句即可。包含package关键词的声明句法为: package包名; package语句定义了一个类存放的命名空间,所有使用相同包名称的类都被归在同一个包中。如果没有package语句,类的名字被放进一个默认的包中,该包就没有名字。建议大家尽量使用包。 下面以具体实例介绍包的定义和引用。,下一页,上一页,返回,4.4 包,package example; public class HELLO String hello1; String hello2; public HELLO () hello1 = 你好,欢迎使用包; hello2 =
53、建议编程时尽量使用包; ,下一页,上一页,返回,4.4 包,public void printHELLO () System.out.println ( hello1 ); System.out.println ( hello2 ); 这样就创建了一个example包,其中包含一个HELLO类。 Java使用文件系统来存储包。比如,声明是包的一部分的任何.class文件必须放在以包名为目录名的目录中(如上例中,应放在example目录下)。一个package语句中可以包含多个文件,package语句仅指定在文件中定义的类属于哪个包,并不排除在其他文件中用同一个package语句声明的类。需要强
54、调的是,包的定义是区分大小写的,目录名必须与包的名字完全一样。,下一页,上一页,返回,4.4 包,注意:如果加入包中的源文件中包括多个类,这其中只有一个可以声明成public类型,并且这个类的类名必须和源文件同名。 可以创建不同层次的包,这通常是由不同的功能分类决定的。采用下面的形式可以创建一个包的层次结构。 package p1.p4.p3; 各层之间用“ ”隔开,串联列出,反映在文件系统中就是最终的文件保存在p1目录下p2子目录的p3分目录里。 例如: package java.awt.image; 这就是表明将要定义的类存放在目录javaawtimage中。,下一页,上一页,返回,4.4
55、 包,为了方便用户的程序编制,Java语言定义了许多的标准类,这些类按实现功能的不同划分并分别存放在不同的包中。可以通过import语句来引用这些已经定义好的类或整个包。在Java源文件中,import语句放在package语句之后(如果要用的话)任何类定义之前。 下面是import语句的一般形式: import 包名1.包名4.类名; 除了文件的限制外,对包的层次深度没有限制。如果引用的是某一特定的类,就直接给出类名,也可以使用星号“*”来引入整个包。 例如: import java.util.Date; import java.io.*;,下一页,上一页,返回,4.4 包,注意:使用星号方
56、式可能会增加编译的时间,特别是引入一个大包时。因此,比较好的办法是显式地引入要用到的类,而不是整个包。但是,星号方式对运行时间的性能或生成的类文件大小没有丝毫影响。 在使用类的任何地方,可以包含类的全名。例如,下面的两段代码是等价的。 import example.HELLO; class MyHello extends HELLO 或 class MyHi extends example.HELLO ,下一页,上一页,返回,4.4 包,2. 包的访问权限 在Java语言中,包的作用是很大的。包是实现封装的一种手段,也是限定类中方法和变量的作用域的一种手段。它为类和其他的子包提供了一个“容器”
57、。这个容器针对不同的访问级别来确定具体的访问范围。 当类被声明为public时,其代码可以被任何其他代码访问;但类的访问控制设为默认时(即没有显式表明),可以被同一包中的其他代码访问。也就是说,定义类时没有设定访问修饰符,这些类可以被该类所在包的其他类所访问,而对这之外的所有类都不可见。,下一页,上一页,返回,4.4 包,3. 常用包 Java中提供了大量的类库供程序员使用,了解类库的结构可以帮助程序员大大节省编制程序的时间,而且使编写的程序更简单、更实用。Java中丰富的类库资源是Java语言的一大特色,也是Java程序设计的基础。 Java类库中有9个基本包,下面简要介绍各个包的功能。详细
58、的功能可参考相应书目。 (1)java.lang包。java.lang包是Java中最常用的包,它是Java程序默认加载的几个包之一。该包的内容如下: 布尔和字符的封装类,其中包含 Boolean:布尔类,封装了对布尔数值的一些常用处理方法。 Character:字符类,提供了很多处理字符类型的方法。,下一页,上一页,返回,4.4 包, Math数学类,提供了许多用于实现数学函数的基本方法,如指数函数、对数函数、三角函数等。 Number类,其中包含 Double:双精度类,提供了处理双精度数的一些方法。 Float:单精度类,提供了处理单精度数的一些方法。 Integer:整数类,提供了处理
59、整数的一些方法。 Long:长整数类,提供了处理长整数的一些方法。 Object类:Java语言中层次最高的类,它是所有类的超类,为定义特定父类的所有类都自动继承Object类的特性。,下一页,上一页,返回,4.4 包, String:字符串类,提供处理字符串常量的一些方法。 System:系统类,不能被继承,也不能被实例化。提供的功能包括输入、输出、获取当前属性等。 Thread:线程类,提供管理线程的功能。 TreadGroup:线程组类,一个线程可以访问其自身所属的线程类组,而不能访问该线程组的父线程组。 Throwable:Java异常类的最顶层类,其中包含 Error:错误类,该类错误一般是不可恢复和不可捕获的,Java不对其作任何处理。 Exception:异常类,用户可以使用异常捕获机制来处理这类异常。,下一页,上一页,返回,4.4 包,(2)java.io包。java.io包是处理输入和输出的包,操作对象包括键盘、屏幕、打印机、网络或磁盘文件,其中包括以下内容。 InputStream:提供输入流的基本接口,包括 BufferedInputStream:实现缓冲输入流。 ByteArrayInputStream:为应用程序建立输入流,其读
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 农业运营制度
- 网络运营公司制度
- 污水运营统筹管理制度
- 茶艺馆门店运营管理制度
- 农批市场运营商管理制度
- 菜鸟驿站日常运营制度
- 景点运营管理制度
- 自来水厂运营及管理制度
- 电商运营与客服管理制度
- 销售运营部门管理制度
- 量子科普知识
- 2025至2030中国航空安全行业市场深度研究与战略咨询分析报告
- 华润燃气2026届校园招聘“菁英计划·管培生”全面开启备考考试题库及答案解析
- 2025年医院财务部工作总结及2026年工作计划
- 成本管理论文开题报告
- 华润集团6S管理
- 新建粉煤灰填埋场施工方案
- 2025年提高缺氧耐受力食品行业分析报告及未来发展趋势预测
- 小学三年级数学判断题100题带答案
- 互联网运维服务保障承诺函8篇范文
- 2025年(第十二届)输电技术大会:基于可重构智能表面(RIS)天线的相控阵无线通信技术及其在新型电力系统的应用
评论
0/150
提交评论