ProgrammingLanguageJava:西安邮电学院计算机学院——朱晓龙第四章——类与对象1第四章类与对象ProgrammingLanguageJava:西安邮电学院计算机学院——朱晓龙第四章——类与对象2•4.1类与对象的概念•4.2类的定义•4.3对象•4.4成员变量•4.5成员方法•4.6类的组织方式——包•4.7访问权限•4.8内部类•4.9可变参数ProgrammingLanguageJava:西安邮电学院计算机学院——朱晓龙第四章——类与对象34.1类与对象的概念•现实世界中的任何事物都是对象。•所有的事物都有它的属性和行为。属性表示事物的静态特征,在某个时刻各个属性的取值反映事物的状态;行为表示事物的动态特征,一个行为可能会影响或改变事物的状态。•人们通过属性和行为来区分事物。ProgrammingLanguageJava:西安邮电学院计算机学院——朱晓龙第四章——类与对象4概念名称:人属性:性别、年龄、身高、体重等行为:直立行走、会说话、能劳动等人脑的概念世界张三李四王五陈六现实世界抽象实例化张三李四王五陈六计算机世界类名:人变量:性别、年龄、身高、体重等方法:直立行走、会说话、能劳动等映射映射ProgrammingLanguageJava:西安邮电学院计算机学院——朱晓龙第四章——类与对象5类与对象的关系•在计算机世界中,类是人脑概念世界的软件模型,由变量和方法组成,它定义了对象的本质属性和共同行为,是创造对象的“模板”。•对象是对现实世界中实体的描述,是现实世界中事物的软件模型,由数据(变量值)和方法组成。并且通过对类的实例化产生对象,进而引用对象。•简而言之,类是对象的模板,对象是类的实例。ProgrammingLanguageJava:西安邮电学院计算机学院——朱晓龙第四章——类与对象64.2类的定义4.2.1类定义的基本形式4.2.2类定义的一般形式ProgrammingLanguageJava:西安邮电学院计算机学院——朱晓龙第四章——类与对象74.2.1类定义的基本形式定义的基本形式是:class类名{成员变量;成员方法;}⑴class是关键字,表明其后定义的是一个类。⑵类名是用户为该类所起的名字,它必须是一个合法的Java标识符。⑶类体中的成员变量可以有多个,成员方法也可以有多个。ProgrammingLanguageJava:西安邮电学院计算机学院——朱晓龙第四章——类与对象8【例4-1】定义一个表示圆的类classCircle{//成员变量:圆的半径doubleradius;//成员方法:计算圆的面积doublegetArea(){returnradius*radius*Math.PI;}//成员方法:计算圆的周长doublegetPerimeter(){return2*radius*Math.PI;}}【模仿例4-1】定义矩形类、三角形类、梯形类。ProgrammingLanguageJava:西安邮电学院计算机学院——朱晓龙第四章——类与对象9【例4-2】在Java语言中,定义人类。编程思路:首先,将现实世界中各种人抽象成人脑概念世界中的概念“人”。它包括属性:姓名(name)、性别(sex)、年龄(age)等状态信息,和行为:直立行走(walk)、会说话(speak)、能劳动(work)等。其次,在Java程序中,用变量表示状态信息,用方法表示行为。ProgrammingLanguageJava:西安邮电学院计算机学院——朱晓龙第四章——类与对象10classHumankind{Stringname;charsex;intage;intheight;floatavoirdupois;voidwalk(){System.out.println(name+canwalk.);}voidspeak(){System.out.println(name+canspeak.);}voidwork(){System.out.println(name+canwork.);}}ProgrammingLanguageJava:西安邮电学院计算机学院——朱晓龙第四章——类与对象11【例4-3】定义职员类编程思路:首先,将现实世界中各种职员抽象成人脑概念世界中的概念“职员”。包括属性和行为。其次,为了解决工资管理问题,性别、年龄、身高、体重等属性以及会说话、能劳动等行为,与工资管理关系不大,可被忽略。这样,就抽象成人脑概念世界中的概念“职工”,它包括工号(id)、姓名(name)、职务(post)、工资(salary)等属性,以及升职(changePost)、调资(changeSalary)、打印职工信息(print)等行为。。ProgrammingLanguageJava:西安邮电学院计算机学院——朱晓龙第四章——类与对象12classEmployee{intid;Stringname,post;longsalary;voidchangePost(StringnewPost){post=newPost;}voidchangeSalary(longamount){salary=salary+amount;}voidprint(){System.out.println(工号:+id+\t姓名:+name+\t职务:+post+\t月薪:+salary);}}ProgrammingLanguageJava:西安邮电学院计算机学院——朱晓龙第四章——类与对象134.2.2类定义的一般形式类的定义格式:类修饰符class类名称[extends父类名称][implements接口名称列表]{成员变量的定义及初始化成员方法的定义及初始化}类的定义分为三个部分:IS,HAS,DOES。类的并列和嵌套在一个程序中,有时需要定义多个类。多个类的定义形式有两种:并列和嵌套。ProgrammingLanguageJava:西安邮电学院计算机学院——朱晓龙第四章——类与对象144.3对象•4.3.1对象的声明•4.3.2对象的创建与初始化•4.3.3对象的引用和清除ProgrammingLanguageJava:西安邮电学院计算机学院——朱晓龙第四章——类与对象154.3.1对象的声明对象声明的格式:类名对象变量名;其中,类名为引用类型(包括类、接口和数组)。声明不为对象分配空间,只为引用型变量分配一个空间,用来存放引用值。例如下列语句:HumankindzhangSan,liSi;Humankind是已经定义的类,是类型。zhangSan,liSi为引用变量。引用类型变量存储一个对象的引用值,不是对象本身。ProgrammingLanguageJava:西安邮电学院计算机学院——朱晓龙第四章——类与对象164.3.1对象的声明(续)熟悉C语言的同学,可进行如下类比。在C语言中定义int*p;//p是一个指针变量,它存放某个整型变量的地址,不存放某个整型值。structNode{intdata;structNode*next;}*p;//p是一个指针变量,它存放Node结构体类型的某个变量地址,不存放Node结构体类型某个变量的值。在Java中,引用型变量就相当于指针变量,引用值就相当于变量地址,对象就相当于Node结构体类型某个变量的值。引用类型变量只存储某个对象的引用值,不存储对象本身。ProgrammingLanguageJava:西安邮电学院计算机学院——朱晓龙第四章——类与对象174.3.2对象的创建与初始化实例创建表达式的一般格式如下:new类名([实参表]);实例创建表达式用于创建指定类的一个实例。其具体功能包括:(1)为实例分配内存空间;(2)初始化实例变量;(3)返回该实例的引用值。•根据例4-1,创建zhangSan对象的过程如下:•①HumankindzhangSan;•②zhangSan=newHumankind();ProgrammingLanguageJava:西安邮电学院计算机学院——朱晓龙第四章——类与对象184.3.3对象的引用和清除引用成员变量的格式为:对象变量名.成员变量名实例创建表达式用于创建指定类的一个实例。其具体功能包括:(1)为实例分配内存空间;(2)初始化实例变量;(3)返回该实例的引用值。•根据例4-1,创建zhangSan对象的过程如下:•①HumankindzhangSan;•②zhangSan=newHumankind();ProgrammingLanguageJava:西安邮电学院计算机学院——朱晓龙第四章——类与对象194.3.3对象的引用和清除(续)引用成员方法的格式为:对象变量名.成员方法名([参数表]);对象的清除是当不存在对某一对象的引用时,就释放该对象所占用的内存空间。对象清除的基本方法有:⑴依靠垃圾回收机制回收内存。它周期性地回收不用对象所占用的内存。⑵调用System.gc(),请求垃圾回收器释放不用对象所占内存。⑶Java系统开始时,自动调用Java.lang.Object.finalize()释放对象所占内存。⑷在程序中调用重写的finalize()释放对象所占内存。对象清除是由垃圾回收器自动完成的,一般来说,程序员不需要做任何工作。ProgrammingLanguageJava:西安邮电学院计算机学院——朱晓龙第四章——类与对象20【例4-4】定义圆类,创建圆对象,计算周长和面积classCircle{//成员变量:圆的半径doubleradius;//成员方法:计算圆的面积doublegetArea(){returnradius*radius*Math.PI;}//成员方法:计算圆的周长doublegetPerimeter(){return2*radius*Math.PI;}}ProgrammingLanguageJava:西安邮电学院计算机学院——朱晓龙第四章——类与对象21【例4-4】创建圆对象,计算周长和面积(续)classEx4_4{publicstaticvoidmain(String[]args){//圆类对象obj的创建及初始化Circleobj=newCircle();obj.radius=10;//obj成员变量radius的引用//obj成员方法getArea()的引用System.out.println(Area=+obj.getArea());//obj成员方法getPerimeter()的引用System.out.println(Perimeter=+obj.getPerimeter());}}【例4-5】编写一个程序,创建张三、李四对象,测试例4-2的Humankind类。ProgrammingLanguageJava:西安邮电学院计算机学院——朱晓龙第四章——类与对象22classHumankind{Stringname;charsex;intage;intheight;floatavoirdupois;voidwalk(){System.out.println(name+canwalk.);}voidspeak(){System.out.println(name+canspeak.);}voidwork(){System.out.println(name+canwork.);}}ProgrammingLanguageJava:西安邮电学院计算机学院——朱晓龙第四章——类与对象23classEx4_5{publicstaticvoidmain(String[]args[]){HumankindzhangSan;zhangSan=newHumankind();HumankindliSi=newHumankind();//zhangSan对象成员变量的引用(赋值)zhangSan.name=张三;zhangSan.sex='m';zhangSan.age=18;zhangSan.height=170;zhangSan.avoirdupois=60.5f;//lisi对象成员变量的引用(赋值)liSi.