Java程序设计课件第三章面向对象程序设计.ppt_第1页
Java程序设计课件第三章面向对象程序设计.ppt_第2页
Java程序设计课件第三章面向对象程序设计.ppt_第3页
Java程序设计课件第三章面向对象程序设计.ppt_第4页
Java程序设计课件第三章面向对象程序设计.ppt_第5页
已阅读5页,还剩61页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Java语言程序设计 第三章 Java面向对象编程基础,讲授人:傅晓阳 教授,,DavidFu,上章回顾,JAVA的基本数据类型分为几种?分别是什么? 基本数据转换的原则是什么? 流程控制有几种形式,分别是什么?,,DavidFu,本章课程纲要,抽象与接口,继承与多态,类与对象,,DavidFu,本课程纲要,变量与方法的使用范围,变量与方法,类的定义与对象的创建 ,类与对象,,DavidFu,类与对象,类(class):定义了同类实体所共有的属性和行为,是属性与行为的集合。 成员变量(field):在类中定义的属性变量,称为成员变量,某些书上也称为域变量。类中的成员变量描述了该类对象所共有的属性特点。 成员方法(method):在类中定义的行为方法,称为成员方法。类中的成员方法描述了该类对象所共有的行为特点。 对象(instance):定义了某类的独特个体,该对象中包含了该类共有的所有属性特点和行为方法。对象是类的实例。,,DavidFu,面向对象编程的三个特点,封装性 将代码及其处理的数据绑定在一起的编程机制 继承性 根据现有的类创建新类的特性 多态性 父类中的方法在子类中具有不同的表现形式的特点称为多态性,,DavidFu,类定义,类定义时分为类声明与类主体,具体格式如下: 类访问修饰符列表 class 类名 extends 父类 implements 接口列表 声明成员变量1; 声明成员变量n; 声明成员方法1; 声明成员方法n; ,,DavidFu,对象的创建与使用,对象的创建 对象声明与创建的具体格式如下: 类名 对象名; 对象名=new 构造方法(参数列表); 也可以如下定义: 类名 对象名=new 构造方法(参数列表);,,DavidFu,构造方法,构造方法的定义: 构造方法必须与所在的类同名; 构造方法没有任何返回类型(其中包括关键字void的空返回类型) 任何类都具有构造方法,如果在编程过程中没有显式的定义类的构造方法,系统将自动为该类提供一个默认的不带参数的构造方法 如果在类中已经显式定义了构造方法,系统将不再提供任何默认的构造方法。,,DavidFu,构造方法,构造方法的定义格式如下: 构造方法访问修饰符 类名(方法参数列表) 方法体 public class Rect /类声明部分; private float rectLong, rectWide; public Rect( ) /类的构造方法 rectLong=2.5; rectWide=1.2; ,,DavidFu,重载方法,重载方法:一个类可以具有多个方法名相同,不同参数列表的成员方法。这些成员方法称为互为重载。其中重载构造方法是一个重要的重载方式。 方法重载具有以下特点: 互为重载方法的方法名称必须相同,与方法的返回类型无关。 重载方法的参数列表一定不同,至少参数个数与参数的类型有一个是不相同的。 重载方法在编译时就确定了方法的调用地址,因此该重载过程称为静态多态性。,,DavidFu,主方法与对象的使用,主方法: public static void main(String args) 主方法体 对象的使用: 引用对象的成员变量 对象.成员变量 引用对象的成员方法 对象.成员方法(参数列表),,DavidFu,本课程纲要,变量与方法的使用范围,变量与方法,类的定义与对象的创建,类与对象,,DavidFu,常量与变量,static静态关键字:static修饰符可以与变量、方法和代码块一起使用。 除了内部类以外,一般类不使用static进行修饰, 而类的成员变量和成员方法可以使用static进行修饰 静态变量与静态方法无需创建对象就可以访问。,,DavidFu,常量与变量,实例变量(instance variable):指类中的属性成员变量,类的每个实例对象都有该成员变量的的一个副本,并且通过构造方法,可以对这些成员变量进行赋值。 String stuName; int stuAge; String stuClassNo; 静态变量(static variable):指另外一些成员变量不是与类的实例一一关联,而是与类相关联,因此也称为类变量。 static double PI;,,DavidFu,实例变量与静态变量的区别,静态变量定义时必须在类型名称前使用static关键字 实例变量在每个对象中都有一个独立的副本。而静态变量对于所有对象都只有一个副本。 一个对象中的实例变量发生了改变,不会影响到另外一个对象中对应的这个实例变量的值。 在使用实例变量时,必须通过对象调用该实例变量。,,DavidFu,方法的声明与调用,方法的声明格式: 访问修饰符列表 类型名称 方法名称(参数列表) 局部变量声明部分; 语句声明部分; ,,DavidFu,方法的声明与调用,方法一般有以下两种调用方法: 对于非静态成员方法,在同一个类中的其他非静态成员方法中可以直接调用。当非静态成员方法在静态成员方法中调用时,必须使用该类的对象实例变量进行调用。 对于静态成员方法,可以在同一个类的非静态成员方法以及主方法中直接调用。但在其他类中的非静态方法中,应该使用静态方法所属类名调用该方法。,,DavidFu,方法的参数传递,在java中,方法的参数传递方式是采用值传递方式,即传递的是某变量值的拷贝。 基本数据类型的参数传递 将参数的基本数据变量的副本传递到方法中,因此方法中修改的变量并不是类中的变量。参见实例3-7 parambasic.java 引用数据类型的参数传递 引用数据类型的参数为对象的引用地址,由于方法参数的传递是值传递,将该对象地址的副本传递到方法中,因此在方法中所修改的对象与类中传递的对象是同一个对象。参见实例3-8 ParamRef.java,,DavidFu,本课程纲要,变量与方法的使用范围,变量与方法,类的定义与对象的创建,类与对象,,DavidFu,变量与方法的使用范围,全局作用范围变量:使用public 、static修饰符修饰的公有静态变量属于全局变量。 public static double PI=3.14; ; 类作用范围变量:使用访问修饰符public, protected,缺省,以及private修饰的非静态成员变量,称为类作用变量,该变量在其他类中可根据其封装性通过对象调用使用。 Circle类中的属性变量 private float radius;,,DavidFu,变量与方法的使用范围,块作用范围变量:成员方法中参数变量以及方法体中定义的变量以及语句块中定义的变量,称为块作用变量,也称为局部变量。 (1)成员方法的变量参数 例如:public static void testParam(int x)方法中的x变量 (2)成员方法体中定义的变量 public double getTriangleArea(double high,double baseline) double area; area=1/2*high*baseline; return area; 中的area变量。,,DavidFu,变量与方法的使用范围,(3)静态语句块中的变量 /静态块 static t; static t=30; System.out.println(“静态变量t=”+t); (4)控制、循环语句所组成的语句块中定义的变量 for (int i = 0; i10; i+) System.out.println (“i=“+i); ,,DavidFu,在作用域范围中同名变量的解决方案,程序设计中,一般不允许在重叠的作用域范围中定义相同名称的变量。但在java程序设计中,经常为了避免定义多个相近变量名称,类的属性变量与成员方法中的参数变量经常采用相同名称。 当成员变量名称与成员方法中的名称相同时,对于非静态属性的成员域,可以通过this.成员变量=参数变量;来对当前成员变量进行赋值。 也可以通过super.成员变量=参数变量;来对父类成员变量进行赋值。 参见例题3-9 TestSameName.java,,DavidFu,本章课程纲要,抽象与接口,继承与多态,类与对象,,DavidFu,本课程纲要,多态,继承,包与封装 ,继承与多态,,DavidFu,包(package),包的概念与定义 包有两个作用,一个是将相似功能的类和接口封装到一个目录中; 第二个作用是保证包是一个唯一命名的集合,使得一个包中使用类名不会影响到其他包中类的命名。 包声明的格式为: package 包名称 package .jluzh.javabasic.ch3;,,DavidFu,包的导入与用法,通过命令行编译带有包的java源程序的格式如下: javac d 路径名 java源程序 例如:javac d . Animal.java 导入包语句定义如下: import 包名.*; import 包名.类型名称; import static 包名.类型名称.静态成员方法名称;,,DavidFu,包的导入与用法,包与目录有本质区别: (1)包与包之间没有嵌套关系,即任何包不会包含其他包。而目录具有包含关系。 (2)包反映了存储类的目录结构,理论上讲,可以有任意多的圆点分隔形成包名。但包名不宜过于复杂,这样会导致存储类的目录结构较深。,,DavidFu,包的导入与用法,一般定义java源程序采用如下结构: package 包名; import 包名.*或包名.类名或包名.接口名称; 访问修饰符列表 class 类名 extends 父类 implements 接口列表 类主体 class 类名 类主体 ,,DavidFu,包的导入与用法,标准包:在java语言程序设计中,除了可以根据实际问题的需要编写自己的类以外,事实上,大部分的基础类和方法是不需要用户自行编写的,而是可以直接使用Sun公司提供的标准类包中的标准类。 java.lang java.io java.awt java.util ,,DavidFu,封装四种访问控制模式,公有模式public:采用公有模式访问修饰符所修饰的类、类成员变量以及方法不仅在本类中可以访问,而且可以公开给其他类使用。 受保护模式protected:采用受保护模式访问修饰符修饰的类、类成员变量以及方法,可以在本类中、同一个包中的其他类以及不同包中的子类中被访问到。 默认模式:默认模式就是在类、类的成员变量以及成员方法前不加任何修饰符的修饰方式。采用这种默认模式,该类可以被同一个包中的任何类进行访问。 私有模式private: 采用私有模式修饰的类、成员变量以及成员方法只能在声明它的类中被访问,在其他类中无法访问。,,DavidFu,封装,类的访问控制修饰符对类成员的限制由小到大的顺序为: publicprotected默认模式private 参见例题3-11Shape.java和Rect.java,,DavidFu,封装,同一个包,,DavidFu,封装,包2,包1,类1 int a; public int b; protected c; private d;,类2,包1,子类,包3,,DavidFu,本课程纲要,多态,继承,包与封装,继承与多态,,DavidFu,继承,类的继承性是根据当前类创建新类的特性 extends关键字 定义子类的声明格式如下: 访问修饰符列表 class 类名 extends 父类名 成员变量声明部分 成员方法声明部分 ,,DavidFu,继承,关于实现继承,创建新类的具体特点如下 : 1)必须先定义父类,再继承父类,否则出现无法找到父类的编译错误。 2)在java语言中,一个类只能继承一个父类,称为单继承。 3)子类可以继承父类的实例成员变量和静态成员变量。换句话说,在子类中,不必定义这些变量,就可以直接使用它们。 4)子类可以继承除了构造方法以外的所有成员方法。因为父类的构造方法用来创建父类的对象,子类所创建的对象应该与父类有所区别。,,DavidFu,继承,5)父类不能使用子类中定义的新成员变量和成员方法。这反映了继承的不可逆性。 6)子类可以根据实际情况,重新定义父类的成员方法,从而实现与父类不同的行为特点。这是实现多态性的重要手段。 7)所有的类都默认继承了一个共同父类java.lang.Object。除了java.lang.Object类没有父类,所有的类都有父类,即使没有显式定义继承一个父类。也就是说,java.lang.Object是所有类的父类。 参见实例3-12Person.java和Student.java 类的继承性,,DavidFu,this 和super,在程序中也可以显式使用this变量来调用当前类的成员变量,成员方法以及构造方法。this 的用法如下 : 访问成员变量 this引用成员变量的格式: this.实例成员变量; 访问成员方法 this引用成员方法的格式: this.实例成员方法(参数列表);,,DavidFu,this 和super,与this关键字相对应,如果要在子类中引用父类的成员变量、方法、或构造方法,就可以使用super。 访问父类的成员变量 super引用成员变量的格式: super.实例成员变量; 引用父类的成员方法 super引用父类的成员方法的格式: super.实例成员方法(参数列表); 引用父类的构造方法 super引用父类构造方法的格式为: super(参数列表);,,DavidFu,类型转换intanceof运算符,子类和父类之间可以进行类型转换,其中,转换的方式为三种: 隐式类型转换:将类型为子类型的数据直接转换为类型为父类型的数据。 Teacher teacherLi=new Teacher(); Person Lisi=teacherLi; 显式类型转换:将类型为父类型的数据转换为类型为子类型的数据。这时必须使用强制类型转换运算符“( )”,,DavidFu,instanceof运算符的用法,instanceof的作用:如果两个类型之间没有父子关系,则一般不能进行类型转换。 Teacher teacherLi=new Teacher(); System.out.println(Student)teacherLi); 使用intanceof运算符可以判断一个引用表达式所指向的实例对象是否是某种引用类型的实例对象。 instanceof运算符的表达式格式为: 引用对象 instanceof 引用类型 参见实例3-14 TransType.java,,DavidFu,本课程纲要,多态,继承,包与封装,继承与多态,,DavidFu,静态多态性(overload),静态多态性是指在具有方法名称相同但参数列表不同的特性,也称为重载(overload)。 重载方法可以是成员方法也可以是构造方法 不同参数列表是指方法的参数个数不同或参数的类型不同或参数个数与类型都相同,但参数的排列顺序不同。 重载方法具有相同的方法名称,相近的功能,有利于程序的维护。,,DavidFu,静态多态性(overload),重载方法的注意事项: 重载方法的方法名称必须相同 重载方法与返回值类型没有关系 重载方法的参数列表必须不同。 重载方法的地址在程序编译时确定,因此称为静态多态性。,,DavidFu,动态多态性(override),动态多态性是指在父类与子类中具有基本相同的方法声明首部,但功能不同的非静态成员方法。这时,子类的成员方法称为父类的成员方法的覆盖方法,有时也称为重写方法(override)。 方法声明首部包括如下: 访问修饰符列表 方法名 (参数列表) 方法声明首部相同也就是说访问修饰符列表中的内容、方法名称以及参数列表都必须相同。 对于覆盖方法,不包括final和static修饰符。 参见实例3-15 DynamicPoly.java,,DavidFu,本章课程纲要,抽象与接口,继承与多态,类与对象,,DavidFu,本课程纲要,内部类,接口,抽象类 ,抽象与接口,,DavidFu,抽象类,抽象类:当一个类中至少有一个方法是抽象方法或者定义该类时使用abstract关键字,这个类就称为抽象类。 抽象类不能创建实例对象,但可以派生其他子类。子类必须具体实现所有继承的抽象方法,这个子类才不是抽象类。 抽象类必须使用抽象关键字abstract来修饰。 具体定义格式为: 访问修饰符 abstract 类名 定义成员变量; 定义抽象成员方法; 定义成员方法;,,DavidFu,抽象类,抽象类与普通类的区别如下: (1)抽象类声明时必须使用abstract抽象关键字,抽象类可以没有抽象方法,但如果一个类有一个或一个以上的抽象方法,这个类必须声明为abstract抽象类。 (2)抽象类不能通过构造方法创建自身的实例,但抽象类可以通过其非抽象的子类创建实例,并通过动态多态性调用子类的覆盖成员方法。 (3)抽象类的子类也可以是抽象类,但抽象类必须有自己非抽象的子类,否则无法实现多态性。 参见例题3-16TestAnimalAbs.java,,DavidFu,抽象类,抽象方法:是指只具有方法声明部分而没有定义方法主体的方法。该方法需要在方法前加上abstract抽象关键字。抽象类提供了方法声明与方法主体实现分离机制,提前为所有子类定义好共同的行为模式名称。 抽象方法的具体定义格式如下: 访问修饰符 abstract 返回值类型 方法名(参数列表); 抽象方法与普通成员方法的区别: (1)抽象方法没有方法主体;在方法声明部分后加上分号;在返回值类型前加上abstract关键字。 (2)抽象方法不能使用private私有修饰符进行修饰,因为私有方法不能被继承,因此也就不能在子类中重新定义。,,DavidFu,本课程纲要,内部类,接口,抽象类,抽象与接口,,DavidFu,接口,接口:接口是一种特殊的抽象类,是相关常量和抽象方法的集合。接口中所有的方法都必须是抽象方法。接口实现了方法声明与实现的分离机制,使实现接口的类具有相同的行为模式,但又通过多态性具有不同的实现方式。 与声明类使用class关键字相似,声明接口必须使用interface关键字。接口的声明格式如下: (1)接口中只有常量 访问控制修饰符 interface 接口名称 extends 父接口名称 常量成员变量 ,,DavidFu,接口,接口中只有抽象方法 访问控制修饰符 interface 接口名称 extends 父接口名称 抽象方法 接口中包含常量和成员方法 访问控制修饰符 interface 接口名称 extends 父接口名称 常量成员变量 抽象方法 ,,DavidFu,接口,implements关键字用来实现接口 当类实现接口时,需要使用关键字implements。具体声明格式如下: 访问修饰符列表 class 类名 extends 父类 implements 接口列表 类主体部分 访问修饰符列表一般使用public 或默认访问控制权限。在java语言中,采用单继承的继承方式,如果需要多重继承,则采用实现多个接口的方式来实现。,,DavidFu,接口与抽象类的区别,,DavidFu,接口与抽象类的区别,参见例题3-18 ShapeImpl.java 3-19 TestAnimalImpl.java,,DavidFu,final关键字的用法,final关键字可以修饰不具有抽象属性的类、成员变量以及成员方法。 不可以修饰抽象类、接口、构造方法、抽象成员方法。 abstract和final关键字不能同时使用。final关键字可以修饰类、成员变量和成员方法 最终类:在定义类时,在访问修饰符列表中包含final关键字,该类称为最终类。最终类不能派生出子类,也就是说不能作为超类。,,DavidFu,final关键字的用法,最终成员属性:在定义类的成员属性时,如果访问修饰符列表中包含final关键字,则该成员属性称为最终成员属性。 一种不具有静态属性,该成员属性只能在定义时或在构造方法中赋值一次。 另一种是与静态属性共同修饰变量,这种变量在此之后就不能进行修改了,一般称为常量。 最终成员方法:在定义类的成员方法时,如果访问修饰符列表中包含final关键字,则

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论