《java面向对象程序设计第4章_类与对象剖析》由会员分享,可在线阅读,更多相关《java面向对象程序设计第4章_类与对象剖析(51页珍藏版)》请在金锄头文库上搜索。
1、1,Java面向对象程序设计 第4章,配合例子源代码一起使用,Power point 制作:耿祥义 张跃平,类与对象,2,主要内容 类 对象 参数传值 对象组合 static关键字 this关键字 包 import语句 jar文件 难点 参数传值与对象组合 包和import语句,导读,3,4.1 编程语言的几个发展阶段, 面向机器语言 面向过程语言 面向对象语言 面向对象编程主要体现下列三个特性 封装性 继承 多态,4,4.2 类,类是组成Java程序的基本要素。类封装了一类对象的状态和方法。类是用来定义对象的模板。 类的实现包括两部分:类声明和类体。,5,Java的类定义的一般格式,修饰符
2、class 类名extends 父类名 类型 成员变量1; 类型 成员变量2; 修饰符 类型 成员方法1(参数表) 类型 局部变量; 方法体 修饰符 类型 成员方法2(参数表) 类型 局部变量; 方法体 ,6,4.2.1 类声明,类声明 :class 类名 如:class People”和“class 动物”称作类声明;“People”和“动物”分别是类名。 给类命名时,遵守下列编程风格(这不是语法要求的,但应当遵守): 1如果类名使用拉丁字母,那么名字的首字母使用大写字母。 2类名最好容易识别、见名知意。当类名由几个“单词”复合而成时,每个单词的首字母使用大写。,7,4.2.2 类体,类体:
3、类声明之后的一对大括号以及其内的内容称作类体,大括号内的内容称作类体的内容。 类体的内容由两部分构: 1.变量的声明,用来刻画属性; 2.方法的定义,用来刻画功能。,8,4.2.3 成员变量和局部变量,类体中变量声明部分所声明的变量被称作类的成员变量。在方法体中声明的变量和方法的参数被称作局部变量。 1变量的类型:成员变量和局部变量的类型可以是Java中的任何一种数据类型,包括基本类型:整型、浮点型、字符型;引用类型:数组、对象和接口(对象和接口见后续内容)。 2变量的有效范围:成员变量在整个类内都有效,局部变量只在声明它的方法内有效。方法参数在整个方法内有效,方法内的局部变量从声明它的位置之
4、后开始有效。 3实例变量与类变量:在声明成员变量时,用关键字static给予修饰的称作类变量,否则称作实例变量(类变量也称为static变量,静态变量)。 4成员变量的隐藏:如果局部变量的名字与成员变量的名字相同,则成员变量被隐藏,即这个成员变量在这个方法内暂时失效。 5编程风格 (1)一行只声明一个变量。 (2)变量的名字符合标识符规定。 (3)变量名字见名知意,避免容易混淆的变量名字。,9,4.2.4 方法,方法的定义包括两部分:方法声明和方法体。一般格式为: 方法声明部分 方法体的内容 1方法声明 方法声明包括方法名和方法的返回类型,如: float area() 注:方法的返回类型、方
5、法的参数、方法的名字 2方法体 方法声明之后的一对大括号“” ,“”以及之间的内容称作方法的方法体。方法体的内容包括局部变量的声明和Java语句。,10,4.2.5 方法重载,方法重载的意思是:一个类中可以有多个方法具有相同的名字,但这些方法的参数必须不同,即或者是参数的个数不同,或者是参数的类型不同。,11,4.2.6 构造方法,构造方法是一种特殊方法,它的名字必须与它所在的类的名字完全相同,而且没有类型,构造方法也可以重载。,12,4.2.7 类方法和实例方法,方法声明时,方法类型前面不加关键字static修饰的是实例方法、加static修饰的是类方法(静态方法)。,13,4.2.8 几个
6、值得注意的问题,1对成员变量的操作只能放在方法中,方法可以对成员变量和该方法体中声明的局部变量进行操作。 2需要注意的是:实例方法既能对类变量操作也能对实例变量操作,而类方法只能对类变量进行操作。 3一个类中的方法可以互相调用,实例方法可以调用该类中的其它方法;类中的类方法只能调用该类的类方法,不能调用实例方法。,14,4.3 对象 4.3.1 创建对象,1对象的声明 People zhangPing; 2.为声明的对象分配内存 zhangPing=new People(); 例4-1,例4-2 3对象的内存模型 (1)声明对象时的内存模型 (2)对象分配内存后的内存模型 4创建多个不同的对象
7、,15,4.3.2 使用对象,1通过使用运算符“.” 对象操作自己的变量(对象的属性) 2使用运算符“.”,对象调用类中的方法(对象的功能),16,4.3.3 对象的引用和实体,当用类创建一个对象时,类中的成员变量在分配内存空间,这些内存空间称作该对象的实体或对象的变量,而对象中存放着引用。 一个类创建的两个对象,如果具有相同的引用,那么就具有完全相同的实体。,17,4.4 参数传值 4.4.1 基本数据类型参数的传值,对于基本数据类型的参数,向该参数传递的值的级别不可以高于该参数的级别 ,否则在编译时就会出错。 例4-4,18,4.4.2 引用类型参数的传值,当参数是引用类型时,“传值”传递
8、的是变量中存放的“引用”,而不是变量所引用的实体。 例4-5,19,4.4.3 可变参数,可变参数是指在声明方法时不给出参数列表中从某项直至最后一项参数的名字和个数,但这些参数的类型必须相同。可变参数使用“”表示若干个参数,这些参数的类型必须相同,最后一个(可变)参数必须是参数列表中的最后一个参数。 例如: public void f(int . x) 例4-6,20,4.4.4 有理数的类封装,面向对象编程核心思想之一就是将数据和对数据的操作封装在一起。 1Rational(有理数)类 2用Rational对象做运算 Rational.java MainClass.java,21,4.5 对
9、象的组合,一个类可以把对象作为自己的成员变量,如果用这样的类创建对象,那么该对象中就会有其它对象,也就是说该对象将其他对象作为自己的组成部分,或者说该对象是由几个对象组合而成。 例4-7,22,4.6 static关键字,23,4.6.1 实例变量和类变量的区别,如果类中有类变量,那么所有对象的这个类变量都分配给相同的一处内存,改变其中一个对象的这个类变量会影响其它对象的这个类变量。也就是说对象共享类变量。 例4-8,24,4.6.2 实例方法和类方法的区别,当用类创建对象后,类中的实例方法才分配入口地址,从而实例方法可以被类创建的任何对象调用执行。 对于类中的类方法,在该类被加载到内存时,就
10、分配了相应的入口地址。 例4-9,25,4.7 this 关键字,this是Java的一个关键字,表示某个对象。this可以出现在实例方法和构造方法中,但不可以出现在类方法中。 4.7.1 在构造方法中使用this this关键字出现在类的构造方法中时,代表使用该构造方法所创建的对象。 例4-10,26,关于用this调用构造方法的问题:,构造方法是在创建对象时被java系统自动调用的,不能在程序中像调用其他方法一样去调用它(必须通过new自动调用它)。但可以在一个构造方法里调用其他重载的构造方法,不是用构造方法名,而是用this(参数列表)的形式,根据其中的参数列表,选择相应的构造方法。 用
11、this调用构造方法,但此语句必须放在构造方法的首行。 Class Point int x,y; Point(int x1,int y1) x=x1;y=y1; Point() this(0,0); ,27,4.7.2 在实例方法中使用this,当this关键字出现实例方法中时,代表正在调用该方法的当前对象。 当实例成员变量在实例方法中出现时,默认的格式是:this.成员变量。 当static成员变量在实例方法中出现时,默认的格式是:类名.成员变量。 注: 通常可以省略实例成员变量前的this和类变量前的类名。但当局部变量和与其同名时,成员变量前的this或类名就不能省略。 this不能出现在
12、类方法中,因为类方法可通过类名调用,这时可能还没有任何对象诞生。,28,4.8 包,包是Java语言中有效地管理类的一个机制。 包名的目的是有效的区分名字相同的类。,29,4.8.1 包语句,通过关键字package声明包语句。 package语句作为Java源文件的第一条语句,为该源文件中声明的类指定包名。 package语句的一般格式为: package 包名;,30,4.8.2 有包名的类的存储目录,程序如果使用了包语句,例如: package tom.jiafei; 那么存储文件的目录结构中必须包含有如下的结构 tomjiafei 如: c:1000tomjiafei 并且要将源文件编
13、译得到的类的字节码文件保存在目录c:1000tomjiafei中(源文件可以任意存放)。,31,4.8.3 运行有包名的主类,如果主类的包名是tom.jiafei,那么主类的字节码一定存放在tomjiefei目录中,运行时必须到tomjiefei的上一层(即tom的父目录)目录中去运行主类。 假设tomjiefei的上一层目录是1000,那么,必须如下格式来运行: C:1000java tom.jiafei.主类名 注:主类名是:“包名.主类名” 例4-11,32,4.9 import 语句,一个类可能需要另一个类声明的对象作为自己的成员或方法中的局部变量,如果这两个类在同一个包中,当然没有问
14、题。 如果一个类想要使用的那个类和它不在一个包中,要使用import语句完成使命。,33,4.9.1 引入类库中的类,如果用户需要类库中的类就必须使用import语句,如: import java.util.Date; 例4-12,34,4.9.2 引入自定义包中的类,用户程序可以使用tom.jiafei包中的类,即使用非类库中有包名的类,也要使用import语句,如: import tom.jiafei.*; 例4-13, 例4-14,35,4.9.3 使用无包名的类,如果一个类想使用无名包中的类,只要将这个无包名的类的字节码和当前类保存在同一目录中即可。 例4-15,36,4.9.4 避免
15、类名混淆,1区分无包名和有包名的类 如果想同时使用tom.jiafei包中的A类和无名包中的A类,就不能省略包名,例如: A a1=new A(); tom.jiafei.A a2=new tom.jiafei.A(); 2区分有包名的类 如果一个源文件引入了两个包中同名的类,那么在使用该类时,不允许省略包名,比如: tom.jiafei.A bird=new tom.jiafei.A(); .A goat=new .A();,37,4.10 访问权限,访问限制修饰符有private、protected和public,都是Java的关键字,用来修饰成员变量或方法。,38,4.10.1 私有变量
16、和私有方法,用关键字private修饰的成员变量和方法称为私有变量和私有方法。 对于私有成员变量或方法,只有在本类中创建该类的对象时,这个对象才能访问自己的私有成员变量和类中的私有方法。 例4-16,例4-17,39,4.10.2 共有变量和共有方法,用public修饰的成员变量和方法被称为共有变量和共有方法 。 我们在任何一个类中用类Tom(p95) 创建了一个对象后,该对象能访问自己的public变量和类中的public方法(也可以通过类名来操作成员变量、方法) 。 *在类A用类B创建对象b,可用b访问B中的共有变量和方法。,40,4.10.3 友好变量和友好方法,不用private、protected和public修饰的称为友好变量和友好方法 。