版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章类和对象本章介绍Java的核心概念类与对象,是学习Java编程的关键之一,学习时应当深入理解切实掌握。掌握类的概念,掌握类的成员变量和成员方法的概念。理解自定义类与类库,了解常用的Java类库和使用类库的方法。掌握对象的概念、创建对象的方法。掌握对象的成员变量和成员方法的概念和引用成员变量、调用成员方法的方法。掌握类的构造方法的本质和用法。《Java程序设计应用教程》程序设计应用教程》第4章类和对象4.1类的定义4.2对象4.3进一步介绍对象4.4规范4.5枚举类4.6包《Java程序设计应用教程》程序设计应用教程》4.1类的定义4.1.1对象和类4.1.2类的结构4.1.3声明自定义类4.1.4类中的变量4.1.5类中的方法4.1.6类的构造函数4.1.7static在类定义中的作用《Java程序设计应用教程》程序设计应用教程》4.1.1对象和类
在了解什么是类之前,先了解对象是什么,将有助于理解类的概念。程序设计所面对的问题域——客观世界,是由许多事物构成的,这些事物既可以是有形的(比如一辆汽车),也可以是无形的(比如一次会议)。把客观世界中的事物映射到面向对象的程序设计中就是对象。对象是面向对象程序设计中用来描述客观事物的程序单位。客观世界中的许多对象,无论其属性还是其行为常常有许多共同性,抽象出这些对象的共同性便可以构成类。所以,类是对象的抽象和归纳,对象是类的实例。
现实世界中的对象都是具体而生动的。每个具体的对象都是用各种各样的信息来表示自己,同时,每个对象还可以做某种工作。
简单地说,类是对象的抽象。具体来讲,类就是用概括的方法提炼了具有相似特征的同类对象的一种抽象表示。
《Java程序设计应用教程》程序设计应用教程》1.什么是抽象抽象就是抽出事物的本质特性而暂时不考虑它们的细节。过程抽象和数据抽象是常用的两种主要抽象手段。
《Java程序设计应用教程》程序设计应用教程》2.如何用面向对象的方法实现抽象一个抽象数据类型(AbstractDataType,ADT)可以分解成4个部分,如图4-2所示。语法和语义构成抽象数据类型ADT的说明,让使用者了解这个抽象数据类型的特征。属性和方法构成ADT的实现,展示这个ADT是怎样做成的。图4-2抽象数据类型
《Java程序设计应用教程》程序设计应用教程》对象可将对象想象对象(object)应是实际问题域中有意义的个体或概念实体。此外,对象应该具有记忆自身状态的能力。同时对象应该以某种方式与系统发生关联,既对象应该与系统中其他有意义的对象进行消息传递,并提供外部服务。《Java程序设计应用教程》程序设计应用教程》对象(1)所有东西都是对象。可将对象想象成一种新型变量;它保存着数据,但可要求它对自身进行操作。(2)程序是一大堆对象的组合;通过消息传递,各对象知道自己该做些什么。(3)每个对象都有自己的存储空间,可容纳其他对象。(4)每个对象都有一种类型。根据语法,每个对象都是某个“类”的一个“实例”。其中,“类”(class)是“类型”(Type)的同义词。一个类最重要的特征就是“能将什么消息发给它?”(5)同一类所有对象都能接收相同的消息。《Java程序设计应用教程》程序设计应用教程》类是现实世界某些对象的共同特征(属性和操作)的表示,对象是类的实例。类的属性:就是类的静态属性的简称,指类内包含的各项数据,如变量或其他类的对象;类的服务:则被称为成员函数或方法。类《Java程序设计应用教程》程序设计应用教程》封装将信息隐蔽的过程称为封装。有两方面的原因促使我们控制对成员的访问。第一个原因是防止程序员接触他们不该接触的东西——通常是内部数据类型的设计思想。若只是为了解决特定的问题,用户只需操作接口即可,毋需明白这些信息。第二个原因是允许库设计人员修改内部结构,不用担心它会对客户程序员造成什么影响。
《Java程序设计应用教程》程序设计应用教程》4.1.2类的结构一个完整的类定义包括三个组成部分:类名、类的属性、类的方法。1、一个类的示例importjava.util.*;//加载Student所需的外部类,如ListpublicclassStudent{//开始Student类的声明//首先定义该类对象的属性//定义描述该类对象存储的信息privateStringid;//学号
privateStringname;//姓名privatechargender;//性别privateStringspeciality;//专业
//定义构造函数,一个类可以有多种构造对象的方法
publicStudent(){//一个不需要参数的构造函数
}publicStudent(Stringid,Stringname,chargender,Stringspeciality){this.id=id;=name;《Java程序设计应用教程》程序设计应用教程》this.gender=gender;this.speciality=speciality;}//以下开始定义该类对象的方法publicStringgetId(){returnthis.id;}publicvoidsetId(Stringid){this.id=id;}publicList<AcademicRecord>getAcademicRecordList(){returnthis.academicRecordList;}}
一个类描述了具有相似特征和行为的一类客观事物。例如,上面的Student类可以用来描述每个学生,每个学生都有自己的学号、姓名、性别和专业。《Java程序设计应用教程》程序设计应用教程》表4-1类所包含的主要信息元素必选作用加载部分当前类定义中引用了其他的类,如上例中用到的List和ArrayList两个属于java.util包内的类,需要在此声明加载类名√创建一种新的类型,其他地方可以通过这种类型声明该类型的变量,如Studentstu;类属性供所有该类对象共享的属性,该属性值随类而存在,只有一份,对象和类均可以通过类名访问,如System.out,out就是System类的一个类属性。此类属性声明时,只需在变量名字前加上static静态属性修饰符类初始化块当类加载时执行的代码块对象变量描述每个对象存储的信息,每个对象可能存储互不相同的信息,例如,每创建一个student对象,该对象中的学号id都是唯一的构造函数构造函数的名字与类名相同,其作用是控制该类对象的初始化,一个类可以有若干种构造函数。函数的代码通常是对象创建时需要事先准备好的工作类方法属于类所有,但该类的所有对象均可使用,如类属性。但是,由于执行类方法不必通过该类的任何一个对象,所以在类方法中不能使用从属于对象的对象属性和对象方法。声明时,只需在方法名字前加上static静态属性修饰符对象方法以使用对象的方式提供功能注释良好的注释,有助于开发人员更好地使用或维护类,编译器在编译时忽略注释信息《Java程序设计应用教程》程序设计应用教程》2、类声明语法(1)声明类类的声明类声明定义一个类的名称、访问权限、与其他类的关系等。声明类的格式为:[类修饰符]class类名[extends父类名][implements接口名表]{
类体}说明:class声明类的关键字。extends指明本类继承的父类,在其后指定父类名implements指明本类使用的接口,在其后指定接口名表类修饰符用于指定类的使用特性和访问权限,例如类是否为抽象类或最终类等。可取以下三种之一:public表明本类是共有类,在本包与其他包内均可访问。abstract表明本类为抽象类,必须被继承后才能使用。final表明本类为最终类,不能被其他类继承。类声明紧接一对大括号,在大括号中是类体。《Java程序设计应用教程》程序设计应用教程》(2)声明成员变量[修饰符]class类<泛型>[extends父类][implements接口列表]publicclassDate1 //类声明{intyear,month,day; //声明成员变量}(3)声明成员方法方法声明语法[修饰符]返回值类型方法([参数列表])[throws异常类]{
语句序列;[return[返回值]];}方法体中的局部变量方法体中用return语句返回值(4)声明main方法publicstaticvoidmain(Stringargs[])【例4.1】声明日期类。《Java程序设计应用教程》程序设计应用教程》3、使用对象声明对象类对象对象实例化对象=new类的构造方法([参数列表])Date1aday=newDate1();引用对象的成员变量和调用对象方法对象.成员变量对象.成员方法([参数列表])aday.year=2006;//引用对象的成员变量aday.setDate(2006,1,28);//调用对象的方法"abcd".equals("abc")
《Java程序设计应用教程》程序设计应用教程》3、使用对象对象的引用模型《Java程序设计应用教程》程序设计应用教程》3、使用对象方法调用时的参数传递原则基本数据类型参数传递值;引用数据类型参数传递引用。
释放对象Java语言具有资源回收机制,能够跟踪存储单元的使用情况,自动收回不再被使用的资源。【例4.2】引用数据类型作为方法的参数和返回值。《Java程序设计应用教程》程序设计应用教程》4、UML表示在UML图示中,类用一个具有三部分结构的符号来表示,图4-1显示了完整和简单的两种表示方法。与对象的UML图示符号相比,类名下没有下划线,而且名称的第一个字母都是大写。成员变量或成员方法前的“-”表示私有的,“+”表示公共的,“#”表示受保护的。标准格式简单格式Student-id:String-name:String-gender:char-speciality:String+addCourse()+showAcademicRecord()Course图4-1类的图示《Java程序设计应用教程》程序设计应用教程》4.1.3声明自定义类表4-2类的声明元素表元素必选作用public类的访问修饰符。Public表示该类可被其他任一类使用,如果没有public,该类只能被定义在同一个包内的其他类使用。该修饰符限定了类的可见范围abstract不能与final修饰符同时使用。声明当前类为抽象类。Java不允许直接用new运算符创建类型为抽象类的对象final不能与abstract修饰符同时使用。声明当前类为final(最终类),表示不能再定义该类的子类class类名√关键字class告诉编译器这是一个类<类型列表>用逗号分开的类型列表,表示该类是一个范型类(genericclass),一般用于构造一个具有通用目标性质的容器类,也可以简单理解为类的参数extends父类名Java语言具有良好的继承体系,每个类只可以继承一个父亲,所有类的根类来自Java语言核心包的java.lang.ObjectImplements接口列表用逗号分开的接口列表。每个类可以实现1到多个接口定义的方法集《Java程序设计应用教程》程序设计应用教程》4.1.3声明自定义类1、简单类
classStudent{…}2、可被任一其他类访问的类——public
publicclassStudent{…}3、一个不可被继承的最终类——final
publicfinalclassStudent{…}4、一个抽象的类——abstract
publicabstractclassStudent{…}5、一个继承了父类Student的类——extendspublicclassUnderGraduateextendsStudent{…}6、一个继承了父类Student且实现了一个接口的类
publicclassPostGraduateextendsStudentimplementsTakeTactics{…}《Java程序设计应用教程》程序设计应用教程》4.1.4类中的变量对象也称为类的一个实例,一个类可以创建任意所需数量的独立对象(实际受限于运行环境),对象彼此之间又各有不同,这种不同首先区别于它们各自的标识符(在创建时分配到的数值),其次区别于它们各自的属性。这种用来表示不同对象属性的定义称为成员变量。下面是变量声明的几种形式:
[访问权限修饰符]类型变量名;
[访问权限修饰符]类型变量名[=初值];[访问权限修饰符]类型变量名[=初值][,变量名[=初值]…];《Java程序设计应用教程》程序设计应用教程》表4-3属性声明元素元素必选作用public|private|protected|default访问控制范围修饰符加上默认没有任何访问控制范围修饰符的4种情况,规定了成员变量的可见范围,具体见表4-4static声明该变量为类变量final声明该变量为最终变量,一旦赋值,则不可修改transient标记该变量不被串行化,变量值不能用于基于socket的网络访问volatile一个变量被声明为volatile,表明它可以被异步修改,编程时需要注意type√每个变量必须规定它的类型,可以是基本类型(int、float、double等),也可以是引用类型(某种类,如Student、List等)name√变量的名称,要符合标识符的规定,在同一个作用域范围内,名称不能重复《Java程序设计应用教程》程序设计应用教程》1、类变量和对象变量当用类来创建一个对象时,对象将包含类定义的全部成员变量。但是,这些变量有一定的差异,这种差异表现在它们的存在位置不同,使用方式不同。根据这种不同,Java把它们区分为:类变量和对象变量(也称为实例变量)。在声明一个属性时,如果用static进行修饰,表明该属性属于类所有,也就是通过该类创建的对象实例都可以直接访问它,我们称它为类变量。但需要注意,并不是每个对象各有一份,而只是类拥有一份,该类的所有对象均可访问。
classBank{staticfinalfloatir_1=0.02;……}
《Java程序设计应用教程》程序设计应用教程》前面的程序种多次出现的System.out,就是这样的一个例子,out是System的类变量,所以在访问时,直接通过类名就可以直接引用。如果属性前没有static修饰,则表明该属性的值只能属于一个具体的对象,我们称它为对象变量或实例变量。classStudent{Stringsid;//每个学生的学号}对象属性的引用,只能通过对象名来引用那些可见的成员属性。《Java程序设计应用教程》程序设计应用教程》2、变量的访问作为一种规范,所有可被外部访问的可修改变量都应该有一对getXxxx()和setXxxx()的对应存取方法,以保证对属性值的存取操作均通过唯一的接口进行,而变量的访问控制范围则可以用private来修饰。
classStudent{privateStringsid;//每个学生的学号,注意private修饰符
……publicStringgetSid(){returnthis.sid;//返回当前对象的学号
}publicvoidsetSid(String_sid){this.sid=_sid;}}《Java程序设计应用教程》程序设计应用教程》3、访问控制范围修饰符访问控制范围修饰符限定了外界对对象内部的可见程度,Java提供了几个修饰符,用来对成员属性、方法和类的访问。名称修饰符类子类包所有类公共public√√√√友好……√√保护protected√√√所有private√注:默认修饰时为friend类,但在Java语言中,friend不是关键字用private修饰的实行,其可见范围只能在一个对象的内部,例如只能被该对象的方法访问,却不能通过对象名来访问。《Java程序设计应用教程》程序设计应用教程》4、变量作用域在类中定义的各种类型的变量,都存在各自的作用区域,一旦超出了起作用的区域,变量就不能发挥作用,程序如果引用了不在控制范围的变量将会引起错误。位置类方法类初始化块所有对象成员方法代码块备注类变量√√√√√成员变量√√所有成员方法方法参数√√同一方法内代码块变量√统一代码段异常捕获参数√异常处理块内另外,在一个小范围内定义的变量名称可能会与包含它的域范围内的另一个变量同名,在这种情况下会出现同名变量覆盖的情况,也就是在默认情况下,该变量代表小范围内定义的变量。
变量声明的实践经验总结:1、只在需要使用时,才声明变量,不要提前声明2、声明变量时,需要合理地进行初始化3、不要在循环体内部声明变量,否则会影响效率《Java程序设计应用教程》程序设计应用教程》4.1.5类中的方法方法:方法是自包含的有名代码块,能够完成一定的功能,并且具有可重用的特性。方法由对象通过调用方法名得到执行,一些方法有某种类型的返回值,另一些则没有。有返回值的方法通常在表达式中被调用,没有返回值的方法通常在调用语句中被调用。1)方法声明
[修饰符]方法返回类型方法名([类型参数1,[类型参数2,…]])[throw异常列表]{
方法体;
}例:publicintmax(intv1,intv2){
…}注:public:访问范围
int:返回值类型
max:方法名《Java程序设计应用教程》程序设计应用教程》2)方法调用调用对象方法的过程很简单,可以直接通过对象名用成员运算符来访问。3)形参和实参在执行某些方法时,需要接收一些外部的值,对象在执行这些方法时,就需要把这些值传递到方法代码中,这就需要一个传递的通道,形参就是这各通道。(请区别程序ParaSample.java和ParaSample1.java)4)值传递和引用传递引用传递相当于地址传递。《Java程序设计应用教程》程序设计应用教程》5)返回值及方法类型一个方法如果要返回某种类型的值,可以用return语句,程序执行时,如果遇到return语句,则无条件退出当前的执行过程,返回上级调用点,或者该程序运行结束。6)类方法和实例方法类似于变量,方法根据是否有static修饰也可以分为类方法和对象方法(实例方法)。访问时,类方法可以直接通过类名来引用,而实例方法必须通过对象名来访问,也就是说想使用实例方法,就必须先创建一个该类的对象。类方法体有以下限制,一旦违反将导致编译错误:(1)类方法中不能引用对象变量(2)类方法中不不调用类的对象方法(3)在类方法中不能使用super、this关键字。对象方法没有什么限制:(1)对象方法中可以引用对象变量,也可以引用类变量(2)对象方法中可以调用类方法(3)对象方法中可以使用super、this关键字《Java程序设计应用教程》程序设计应用教程》构造方法与析构方法要使用对象,首先必须构造它们,并指定它们的初始状态,然后将方法应用于对象。在Java程序设计语言中,使用构造函数(constructor)来构造新的实例。一个构造函数是一个新的方法,它的作用是构造并初始化对象。构造方法声明构造方法publicclassDate2{publicDate2(inty,intm,intd)//声明构造方法
{//构造方法与类同名,构造方法返回该类的一个实例year=y;month=m;day=d;}}Date2aday=newDate2(2006,1,28);默认的构造方法,如果类中没有定义构造函数,编译器会自动将一个没有任何参数的构造函数作为默认的构在函数。构造函数是类的一种特殊方法,它的特殊性主要体现在如下的几个方面:(1)构造函数的方法名与类名相同。(2)构造函数没有返回类型。(3)构造函数的主要作用是完成对类对象的初始化工作。(4)构造函数不能由编程人员显式地直接调用。(5)在创建一个类的新对象的同时,系统会自动调用该类的构造函数为新对象初始化。构造方法的使用局限在下述两个地方:(1)创建对象(2)在构造方法的方法体的第一条语句,可以调用同类中的另一各构造方法或者时父类的构造方法《Java程序设计应用教程》程序设计应用教程》publicclassStudent{//首先定义该类对象的属性privateStringid;//学号
privateStringname;//姓名privatechargender;//性别privateStringspeciality;//专业publicStudent(){//一个不需要参数的构造函数或构造方法
}//带有参数的构造函数或构造方法publicStudent(Stringid,Stringname,chargender,Stringspeciality){this.id=id;=name;
this.gender=gender;this.speciality=speciality;}}《Java程序设计应用教程》程序设计应用教程》图4.2使用拷贝构造方法复制对象Date2aday3=newDate2(aday2); //由已知对象创建新对象《Java程序设计应用教程》程序设计应用教程》2.析构方法publicvoidfinalize() //析构方法{
语句序列;}《Java程序设计应用教程》程序设计应用教程》方法的重载方法的重载重载(overload)是指同一个类中的多个方法可以同名但参数列表必须不同。Math.abs()方法声明有4种:intabs(inta)longabs(longa)floatabs(floata)doubleabs(doublea)成员方法重载构造方法重载Date2
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2027届安徽省黄山市休宁县六年级数学第一学期期末质量检测试题含解析
- 2027届山东菏泽郓城数学七年级第一学期期末复习检测试题含解析
- 福建省泉州市德化县2026-2027学年七年级数学第一学期期末联考模拟试题含解析
- 四川省攀枝花市名校2026年数学七上期末调研模拟试题含解析
- 广西北海市银海区2026年七上数学期末质量检测试题含解析
- 湖北省随州市随县2026-2027学年数学七上期末联考试题含解析
- 山东省博兴县2027届七上数学期末考试模拟试题含解析
- 西宁市重点中学2027届数学七年级第一学期期末综合测试模拟试题含解析
- 七下微机试题及答案
- 历年民航一建试题及答案
- 实施指南(2025)《DL-T 1650-2016小水电站并网运行规范》
- 附着式升降脚手架施工方案
- 智能路灯分区节能管理方案
- 饮水工程方案投标文件(技术标)
- 海南省2024年普通高中学业水平合格性考试地理试卷(含答案)
- 安全生产论文5000字
- 2024-2025学年北师大版八年级数学(下)期末必考题型专项复习【40大考点】解析版
- 战伤救护技术课件
- 销售话术培训
- 主要施工机械设备、劳动力、设备材料投入计划及其保证措施
- 雅斯贝尔斯-轴心时代课件
评论
0/150
提交评论