第3章 类和对象.ppt
第3章 类和对象v3.1 面向对象程序设计v3.2 类v3.3 对象v3.4 包v3.5 内部类v3.6 类的封装性Java程序设计实用教程朱战立3.1 面向对象程序设计Java语言是一种面向对象的程序设计语言,类和对象是面向对象程序设计的基本概念。类是相似对象中共同属性和方法的集合体3.1.1 面向对象程序设计的基本概念3.1.2 类3.1.3 对象Java程序设计实用教程朱战立3.1.1 面向对象程序设计的基本概念面向对象程序设计方法的出发点和追求的基本目标,是使我们分析、设计和实现一个软件系统的方法接近我们认识一个事物的方法 现实世界中的一切客观实体都具有如下特征:有一个名字用来惟一地标识该客观实体有一组属性属性用来描述其特征有一组方法方法用来实现其功能 面向对象程序设计方法下的软件系统设计方法,首先是把问题中涉及的客观实体分割出来,并设计成称为类的可重复使用的模块,然后定义出一个个实例化的类(称为对象),再按照问题的要求,设计出用各个对象的操作完成的软件系统 Java程序设计实用教程朱战立3.1.2 类类是对具有相同属性和相同方法的一组相似对象的抽象,或者说,类所包含的属性和方法描述了一组对象的共同的属性和方法面向对象方法中软件设计的主体是类。类是相同属性和方法的封装体,因此类具有封装性;子类可以在继承父类所有属性和方法的基础上,再增加自己特有的属性和方法,因此类具有继承性;在一个类层次中,定义为根类的对象可被赋值为其任何子类的对象,并根据子类对象的不同而调用不同的方法,因此类具有多态性类的封装性、多态性和继承性,是面向对象程序设计的三个最重要的特点 Java程序设计实用教程朱战立3.1.3 对象可以把类看作一个模板,按照类模板所定义的一个个具体的对象称作类的实例,或称作对象一个具体对象必须具有具体的属性值,如A书店对象就必须具有如下属性:书点名为A书店,负责人为张三等。其次,任何对象都具有相应类所规定的所有方法 Java程序设计实用教程朱战立3.2 类面向对象方法中,软件设计的最主要部分是设计类。类的设计可以划分为类声明和类主体设计两部分。另外,构造方法设计需要特别注意3.2.1 类声明3.2.2 类主体设计3.2.3 构造方法Java程序设计实用教程朱战立3.2.1 类声明1.类声明的格式类声明的格式如下:修饰符 class类名 类主体其中,class是定义类的关键字,类名是所定义的类的名字 Java程序设计实用教程朱战立2.类的修饰符(1)访问控制符public和默认当访问控制符为public时,表示该类被定义为公共类。公共类表示该类能被任何类访问当没有访问控制符public时,即是默认类(或称缺省类)。默认类表示该类只能被同一个包中的类访问,而不能被其他包中的类访问。Java语言规定,一个Java文件中可以有很多类,但最多只能有一个公共类,其他都必须定义为默认类例如,public class Teacher 就声明了一个公共类Teache(2)类型说明符abstract和final当类型说明符为abstract时,表示该类为抽象类,抽象类不能用来定义对象当类型说明符为final时,表示该类为最终类,最终类不能用来再派生子类 例如,final public class Teacher 就声明了一个最终公共类Java程序设计实用教程朱战立3.2.2 类主体设计类主体设计包括类的成员变量设计和类的成员方法设计两部分 例3.1 设计一个日期类。要求方法应包括设置日期、显示日期和判断是否是闰年 设计:成员变量应包括年、月、日成员方法应包括输出日期值、判断是否为闰年。另外,每个类都要有构造方法Java程序设计实用教程朱战立public class Date private int year;private int month;private int day;public void SetDate(int y,int m,int d)year=y;month=m;day=d;public void Print()System.out.println(date is+year+-+month+-+day);public boolean IsLeapYear()return(year%400=0)|(year%100!=0)&(year%4=0);Java程序设计实用教程朱战立1.声明成员变量声明成员变量的格式为:修饰符 static final transient 变量类型 变量名;其中,修饰符有private、public和protected三种。当不加任何修饰符时,定义为默认修饰符private修饰符表示该成员变量只能被该类本身访问,任何其他类都不能访问该成员变量。不加任何访问权限限定的成员变量属于默认访问权限。默认访问权限表示该成员变量只能被该类本身和同一个包的类访问。protected修饰符表示该成员变量除可以被该类本身和同一个包的类访问外,还可以被它的子类(包括同一个包中的子类和不同包中的子类)访问。public修饰符表示该成员变量可以被所有类访问 Java程序设计实用教程朱战立2.声明方法声明成员方法的格式为:修饰符 static 返回值类型 方法名 (参数列表)方法体 其中,修饰符和成员变量的修饰符一样,含义也一样例如:public void SetDate(int y,int m,int d)Java程序设计实用教程朱战立3.方法体方法体是方法的具体实现。例如,public void SetDate(int y,int m,int d)year=y;/给成员变量year赋值y month=m;/给成员变量month赋值m day=d;/给成员变量day赋值d Java程序设计实用教程朱战立4.成员变量和变量初学者经常会混淆成员变量和变量,一个最简单的区别方法是:定义在类中的都是成员变量,定义在方法内的都是变量。另外,还有定义在方法参数中的虚参变量成员变量和变量的类型既可以是基本数据类型(如int、long等),也可以是已定义的类 Java程序设计实用教程朱战立3.2.3 构造方法有一种特殊的方法专门用来进行对象的初始化,这个专门用来进行对象初始化的方法称为构造方法构造方法。一个类中至少要有一个构造方法 例如,可以为上述日期类设计一个如下的构造方法:public Date(int y,int m,int d)year=y;month=m;day=d;Java程序设计实用教程朱战立3.3 对象对象是类的实例化。对象是软件系统中对现实世界中具体问题的软件模拟 3.3.1 main方法3.3.2 对象的创建和初始化3.3.3 对象的使用3.3.4 垃圾对象的回收3.3.5 实例成员变量与类成员变量3.3.6 实例方法与类方法3.3.7 方法的重写Java程序设计实用教程朱战立3.3.1 main方法Java语言规定,一个类中可以没有main方法。但是要运行的类中必须要有main方法。程序就是从main方法开始执行的 例3.2 设计一个日期类,并打印2004年8月5日是否是闰年设计:日期类的设计见例3.1。public static void main(String args)Date a=new Date(2004,8,5);a.Print();if(a.IsLeapYear()System.out.println(a.year+是闰年);else System.out.println(a.year+不是闰年);Java程序设计实用教程朱战立对象和数组一样,也是引用类型。语句Date a;a=new Date(2004,8,5)的内存示意图如下 Java程序设计实用教程朱战立3.3.2 对象的创建和初始化在例3.2中,语句Date a=new Date(2004,8,5);实现了定义对象a和为对象分配内存空间,并初始化对象a的成员变量数值为:year=2004;month=8;day=5;上述方法是把定义对象和创建对象这两个步骤结合在了一起,并同时进行了对象的初始化赋值。这是最简单、也是最经常使用的对象定义、创建和初始化方法 Java程序设计实用教程朱战立3.3.3 对象的使用一旦定义并创建了对象(创建对象是指为对象分配了内存单元),就可以在程序中使用对象。对象的使用主要有三种情况,分别是:使用对象的成员变量或方法对象间赋值把对象作为方法的参数 Java程序设计实用教程朱战立1.使用对象的成员变量或方法一旦定义并创建了对象,就可以使用对象的成员变量或方法。例如,例3.2的main()方法中a.year /使用对象a的成员变量year。a.Print()/使用对象a的成员方法Print()Java程序设计实用教程朱战立2.对象间赋值对象可以像变量一样赋值。例如,如果在例3.2的main()方法中增加如下语句,则对象b的值和对象a的值相同Date b;b=a;但和变量赋值不一样的是,对象赋值并没有真正把一个对象的数值赋给另一个对象,而是让另一个对象名(如对象名b)存储的对象的首地址和这个对象名(如对象名a)存储的对象的首地址相同。因此,对象b和对象a表示的是同一个对象 Java程序设计实用教程朱战立3.把对象作为方法的参数对象也可以像变量一样,作为方法的参数使用但系统实现两者的方法不同,变量作为方法的实参时,系统把实参的数值复制给虚参;而对象作为方法的实参时,系统是把实参对象名(该对象必须已创建)指示的对象的首地址赋给了虚参对象名。其实现方法实际上和对象间赋值的实现方法相同 Java程序设计实用教程朱战立3.3.4 垃圾对象的回收超出作用范围的对象(或称不再被使用的对象)称作垃圾对象谁来负责这些垃圾对象的回收呢?答案是,在Java中,收集和释放内存是一个叫做自动垃圾回收线程的责任自动垃圾回收线程在系统空闲时自动运行,这个线程监视用户程序中所有对象的有效作用范围,当某个对象超出其作用范围时,该线程就对这样的对象做上垃圾对象标识,并在适当的时候一次性回收这些垃圾对象所以,用户程序只需考虑为对象分配内存空间,不需考虑垃圾对象内存空间的回收 Java程序设计实用教程朱战立3.3.5 实例成员变量与类成员变量类有两种不同类型的成员变量:实例成员变量与类成员变量。类成员变量也称作静态成员变量。1.实例成员变量类定义中没用关键字static修饰的成员变量就是实例成员变量,不同对象的实例成员变量其值不相同。例如:private int year;private int month;private int day;Java程序设计实用教程朱战立2.类成员变量用关键字static修饰的成员变量称为类成员变量一个类的所有对象共享该类的类成员变量类成员变量可以用来保存和类相关的信息,或用来在一个类的对象间交流信息 Java程序设计实用教程朱战立3.3.6 实例方法与类方法类有两种不同类型的方法:实例方法与类方法。类方法也称作静态方法1.实例方法没用关键字static修饰的方法就是实例方法实例方法只能通过对象来调用实例方法既可以访问类成员变量,也可以访问类变量例如,3.2中类Date的SetDate()方法、Print()方法和IsLeapYear()方法都是实例方法Java程序设计实用教程朱战立2.类方法类方法用关键字static修饰的方法称为类方法类方法只能访问类变量,不能访问实例变量类方法主要用来处理和整个类相关的数据类方法既可以用类名来调用,也可以用对象来调用。但用类名调用类方法程序的可读性更好Java程序设计实用教程朱战立类方法举例public class ObjectNumber2 private static int number=0;public ObjectNumber2()number+;public static void Print()System.out.println(当前对象个数为:+number);public static void main(String args)ObjectNumber2 a=new ObjectNumber2();ObjectNumber2.Print();ObjectNumber2 b=new ObjectNumber2();ObjectNumber2.Print();Java程序设计实用教程朱战立3.3.7 方法的重写类的各种方法(包括构造方法和其他方法)都允许重写(也称做重载)方法重写(overloading),是指一个方法名定义了多个方法实现方法重写时要求,不同的方法,其参数类型或参数个数要有所不同若类的某个方法被重写,该类的对象在访问该方法时,以对象调用该方法的参数个数和参数类型与类的同名方法进行匹配,对象调用该方法的参数个数和参数类型与类定义中哪个方法的参数个数和参数类型完全一样,则调用类中的哪个方法Java程序设计实用教程朱战立3.4 包包(package)是Java提供的文件的组织方式。一个包对应一个文件夹,一个包中可以包括许多类文件。包中还可以再有子包,称为包等级3.4.1 包的建立方法3.4.2 包的使用方法3.4.3 包的访问权限3.4.4 系统定义的包Java程序设计实用教程朱战立3.4.1 包的建立方法1.定义文件所属的包定义文件所属的包包的定义语句格式为:package 包名;其中,package是关键字,包名是包的标识符。package语句指出了该语句所在文件所有的类属于哪个包如果一个 Java文件中有package语句,那么package语句必须写在Java源程序的第一行。例如,packageMyPackage;public class MyClass;Java程序设计实用教程朱战立2.创建包文件夹 自定义的包必须通知系统其文件夹所在的路径,这就需要用户首先创建包的文件夹并设置包的路径创建包文件夹的方法是:创建与包同名的文件夹创建与包同名的文件夹例如,我们可以在D盘根目录下创建一个与包同名的文件夹d:MyPackage。注意,这里的包名MyPackage必须与package语句后的包名大小写完全一致。设置包的路径设置包的路径用户必须通过设置环境变量classpath,把用户自定义包所在的路径添加到环境变量classpath中。例如,set classpath=.;c:jdk1.3.1lib;d:;Java程序设计实用教程朱战立3.把编译生成的把编译生成的.class文件移入包中文件移入包中用户的源程序文件(即.java文件)通常存放在另外的文件夹中,.java文件编译后产生的.class文件也存放在和.java文件相同的文件夹中。用户在编译.java文件成功后,需要把编译成功的.class文件移入用户自定义的包中例如,当上述的 MyClass.java文件编译成功后,需要设计人员自己把MyClass.class文件移入到d:MyPackage文件夹中,否则系统会因找不到类而给出出错信息Java程序设计实用教程朱战立3.4.2 包的使用方法包中存放的是编译后的类文件(.class文件)。用户可以在以后的程序中,通过import语句导入这些类,从而使用包中的这些类import语句的使用分两种情况:导入某个包中的某个类import MyPackage.MyClass;导入某个包中的全部类import MyPackage.*;注意:此时只导入包MyPackage中的全部类,但不包含其子包Java程序设计实用教程朱战立带自定义包Java程序的操作步骤(1)创建文件夹。如d:MyPackage(2)在环境变量中添加自定义包的路径。如在 autoexec.bat文件的classpath参数中添加d:(3)编译包中类的.java文件。如:javac Date1.java。(4)把编译成功的.class文件移入包中。如把当前工作 路 径 下 的 Date1.class文 件 移 动 到 文 件 夹d:MyPackage中(5)编译导入包的.java文件。如:javac UseDate.java。(6)运行导入包的.class文件。如:java UseDate Java程序设计实用教程朱战立3.4.3 包的访问权限同一个包中的类互相能访问不在一个包中的类互相不能直接访问。如果要在一个包中访问另一个包中的类,就必须用import语句导入所需要的类到该包中Java语言规定,被导入的类必须是用public修饰的类 Java程序设计实用教程朱战立3.4.4 系统定义的包Java语言提供了许多方便用户程序设计的基础类,这些系统定义的类以包的形式保存在系统包文件夹中如果要使用系统定义的包中的类,必须在源程序中用import语句导入例如,要进行图形用户界面设计,需要导入系统包java.awt中的所有类,所以要在源程序中使用如下导入语句:import java.awt.*;Java程序设计实用教程朱战立3.5 内部类一个类被嵌套定义于另一个类中,称为内部类(Inner Classes)或内隐类。包含内部类的类称为外部类内部类与前面讨论的非内部类的设计方法基本相同除外部类外的其他类无法访问内部类当一个类只在某个类中使用,并且不允许除外部类外的其他类访问时,可考虑把该类设计成内部类 Java程序设计实用教程朱战立3.6 类的封装性保证大型软件设计正确性和高效性的一个重要原则是模块化软件设计在面向对象程序设计中,保证模块正确性的基本方法是类的封装性。类的封装性是指类把成员变量和方法封装为一个整体保证模块正确性的措施则是由信息的隐藏性来实现的。那些允许其他包程序访问和修改的成员变量可以定义为public类型。那些不允许其他类(内部类除外)访问和修改的成员变量可以定义为private类型同样,那些允许其他包程序访问的方法可以定义为public类型。那些不允许其他类(内部类除外)访问的方法可以定义为private类型和别的面向对象程序设计语言(如C+语言)相比,Java语言增加了包的概念Java语言很好地实现了类的封装性 Java程序设计实用教程朱战立