第四章 类与对象.ppt
第四章 类与对象类类对象对象参数传值参数传值对象组合对象组合static关键字关键字this关键字关键字包与包与import语句语句jar文件文件难点难点参数传值与对象组合参数传值与对象组合包和包和import语句语句主要内容主要内容4.1 编程语言的几个发展阶段客观事物(问题域)计算机(硬件)语言的鸿沟自然语言面向对象的语言非OO的高级语言汇编语言机器语言4.1.1 面向机器的语言n机器语言n汇编语言机器语言n机器语言是计算机能够理解并直接执行的惟一语言。n整个语言只包含“0”和“1”两种符号。n机器语言编写的程序,无论是它的指令、数据还是其存储地址,都是由二进制的“0”和“1”组成的。汇编语言n用一些易于理解和记忆的符号来代替二进制指令,这便是汇编语言n汇编语言是一种与具体机器有关的语言,也是一种面向机器的语言,称符号化的机器语言。4.1.2 面向过程的语言nC语言nFortran语言nPascal语言4.2.3 面向对象的语言n封装性n类的抽象n继承性n子类可以继承父类的属性和功能n多态性n同一操作的多个不同状态类和对象的关系抽象实例化对象:刘丽静态特征:刘丽女讲师890.00动态特征:授课评职称调工资数据值执行的操作方法名数据结构类:教师属性:姓名性别职称工资服务:授课评职称调工资4.2 类n类是组成Java程序的基本要素n类封装了一类对象的状态和方法n类是用来定义对象的模板类的实现n类的实现包括:类声明和类体。n格式 class 类名 类体 nclass是关键字类的声明部分类体4.2.1 类声明nclass People nclass 植物 n习惯:n 英文类名第一个字母大写n 类名的定义应做到见名知意4.2.2 类体n类体由两部分构成n变量的声明(类的属性)n方法的定义(类的功能)例 class 梯形 float 上底,下底,高,面积;/变量声明 梯形(float x,float y,float h)/方法定义 上底=x;下底=y;高=h;void 修改高(float height)/方法定义 高=height;4.2.3 成员变量和局部变量n成员变量类体中声明的变量n局部变量方法中定义的变量1.变量的类型n成员变量和局部变量的类型可以是Java中的任意类型n例:class People int boy;float a;void f()boolean cool;workman zhangboy;class Student double x;2.变量的有效范围n 成员变量在整个类内都有效n 局部变量只在声明它的方法内有效n 方法参数在整个方法内有效n 方法内的局部变量从声明它的位置之后开始有效。例:n class Sun int distance;int find()int a=12;distance=a;return distance;void g()int y;y=a;例(P57)publicclassAvoidf()intm=10,sum=0;if(m9)intz=10;z=2*m+z;for(inti=0;im;i+)sum=sum+i;m=sum;z=i+sum;n4.2.3成员变量和局部变量成员变量和局部变量 类类体体中中变量声明部分所声明的变量被称作类的成员变量。在方法体中声明的变量和方法的参数被称作局部变量。1变变量量的的类类型型:成员变量和局部变量的类型可以是Java中的任何一种数据类型,包括基本类型:整型、浮点型、字符型;引用类型:数组、对象和接口(对象和接口见后续内容)。2变量的有效范围:变量的有效范围:3实实例例变变量量与与类类变变量量:在声明成员变量时,用关键字static给予修饰的称作类变量,否则称作实例变量(类变量也称为static变量,静态变量)。4成成员员变变量量的的隐隐藏藏:如果局部变量的名字与成员变量的名字相同,则成员变量被隐藏,即这个成员变量在这个方法内暂时失效。5编程风格编程风格(1)一行只声明一个变量。(2)变量的名字符合标识符规定。(3)变量名字见名知意,避免容易混淆的变量名字。4.2.4方法方法 方方法法的的定定义义包包括括两两部部分分:方方法法声声明明和和方方法法体体。一一般般格格式为:式为:方法声明部分方法声明部分 方法体的内容方法体的内容 1方法声明方法声明包括方法名和方法的返回类型,如:float area()注:注:方法的返回类型方法的返回类型、方法的参数、方法的名字方法的参数、方法的名字 2方法体 方法声明之后的一对大括号“”,“”以及之间的内容称作方法的方法体。方法体的内容包括局部变量的声明和Java语句。4.2.5方法重载方法重载 方方法法重重载载的的意意思思是是:一一个个类类中中可可以以有有多多个个方方法法具具有有相相同同的的名名字字,但但这这些些方方法法的的参参数数必必须须不不同同,即即或或者者是是参参数数的的个个数数不不同同,或或者者是是参参数数的的类类型不同。型不同。4.2.6构造方法构造方法 构构造造方方法法是是一一种种特特殊殊方方法法,它它的的名名字字必必须须与与它它所所在在的的类类的的名名字字完完全全相相同同,而而且且没没有有类类型型,构造方法也可以重构造方法也可以重载载。4.2.7类方法和实例方法类方法和实例方法 方方法法声声明明时时,方方法法类类型型前前面面不不加加关关键键字字staticstatic修修饰饰的的是是实实例例方方法法、加加staticstatic修修饰饰的的是是类方法(静态方法)。类方法(静态方法)。4.2.8几几个值得注意的问题个值得注意的问题 1 1对对成成员员变变量量的的操操作作只只能能放放在在方方法法中中,方方法法可可以以对对成成员员变变量量和和该该方方法法体体中中声声明明的的局局部部变变量进行操作。量进行操作。2 2需需要要注注意意的的是是:实实例例方方法法既既能能对对类类变变量量操操作作也也能能对对实实例例变变量量操操作作,而而类类方方法法只只能能对对类类变变量进行操作。量进行操作。3 3一一个个类类中中的的方方法法可可以以互互相相调调用用,实实例例方方法法可可以以调调用用该该类类中中的的其其它它方方法法;类类中中的的类类方方法法只只能调用该类的类方法,不能调用实例方法。能调用该类的类方法,不能调用实例方法。4.3对象对象4.3.1创建对象创建对象1 1对象的声明对象的声明 People zhangPing;2.2.为声明的对象分配内存为声明的对象分配内存 zhangPingzhangPing=new People();=new People();例例4-1,4-1,例例4-24-23 3对象的内存模型对象的内存模型 (1 1)声明对象时的内存模型声明对象时的内存模型(2 2)对象分配内存后的内存模型对象分配内存后的内存模型4 4创建多个不同的对象创建多个不同的对象 4.3.2使用对象使用对象 1 1通通过过使使用用运运算算符符“.”“.”对对象象操操作作自自己己的的变变量量(对象的属性)(对象的属性)2 2使使用用运运算算符符“.”,“.”,对对象象调调用用类类中中的的方方法法(对对象的功能)象的功能)例例4-34-3 4.3.3对象的引用和实体对象的引用和实体 当当用用类类创创建建一一个个对对象象时时,类类中中的的成成员员变变量量在在分分配配内内存存空空间间,这这些些内内存存空空间间称称作作该该对对象象的的实实体体或或对对象象的的变变量量,而而对对象象中中存存放放着着引引用。用。一一个个类类创创建建的的两两个个对对象象,如如果果具具有有相相同同的的引引用用,那那么么就就具具有有完完全相同的实体。全相同的实体。4.4参数传值参数传值4.4.1基本数据类型参数的传值基本数据类型参数的传值 对对于于基基本本数数据据类类型型的的参参数数,向向该该参参数数传传递递的值的级别不可以高于该参数的级别的值的级别不可以高于该参数的级别。例例4-44-44.4.2引用类型参数的传值引用类型参数的传值 当当参参数数是是引引用用类类型型时时,“传传值值”传传递递的的是是变变量中存放的量中存放的“引用引用”,而不是变量所引用的实体。,而不是变量所引用的实体。例例4-54-5 4.4.3可变参数可变参数 可可变变参参数数是是指指在在声声明明方方法法时时不不给给出出参参数数列列表表中中从从某某项项直直至至最最后后一一项项参参数数的的名名字字和和个个数数,但但这这些些参参数数的的类类型型必必须须相相同同。可可变变参参数数使使用用“”“”表表示示若若干干个个参参数数,这这些些参参数数的的类类型型必必须须相相同同,最最后后一个参数必须是参数列表中的最后一个参数。一个参数必须是参数列表中的最后一个参数。例如:例如:public void public void f(intf(int.x).x)例例4-64-64.4.4有理数的类封装有理数的类封装 面面向向对对象象编编程程核核心心思思想想之之一一就就是是将将数数据据和和对对数据的操作封装在一起。数据的操作封装在一起。1 1RationalRational(有理数)类有理数)类 2 2用用RationalRational对象做运算对象做运算 Rational.javaRational.java MainClass.javaMainClass.java 4.5对象的组合对象的组合 一一个个类类可可以以把把对对象象作作为为自自己己的的成成员员变变量量,如如果果用用这这样样的的类类创创建建对对象象,那那么么该该对对象象中中就就会会有有其其它它对对象象,也也就就是是说说该该对对象象将将其其他他对对象象作作为为自自己己的的组组成成部部分分,或或者者说说该该对对象象是是由由几几个个对对象象组合而成。组合而成。例例4-74-7 4.6staticstatic关键字关键字 用static修饰的变量类变量类变量没有用static修饰的变量实例变量实例变量方法声明中用static修饰的方法类方法类方法方法声明中不用static修饰的方法实例方法实例方法4.6.1实例变量和类变量的区别实例变量和类变量的区别 如如果果类类中中有有类类变变量量,那那么么所所有有对对象象的的这这个个类类变变量量都都分分配配给给相相同同的的一一处处内内存存,改改变变其其中中一一个个对对象象的的这这个个类类变变量量会会影影响响其其它它对对象象的的这这个个类类变变量。也就是说对象共享类变量。量。也就是说对象共享类变量。例例4-84-8 4.6.2实例方法和类方法的区别实例方法和类方法的区别 当当用用类类创创建建对对象象后后,类类中中的的实实例例方方法法才才分分配配入入口口地地址址,从从而而实实例例方方法法可可以以被被类类创创建建的的任任何何对对象调用执行。象调用执行。对对于于类类中中的的类类方方法法,在在该该类类被被加加载载到到内内存存时时,就分配了相应的入口地址。就分配了相应的入口地址。例例4-94-9 4.7this this 关键字关键字 this是Java的一个关键字,表示某个对象。this可以出现在实例方法和构造方法中,但不可以出现在类方法中。4.7.1在构造方法中使用在构造方法中使用this thisthis关关键键字字出出现现在在类类的的构构造造方方法法中中时时,代代表表使用该构造方法所创建的对象。使用该构造方法所创建的对象。例例4-104-10 4.7.2在实例方法中使用在实例方法中使用this 当当thisthis关关键键字字出出现现实实例例方方法法中中时时,代代表表正正在在调用该方法的当前对象。调用该方法的当前对象。当当实实例例成成员员变变量量在在实实例例方方法法中中出出现现时时,默默认认的的格式是:格式是:this.this.成员变量。成员变量。当当staticstatic成成员员变变量量在在实实例例方方法法中中出出现现时时,默默认的格式是:认的格式是:类名类名.成员变量。成员变量。4.8包包 包是包是Java语言中有效地管理类的一个机制。语言中有效地管理类的一个机制。包名的目的是有效的区分名字相同的类。包名的目的是有效的区分名字相同的类。4.8.1包语句包语句 通过关键字通过关键字packagepackage声明包语句。声明包语句。packagepackage语语句句作作为为JavaJava源源文文件件的的第第一一条条语语句句,为该源文件中声明的类指定包名。为该源文件中声明的类指定包名。package package语句的一般格式为:语句的一般格式为:package package 包名包名;4.8.2有包名的类的存储目录有包名的类的存储目录 程序如果使用了包语句,例如:程序如果使用了包语句,例如:package package tom.jiafeitom.jiafei;那那么么存存储储文文件件的的目目录录结结构构中中必必须须包包含含有有如如下下的的结结构构 tomtomjiafeijiafei 如:如:c:1000tomjiafei c:1000tomjiafei 并并且且要要将将源源文文件件编编译译得得到到的的类类的的字字节节码码文文件件保保存存在在目目录录c:1000tomjiafei中中(源源文文件件可可以以任任意意存存放)。放)。4.8.3运行有包名的主类运行有包名的主类 如如果果主主类类的的包包名名是是tom.jiafei,那那么么主主类类的的字字节节码码一一定定存存放放在在tomjiefei目目录录中中,运运行行时时必必须须到到tomjiefei的的上上一一层层(即即tom的的父父目目录录)目目录录中中去运行主类。去运行主类。假假设设tomjiefei的的上上一一层层目目录录是是1000,那那么么,必必须如下格式来运行:须如下格式来运行:C:1000java C:1000java tom.jiafeitom.jiafei.主类名主类名 注:主类名是:注:主类名是:“包名包名.主类名主类名”例例4-114-114.9import import 语句语句 一一个个类类可可能能需需要要另另一一个个类类声声明明的的对对象象作作为为自自己己的的成成员员或或方方法法中中的的局局部部变变量量,如如果果这这两两个个类类在同一个包中,当然没有问题。在同一个包中,当然没有问题。如如果果一一个个类类想想要要使使用用的的那那个个类类和和它它不不在在一一个个包中,要使用包中,要使用importimport语句完成使命。语句完成使命。4.9.1引入类库中的类引入类库中的类 如如果果用用户户需需要要类类库库中中的的类类就就必必须须使使用用import语语句,如:句,如:import import java.until.Datejava.until.Date;例例4-124-124.9.2引入自定义包中的类引入自定义包中的类 用用户户程程序序可可以以使使用用tom.jiafei包包中中的的类类,即即使使用用非非类类库库中中有有包包名名的的类类,也也要要使使用用import语语句句,如:如:import import tom.jiafeitom.jiafei.*;.*;例例4-134-13,例例4-144-144.9.3使用无包名的类使用无包名的类 如如果果一一个个类类想想使使用用无无名名包包中中的的类类,只只要要将将这这个个无无包包名名的的类类的的字字节节码码和和当当前前类类保保存存在在同同一一目目录中即可。录中即可。例例4-154-154.9.4避免类名混淆避免类名混淆 1 1区分无包名和有包名的类区分无包名和有包名的类 如如果果想想同同时时使使用用tom.jiafeitom.jiafei包包中中的的A A类类和和无无名名包中的包中的A A类,就不能省略包名,例如:类,就不能省略包名,例如:A a1=new A();A a1=new A();tom.jiafei.Atom.jiafei.A a2=new a2=new tom.jiafei.Atom.jiafei.A();();2区分有包名的类区分有包名的类 如如果果一一个个源源文文件件引引入入了了两两个个包包中中同同名名的的类类,那么在使用该类时,不允许省略包名,比如:那么在使用该类时,不允许省略包名,比如:tom.jiafei.Atom.jiafei.A bird=new bird=new tom.jiafei.Atom.jiafei.A();();.A.A goat=new goat=new .A.A();();4.10访问权限访问权限 访访问问限限制制修修饰饰符符有有privateprivate、protectedprotected和和publicpublic,都都是是JavaJava的的关关键键字字,用用来来修修饰饰成成员员变变量或方法。量或方法。4.10.1私有变量和私有方法私有变量和私有方法 用用关关键键字字private修修饰饰的的成成员员变变量量和和方方法法称称为为私私有变量和私有方法。有变量和私有方法。对对于于私私有有成成员员变变量量或或方方法法,只只有有在在本本类类中中创创建建该该类类的的对对象象时时,这这个个对对象象才才能能访访问问自自己己的的私私有有成成员变量和类中的私有方法。员变量和类中的私有方法。例例4-16,4-16,例例4-174-174.10.2共有变量和共有方法共有变量和共有方法 用用public修修饰饰的的成成员员变变量量和和方方法法被被称称为为共共有有变变量和共有方法量和共有方法。我我们们在在任任何何一一个个类类中中用用类类Tom Tom 创创建建了了一一个个对对象象后后,该该对对象象能能访访问问自自己己的的publicpublic变变量量和和类类中中的的publicpublic方方法法(也也可可以以通通过过类类名名来来操操作作成成员员变变量量、方法)方法)。4.10.3友好变量和友好方法友好变量和友好方法 当当在在另另外外一一个个类类中中用用类类Tom 创创建建了了一一个个对对象象后后,如如果果这这个个类类与与Tom类类在在同同一一个个包包中中,那那么么该该对象能访问自己的友好变量和友好方法。对象能访问自己的友好变量和友好方法。在在任任何何一一个个与与Tom同同一一包包中中的的类类中中,也也可可以以通通过过Tom类类的的类类名名访访问问Tom类类的的类类友友好好成成员员变变量量和和类友好方法。类友好方法。4.10.4受保护的成员变量和方法受保护的成员变量和方法 用用protectedprotected修修饰饰的的成成员员变变量量和和方方法法被被称称为为受受保护的成员变量和受保护的方法保护的成员变量和受保护的方法 。4.10.5publicpublic类与友好类类与友好类 类类声声明明时时,如如果果在在关关键键字字classclass前前面面加加上上publicpublic关关键键字字,就就称称这这样样的的类类是是一一个个public public 类类 。可可以以在在任任何何另另外外一一个个类类中中,使使用用publicpublic类类创创建建对象。对象。如如果果一一个个类类不不加加publicpublic修修饰饰,这这样样的的类类被被称称作友好类。作友好类。在在另另外外一一个个类类中中使使用用友友好好类类创创建建对对象象时时,要要保保证它们是在证它们是在同一包中同一包中。4.11基本类型的类包装基本类型的类包装 JavaJava的的基基本本数数据据类类型型包包括括:bytebyte、intint、shortshort、longlong、floatfloat、doubledouble、charchar。JavaJava提提供供了了基基本本数数据据类类型型相相关关的的类类,实实现现了了对基本数据类型的封装。对基本数据类型的封装。这这些些类类分分别别是是:ByteByte、IntegerInteger、ShortShort、LongLong、FloatFloat、DoubleDouble和和CharacterCharacter类类。这这些些类类在在java.langjava.lang包中。包中。4.11.1DoubleDouble和和FloatFloat类类 Double类类和和Float类类实实现现了了对对double和和float基本型数据的类包装。基本型数据的类包装。Double类的构造方法:类的构造方法:Double(double num)Float类的构造方法:类的构造方法:Float(float num)Double对对象象调调用用doubleValue()方方法法可可以以返返回回该对象含有的该对象含有的double型数据型数据。Float对对象象调调用用floatValue()方方法法可可以以返返回回该该对对象含有的象含有的float型数据型数据。4.11.2ByteByte、ShortShort 、IntegerInteger、LongLong类类 上述个类的构造方法分别上述个类的构造方法分别:Byte(byte num)Short(short num)Integer(int num)Long(long num)Byte、Short、Integer和和Long对象分别调用对象分别调用byteValue()、shortValue()、intValue()和和longValue()方法方法返回该对象含有的返回该对象含有的基本型数据基本型数据。4.11.3CharacterCharacter类类 CharacterCharacter类实现了对类实现了对charchar基本型数据的类包装。基本型数据的类包装。Character Character类的构造方法:类的构造方法:Character(char c)Character类中的一些常用类方法:类中的一些常用类方法:public static boolean isDigit(char ch)如如果果ch是是数数字字字字符符方方法法返返回回 true,否否则则返返回回false。public static boolean isLetter(char ch)如如果果ch是是字字母母方方法法返返回回 true,否否则则返返回回false。public static boolean isLetterOrDigit(char ch)如如果果ch是是数数字字字字符符或或字字母母方方法法返回返回 true,否则返回否则返回false。public static boolean isLowerCase(char ch)如如果果ch是是小小写写字字母母方方法法返返回回 true,否则返回否则返回false。public static boolean isUpperCase(char ch)如如果果ch是是大大写写字字母母方方法法返返回回 true,否则返回否则返回false。public static char toLowerCase(char ch)返回返回ch的小写形式。的小写形式。public static char toUpperCase(char ch)返回返回ch的大写形式。的大写形式。public static boolean isSpaceChar(char ch)如果如果ch是空格返回是空格返回true。例例4-184-184.11.4自动装箱与拆箱自动装箱与拆箱 所所谓谓自自动动装装箱箱就就是是允允许许把把一一个个基基本本数数据据类类型型的的值值直直接赋值给基本数据类型相对应的类的实例,例如:接赋值给基本数据类型相对应的类的实例,例如:Integer number=100;Integer number=100;自自动动拆拆箱箱就就是是允允许许把把基基本本数数据据类类型型相相对对应应的的类类的的实实例例直直接接赋赋值值给给相相应应的的基基本本数数据据类类型型变变量量或或把把基基本本数数据据类类型型相相对对应应的的类类的的实实例例当当作作相相应应的的基基本本数数据据类类型型来来使使用用,例例如:如:numbernumber是一个是一个IntegerInteger对象,那么允许:对象,那么允许:intint x=x=number+numbernumber+number;例例4-194-194.12反编译和文档生成器反编译和文档生成器 4.12.1javapjavap反编译反编译 JDK提提供供的的反反编编译译器器javap.exe可可以以将将字字节节码码反反编编译译为为源源码码,查查看看源源码码类类中中的的public方方法法名名字和字和public成员变量的名字,例如:成员变量的名字,例如:javap java.util.Date 4.12.2 javadocjavadoc制作文档制作文档 使使用用JDK提提供供的的javadoc.exe可可以以制制做做源源文文件件的的html格式文档。格式文档。假设假设D:test有源文件有源文件Example.java,用用 javadoc Example.java 生成生成Example.java的的html格式文挡。格式文挡。例例4-204-204.13jarjar文件文件 我我们们可可以以使使用用jar.exe命命令令把把一一些些类类的的字字节节码码文文件件压压缩缩成成一一个个jar文文件件,然然后后将将这这个个jar文文件件存存放放到到Java运运行行环环境境的的扩扩展展中中,即即将将该该jar文文件件存存放放在在JDK安安装装目目录录的的jrelibext文文件件夹夹中中。这这样样,Java应用程序就可以使用这个应用程序就可以使用这个jar文件中的类来创建对象了。文件中的类来创建对象了。(1 1)有包名的类)有包名的类:TestOne和和TestTwo类的包名为类的包名为moon.star 首先编写一个清单文件:首先编写一个清单文件:hello.mf(Manifestfiles)保存到保存到C:1000目录中目录中 Manifest-Version:1.0 Class:moon.start.TestOne moon.star.TestTwo Created-By:1.6 jar命令命令 C:1000jar cfm Jerry.jar hello.mf moonstarTestOne.class moonstarTestTwo.class(2 2)无包名的类无包名的类:TestOne和和TestTwo类没有包名类没有包名只需将只需将TestOne.java和和TestTwo保存到保存到C:1000 中、编译得到字节码文件中、编译得到字节码文件将(将(1)中清单文件中类的包名去掉后保存到)中清单文件中类的包名去掉后保存到c:1000中。中。使用使用jar命令:命令:C:1000jar cfm Jerry.jar hello.mf TestOne.class TestTwo.class 4.14小结小结 1.类是组成类是组成Java源文件的基本元素源文件的基本元素,一个源文件是有若干个类组成的。一个源文件是有若干个类组成的。2类体可以有两种重要的成员:成员变量和方法。类体可以有两种重要的成员:成员变量和方法。3成成员员变变量量分分为为实实例例变变量量和和类类变变量量。类类变变量量被被该该类类的的所所有有对对象象共共享享;不同对象的实例变量互不相同。不同对象的实例变量互不相同。4.除除构构造造方方法法外外,其其它它方方法法分分为为实实例例方方法法和和类类方方法法。类类方方法法不不仅仅可可以以由由该类的对象调用该类的对象调用,也可以用类名调用;而实例方法必须由对象来调用。也可以用类名调用;而实例方法必须由对象来调用。5实实例例方方法法即即可可以以操操作作实实例例变变量量也也可可以以操操作作类类变变量量,当当对对象象调调用用实实例例方方法法时时,方方法法中中的的成成员员变变量量就就是是指指分分配配给给该该对对象象的的成成员员变变量量,其其中中的的实实例例变变量量和和其其它它对对象象的的不不相相同同,即即占占有有不不同同的的内内存存空空间间;而而类类变变量量和和其其它它对对象象的的相相同同,即即占占有有相相的的内内存存空空间间。类类方方法法只只能能操操作作类类变变量量,当当对对象象调调用用类类方方法法时时,方方法法中中的的成成员员变变量量一一定定都都是是类类变变量量,也也就就是是说说该该对象和所有的对象共享类变量。对象和所有的对象共享类变量。6在在编编写写Java源源文文件件时时,可可以以使使用用import语语句句引引入入有有包包名名的的类类;也也可可以使用静态导入引入有包名类的类变量。以使用静态导入引入有包名类的类变量。7对象访问自己的变量以及调用方法受访问权限的限制。对象访问自己的变量以及调用方法受访问权限的限制。