《第4章类与对象.ppt》由会员分享,可在线阅读,更多相关《第4章类与对象.ppt(120页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第4章类与对象 Still waters run deep.流静水深流静水深,人静心深人静心深 Where there is life,there is hope。有生命必有希望。有生命必有希望主要内容主要内容 从抽象到类从抽象到类 构造方法与对象的创建构造方法与对象的创建 参数传值参数传值 有理数的类封装有理数的类封装 对象的组合对象的组合 实例成员与类成员实例成员与类成员 方法重载与多态方法重载与多态 this this关键字关键字 包包 import import语句语句 访问权限访问权限难点难点 参数传值参数传值导学导学2抽象的关键是抓住事物的两个方面:抽象的关键是抓住事物的两个方面:
2、属性属性和和功能功能抽象的目的是从具体的实例中抽取出共有属性和功抽象的目的是从具体的实例中抽取出共有属性和功能形成一种数据类型。能形成一种数据类型。4.1 4.1 从抽象到类从抽象到类3类是组成类是组成JavaJava程序的基本要素。类封装了一类对象程序的基本要素。类封装了一类对象的属性和功能。类是用来产生对象的一种的属性和功能。类是用来产生对象的一种数据类型。数据类型。类的实现包括两部分:类的实现包括两部分:类声明类声明和和类体类体。基本格式为:。基本格式为:classclass 类名类名 类体的内容类体的内容 classclass是关键字,用来定义类。是关键字,用来定义类。“classcl
3、ass类名类名”是类是类的声明部分,类名必须是合法的的声明部分,类名必须是合法的JavaJava标识符。两个标识符。两个大括号以及之间的内容是类体。大括号以及之间的内容是类体。4.2 4.2 类类4为了给出为了给出VehicleVehicle类,需要进行类声明,例如:类,需要进行类声明,例如:class Vehicle class Vehicle 其中的其中的“class Vehicleclass Vehicle”称作类声明;称作类声明;“VehicleVehicle”是类名。类的名字要符合标识符规定,即名字可以是类名。类的名字要符合标识符规定,即名字可以由字母、下划线、数字或美元符号组成,并
4、且第一由字母、下划线、数字或美元符号组成,并且第一个字符不能是数字。给类命名时,遵守下列编程风个字符不能是数字。给类命名时,遵守下列编程风格。格。4.2.1 4.2.1 类声明类声明5写类的目的是根据抽象描述一类事物共有写类的目的是根据抽象描述一类事物共有的的属性属性和和功能功能,给出用于创建具体实例的,给出用于创建具体实例的一种数据类型,描述过程由类体来实现。一种数据类型,描述过程由类体来实现。类声明之后的一对大括号类声明之后的一对大括号“”,“”以以及它们之间的内容称作类体,大括号之间及它们之间的内容称作类体,大括号之间的内容称作类体的内容。的内容称作类体的内容。类体的内容由两部分构成:一
5、部分是类体的内容由两部分构成:一部分是变量变量的声明的声明,用来,用来刻画属性刻画属性;另一部分是;另一部分是方法方法的定义的定义,用来,用来刻画功能。刻画功能。4.2.2 4.2.2 类体类体6public class Vehiclepublic class Vehicle double speed;/double speed;/变量声明部分变量声明部分,刻画速度刻画速度 int power;/int power;/变量声明部分变量声明部分,刻画功率刻画功率 void speedUp(int s)/void speedUp(int s)/方法定义方法定义,刻画加速功能刻画加速功能 speed
6、=speed+s;speed=speed+s;void speedDown(int d)/void speedDown(int d)/方法定义方法定义,刻画减速功能刻画减速功能 speed=speed-d;speed=speed-d;void setPower(int p)void setPower(int p)power=p;power=p;int getPower()int getPower()return power;return power;double getSpeed()double getSpeed()return speed;return speed;7类体分为两部分:一部分是
7、变量的声明,另一部分类体分为两部分:一部分是变量的声明,另一部分是方法的定义。是方法的定义。变量声明部分所声明的变量变量声明部分所声明的变量被称做被称做域变量或域变量或成员变量成员变量。4.2.3 4.2.3 成员变量成员变量8成员变量的类型成员变量的类型可以是可以是JavaJava中的任何一种数据类型,中的任何一种数据类型,包括:包括:基本类型基本类型:整型、浮点型、字符型;:整型、浮点型、字符型;引用类型引用类型:数组、对象和接口(对象和接口见后续:数组、对象和接口(对象和接口见后续内容)。内容)。1 1成员变量的类型成员变量的类型91 1成员变量的类型成员变量的类型:举例说明举例说明cl
8、ass Factoryclass Factory float a;float a;Workman zhang;Workman zhang;class Workmanclass Workman double x;double x;10成员变量在成员变量在整个类内都有效整个类内都有效,其有效性与它在类体其有效性与它在类体中书写的先后位置无关。中书写的先后位置无关。不提倡把成员变量的定义分散地写在方法之间或类不提倡把成员变量的定义分散地写在方法之间或类体最后。体最后。2 2成员变量的有效范围成员变量的有效范围11(1 1)一行只声明一个变量。)一行只声明一个变量。(2 2)变量的名字除了符合标识符规
9、定外,名字的)变量的名字除了符合标识符规定外,名字的首单词的首单词的首字母使用小写首字母使用小写;如果变量的名字由多个;如果变量的名字由多个单词组成,从单词组成,从第第2 2个单词开始的其他单词的首字母个单词开始的其他单词的首字母使用大写使用大写。(3 3)变量名字见名知意,避免使用诸如)变量名字见名知意,避免使用诸如m1m1,n1n1等作为变量的名字,尤其是名字中不要将小写的英等作为变量的名字,尤其是名字中不要将小写的英文字母文字母l l和数字和数字1 1相邻接,人们很难区分相邻接,人们很难区分“l1l1”和和“ll ll”。3 3编程风格编程风格12方法的定义包括两部分:方法的定义包括两部
10、分:方法声明方法声明和和方法体方法体。一般。一般格式为:格式为:方法声明部分方法声明部分 方法体的内容方法体的内容 4.2.4 4.2.4 方法方法13最基本的方法声明包括最基本的方法声明包括方法名方法名和方法的和方法的返回类型返回类型,如:如:double getSpeed()double getSpeed()return speed;return speed;注意注意:(1)(1)返回值类型可以是返回值类型可以是JavaJava中任何数据类型中任何数据类型 (2)(2)方法的参数同方法的参数同C C语言函数类似语言函数类似1 1方法声明方法声明14方法声明之后的一对大括号方法声明之后的一对
11、大括号“”,“”以及之间的内容称以及之间的内容称作方法的方法体。作方法的方法体。方法体的内容包括局部变量的声明和方法体的内容包括局部变量的声明和JavaJava语句,即方法体内语句,即方法体内可以对成员变量和该方法体中声明的局部变量进行操作。可以对成员变量和该方法体中声明的局部变量进行操作。在方法体中声明的变量和方法的参数被称作在方法体中声明的变量和方法的参数被称作局部变量局部变量。int getSum(int n)int getSum(int n)int sum=0;int sum=0;for(int i=1;i=n;i+)for(int i=1;i9)if(m9)int z=10;/int
12、 z=10;/z z为局部变量为局部变量z=2*m+z;z=2*m+z;for(int i=0;im;i+)for(int i=0;i0)if(r0)radius=r;radius=r;double getRadius()double getRadius()return radius;return radius;double getArea()double getArea()area=3.14*radius*radius;area=3.14*radius*radius;return area;return area;46public class Example4_4 public class
13、Example4_4 public static void main(String args)public static void main(String args)Circle circle=new Circle();Circle circle=new Circle();double w=12.76;double w=12.76;circle.setRadius(w);circle.setRadius(w);System.out.println(System.out.println(圆的半径:圆的半径:+circle.getRadius();+circle.getRadius();Syste
14、m.out.println(System.out.println(圆的面积:圆的面积:+circle.getArea();+circle.getArea();System.out.println(System.out.println(更改向方法参数更改向方法参数r r传递值的传递值的w w的值为的值为100);100);w=100;w=100;System.out.println(w=+w);System.out.println(w=+w);System.out.println(System.out.println(圆的半径:圆的半径:+circle.getRadius();+circle.g
15、etRadius();47JavaJava的的引用型数据引用型数据包括前面刚刚学习的包括前面刚刚学习的对象对象,以及后面将要学,以及后面将要学习的习的数组数组和和接口接口。当参数是引用类型时,当参数是引用类型时,“传值传值”传递的是变传递的是变量中存放的量中存放的“引用引用”,而不是变量所引用的实体。,而不是变量所引用的实体。需要注意的是,对于两个同类型的引用型变量,如果具有同样需要注意的是,对于两个同类型的引用型变量,如果具有同样的引用,就会用同样的实体,因此,的引用,就会用同样的实体,因此,如果改变参数变量所引用如果改变参数变量所引用的实体,就会导致原变量的实体发生同样的变化的实体,就会导
16、致原变量的实体发生同样的变化;但是,改变;但是,改变参数中存放的参数中存放的“引用引用”不会影响向其传值的变量中存放的不会影响向其传值的变量中存放的“引引用用”,反之亦然,反之亦然4.4.3 4.4.3 引用类型参数的传值引用类型参数的传值48例例4-54-5:public class TV public class TV int channel;/int channel;/电视频道电视频道 void setChannel(int m)void setChannel(int m)if(m=1)if(m=1)channel=m;channel=m;int getChannel()int getC
17、hannel()return channel;return channel;void showProgram()void showProgram()switch(channel)switch(channel)case 1:System.out.println(case 1:System.out.println(综合频道综合频道););break;break;case 2:System.out.println(case 2:System.out.println(经济频道经济频道););break;break;case 3:System.out.println(case 3:System.out.
18、println(文艺频道文艺频道););break;break;case 4:System.out.println(case 4:System.out.println(国际频道国际频道););break;break;case 5:System.out.println(case 5:System.out.println(体育频道体育频道););break;break;default:System.out.println(default:System.out.println(不能收看不能收看+channel+channel+频道频道););49public class Chineses publi
19、c class Chineses TV homeTV;TV homeTV;void buyTV(TV tv)void buyTV(TV tv)homeTV=tv;homeTV=tv;void remoteControl(int m)void remoteControl(int m)homeTV.setChannel(m);homeTV.setChannel(m);void seeTV()void seeTV()homeTV.showProgram();homeTV.showProgram();System.out.println(System.out.println(用户买回的电视是在用户买回
20、的电视是在+homeTV.getChannel()+homeTV.getChannel()+频道频道););50public class Example4_5 public class Example4_5 public static void main(String args)public static void main(String args)TV haierTV=new TV();TV haierTV=new TV();haierTV.setChannel(5);haierTV.setChannel(5);System.out.println(System.out.println(卖给
21、用户的卖给用户的haierTVhaierTV目前的频道目前的频道是是+haierTV.getChannel();+haierTV.getChannel();Chineses zhangsan=new Chineses();Chineses zhangsan=new Chineses();zhangsan.buyTV(haierTV);zhangsan.buyTV(haierTV);System.out.println(zhangsan System.out.println(zhangsan开始看电视节目开始看电视节目););zhangsan.seeTV();zhangsan.seeTV();i
22、nt m=2;int m=2;System.out.println(zhangsan System.out.println(zhangsan用遥控器将买回的电用遥控器将买回的电视更改到视更改到+m+m+频道频道););zhangsan.remoteControl(m);zhangsan.remoteControl(m);System.out.println(System.out.println(现在卖给用户的现在卖给用户的haierTVhaierTV目前的目前的频道是频道是+haierTV.getChannel();+haierTV.getChannel();System.out.printl
23、n(zhangsan System.out.println(zhangsan再看电视节目再看电视节目););zhangsan.seeTV();zhangsan.seeTV();51可变参数可变参数(The variable argumentsThe variable arguments)是)是JDK 1.5JDK 1.5新新增的功能增的功能。可变参数是指在声明方法时不给出参数列表中从某项可变参数是指在声明方法时不给出参数列表中从某项直至最后一项参数的名字和个数,但这些参数的类型直至最后一项参数的名字和个数,但这些参数的类型必须相同。必须相同。可变参数使用可变参数使用“”表示若干个参数表示若干个
24、参数,这这些参数的类型必须相同,最后一个参数必须是参数列些参数的类型必须相同,最后一个参数必须是参数列表中的最后一个参数。表中的最后一个参数。对于一个参数代表,如对于一个参数代表,如x,x,那么那么x.lengthx.length等于等于x x所代表的所代表的参数个数参数个数参数代表可以通过下标来表示参数列表中的具体参数,参数代表可以通过下标来表示参数列表中的具体参数,如如x0,x1x0,x14.4.4 4.4.4 可变参数可变参数52public class Computer public class Computer public int getSum(public int getSum(
25、int.xint.x)/x)/x是可变参是可变参数的参数代表数的参数代表 int sum=0;int sum=0;for(int i=0;ix.length;i+)for(int i=0;ix.length;i+)sum=sum+xi;sum=sum+xi;return sum;return sum;53public class Example4_6 public class Example4_6 public static void main(String args)public static void main(String args)Computer computer=new Compu
26、ter();Computer computer=new Computer();int int result=computer.getSum(203,178,56,2098);result=computer.getSum(203,178,56,2098);System.out.println(1203,178,56,2098 System.out.println(1203,178,56,2098的和的和:+result);:+result);result=computer.getSum(66,12,5,89,2,51);result=computer.getSum(66,12,5,89,2,51
27、);System.out.println(66,12,5,89,2,51 System.out.println(66,12,5,89,2,51的和的和:+result);:+result);544.6 4.6 对象的组合对象的组合一个一个类类可以把可以把对对象作象作为为自己的成自己的成员变员变量,如果用量,如果用这这样样的的类创类创建建对对象,那么象,那么该对该对象中就会有其他象中就会有其他对对象。象。554.6.1 4.6.1 圆锥体圆锥体对圆锥体作一个抽象:对圆锥体作一个抽象:属性属性:底圆,高:底圆,高功能功能:计算体积:计算体积例例4-84-856public class public
28、 class CircularCircular Circle bottomCircle bottom;double heightdouble height;void setBottom(Circle c)void setBottom(Circle c)bottom=c;bottom=c;void setHeight(double h)void setHeight(double h)height=h;height=h;double getVolme()double getVolme()return bottom.getArea()*height/3.0;return bottom.getArea
29、()*height/3.0;double getBottomRadius()double getBottomRadius()return bottom.getRadius();return bottom.getRadius();public void setBottomRadius(double r)public void setBottomRadius(double r)bottom.setRadius(r);bottom.setRadius(r);57public class Example4_8 public class Example4_8 public static void mai
30、n(String args)public static void main(String args)Circle circle=new Circle();Circle circle=new Circle();circle.setRadius(29);circle.setRadius(29);Circular circular=new Circular();Circular circular=new Circular();circular.setBottom(circle);circular.setBottom(circle);circular.setHeight(128.76);circula
31、r.setHeight(128.76);System.out.println(System.out.println(圆锥底圆的半径圆锥底圆的半径:+circular.getBottomRadius();:+circular.getBottomRadius();System.out.printf(System.out.printf(圆锥的体积圆锥的体积(保留保留3 3位小数位小数):%5.3fn,circular.getVolme();):%5.3fn,circular.getVolme();circular.setBottomRadius(208);circular.setBottomRadi
32、us(208);System.out.println(System.out.println(圆锥底圆的半径圆锥底圆的半径:+circular.getBottomRadius();:+circular.getBottomRadius();System.out.printf(System.out.printf(圆锥的体积圆锥的体积(保留保留3 3位小数位小数):%5.3fn,circular.getVolme();):%5.3fn,circular.getVolme();584.6.2 4.6.2 关联关系和依赖关系的关联关系和依赖关系的UMLUML图图1 1关联关系关联关系如果如果A A类中成员
33、变量是用类中成员变量是用B B类声明的对象,那么类声明的对象,那么A A和和B B的关系是关联关系,称的关系是关联关系,称A A关联于关联于B B或或A A组合了组合了B B。4.6 4.6 对象的组合对象的组合59关联关系关联关系如果如果A A关联于关联于B B,那么,那么UMLUML使用一个实线连接使用一个实线连接A A和和B B的的UMLUML图,实线的起始端是图,实线的起始端是A A的的UMLUML图,终点端是图,终点端是B B的的UMLUML图,但终点端使用一个指向图,但终点端使用一个指向B B的的UMLUML图的方图的方向箭头表示实线的结束。向箭头表示实线的结束。CircularB
34、ottom:CirclesetBottom(Circle):voidCircleradius:doublegetArea():double60如果如果A A类中某个方法的参数是用类中某个方法的参数是用B B类声明的对象或某类声明的对象或某个方法返回的数据类型是个方法返回的数据类型是B B类对象,那么类对象,那么A A和和B B的关的关系是依赖关系,称系是依赖关系,称A A依赖于依赖于B B。2依赖关系61依赖关系如果如果A A依赖于依赖于B B,那么,那么UMLUML使用一个使用一个虚线连接虚线连接A A和和B B的的UMLUML图,图,虚线的起始端是虚线的起始端是A A的的UMLUML图图,
35、终点端是终点端是B B的的UMLUML图图,但终点端使用一个指向,但终点端使用一个指向B B的的UMLUML图的方图的方向箭头表示虚线的结束。向箭头表示虚线的结束。ClassRoomamount:intcount(Student):void.Studentnumber:intgetNumber():int624.7.1 4.7.1 实例变量和类变量的声明实例变量和类变量的声明成员变量可细分为成员变量可细分为实例变量实例变量和和类变量类变量。在声明成员变量时,用关键字在声明成员变量时,用关键字staticstatic给予修饰的称给予修饰的称作类变量,否则称作实例变量(类变量也称为作类变量,否则称
36、作实例变量(类变量也称为staticstatic变量,静态变量)变量,静态变量)class Dogclass Dog float x;float x;/实例变量实例变量 staticstatic int y;int y;/类变量类变量 4.7 4.7 实例成员与类成员实例成员与类成员631 1不同对象的实例变量互不相同不同对象的实例变量互不相同分配给不同的对象的实例变量占有不同的内分配给不同的对象的实例变量占有不同的内存空间。存空间。2 2所有对象共享类变量所有对象共享类变量3 3通过类名直接访问类变量通过类名直接访问类变量4.7.2 4.7.2 实例变量和类变量的区别实例变量和类变量的区别6
37、4public class public class LaderLader double double 上底上底,高高;/实例变量实例变量 static static double double 下底下底;/类变量类变量 void void 设置上底设置上底(double a)(double a)上底上底 =a;=a;void void 设置下底设置下底(double b)(double b)下底下底 =b;=b;double double 获取上底获取上底()()return return 上底上底;double double 获取下底获取下底()()return return 下底下底;6
38、5public class Example4_9 public class Example4_9 public static void main(String args)public static void main(String args)Lader.Lader.下底下底=100;/Lader=100;/Lader的字节码被加载到的字节码被加载到内存内存,通过类名操作类变量通过类名操作类变量 Lader laderOne=new Lader();Lader laderOne=new Lader();Lader laderTwo=new Lader();Lader laderTwo=new L
39、ader();laderOne.laderOne.设置上底设置上底(28);(28);laderTwo.laderTwo.设置上底设置上底(66);(66);System.out.println(laderOne System.out.println(laderOne的上底的上底:+laderOne.:+laderOne.获取上底获取上底();();System.out.println(laderOne System.out.println(laderOne的下底的下底:+laderOne.:+laderOne.获取下底获取下底();();System.out.println(laderTwo
40、 System.out.println(laderTwo的上底的上底:+laderTwo.:+laderTwo.获取上底获取上底();();System.out.println(laderTwo System.out.println(laderTwo的下底的下底:+laderTwo.:+laderTwo.获取下底获取下底();();660 x1230上底上底0高高100下底下底0 x12300landeronelandertwo图图4.20:对象共享类变量对象共享类变量67类中的方法也可分为类中的方法也可分为实例方法实例方法和和类方法类方法。方法声明时,方法类型前面不加关键字方法声明时,方法类
41、型前面不加关键字staticstatic关键关键字修饰的是实例方法,字修饰的是实例方法,加加staticstatic关键字修饰的是类关键字修饰的是类方法(静态方法)。方法(静态方法)。4.7.3 4.7.3 实例方法和类方法的定义实例方法和类方法的定义681 1对象调用实例方法对象调用实例方法(1)(1)当类的字节码文件被加载到内存时,当类的字节码文件被加载到内存时,类的实例方类的实例方法法不会被分配入口地址,只有该类创建对象后,类不会被分配入口地址,只有该类创建对象后,类中的实例方法才分配入口地址,从而实例方法可以中的实例方法才分配入口地址,从而实例方法可以被类创建的任何对象调用执行。被类创
42、建的任何对象调用执行。4.7.4 4.7.4 实例方法和类方法的区别实例方法和类方法的区别(2)(2)实例方法中不仅可以操作实例变量,也可以操作实例方法中不仅可以操作实例变量,也可以操作类变量。类变量。69public class Apublic class A int x;int x;staticstatic int y;int y;pubic void test()pubic void test()System.out.println(x);/System.out.println(x);/合法合法 Systm.out.println(y);/Systm.out.println(y);/合法
43、合法 70对于类中的类方法,在该类被加载到内存时,就分对于类中的类方法,在该类被加载到内存时,就分配了相应的入口地址。配了相应的入口地址。实例方法不能通过类名调用,只能由对象来调用。实例方法不能通过类名调用,只能由对象来调用。2 2类名调用类方法类名调用类方法71注意事项:注意事项:(1 1)类成员方法中除使用本方法中声明的局部变)类成员方法中除使用本方法中声明的局部变量外,量外,只可以访问类成员变量只可以访问类成员变量,不能访问实例成员不能访问实例成员变量;变量;而实例成员方法中除可以使用本方法中声明的局而实例成员方法中除可以使用本方法中声明的局部变量,部变量,还可以访问类成员变量及实例成员
44、变量还可以访问类成员变量及实例成员变量。72class Democlass Demo int a;int a;staticstatic int b;int b;staticstatic int f1()int f1()System.out.println(a);/System.out.println(a);/不可以访问变量不可以访问变量a a System.out.println(b);/System.out.println(b);/合法合法 73注意事项:注意事项:(2)(2)类成员方法中只能调用类成员方法类成员方法中只能调用类成员方法,不能调用,不能调用实例成员方法;实例成员方法;而实例成
45、员方法既可以调用类成员方法,也可以调而实例成员方法既可以调用类成员方法,也可以调用实例成员方法。用实例成员方法。由于由于main()main()方法是类成员方法,所以在方法是类成员方法,所以在main()main()方法方法中,只能调用类成员方法。中,只能调用类成员方法。74例例4-104-10class Sum class Sum int x,y,z;int x,y,z;static int getContinueSum(int start,int static int getContinueSum(int start,int end)end)int sum=0;int sum=0;for(
46、int i=start;i=end;i+)for(int i=start;i=end;i+)sum=sum+i;sum=sum+i;return sum;return sum;public class Example4_10 public class Example4_10 public static void main(String args)public static void main(String args)int result=Sum.getContinueSum(0,100);int result=Sum.getContinueSum(0,100);System.out.print
47、ln(result);System.out.println(result);75方法重载的意思是,一个类中可以有方法重载的意思是,一个类中可以有多个方法具有多个方法具有相同的名字相同的名字,但这些方法的,但这些方法的参数必须不同参数必须不同,即或者,即或者是是参数的个数不同参数的个数不同,或者是,或者是参数的类型不同参数的类型不同。4.8 4.8 方法重载与多态方法重载与多态76class Aclass Afloat float addadd(int a,int b)(int a,int b)return a+b;return a+b;float float addadd(long a,int
48、 b)(long a,int b)return a+b;return a+b;double double addadd(double a,int b)(double a,int b)return a+b;return a+b;77例例4_11:4_11:重载举例重载举例public class Tixing public class Tixing double above,bottom,height;double above,bottom,height;Tixing(double a,double b,double h)Tixing(double a,double b,double h)abo
49、ve=a;above=a;bottom=b;bottom=b;height=h;height=h;double getArea()double getArea()return(above+bottom)*height/2;return(above+bottom)*height/2;78public class People public class People double double computerAreacomputerArea(Circle c)(Circle c)double area=c.getArea();double area=c.getArea();return area
50、;return area;double double computerAreacomputerArea(Tixing t)(Tixing t)double area=t.getArea();double area=t.getArea();return area;return area;79public class Example4_11 public class Example4_11 public static void main(String args)public static void main(String args)Circle circle=new Circle();Circle