《Java程序设计课件第三章面向对象程序设计》由会员分享,可在线阅读,更多相关《Java程序设计课件第三章面向对象程序设计(67页珍藏版)》请在金锄头文库上搜索。
1、JavaJava程序设计课件第三章程序设计课件第三章面向对象程序设计面向对象程序设计上章回顾上章回顾n JAVA的基本数据类型分为几种?分别是什么?n基本数据转换的原则是什么?n流程控制有几种形式,分别是什么?DavidFuDavidFu本章课程纲要本章课程纲要抽象与接口抽象与接口继承与多态继承与多态类与对象类与对象DavidFuDavidFu本课程纲要本课程纲要变量与方法的使用范围变量与方法的使用范围 变量与方法变量与方法 类的定义与对象的创建类的定义与对象的创建 类与对象类与对象DavidFuDavidFu类与对象类与对象n类(类(class):定义了同类实体所共有的属性:定义了同类实体所
2、共有的属性和行为,是属性与行为的集合。和行为,是属性与行为的集合。n成员变量(成员变量(field):在类中定义的属性变量,:在类中定义的属性变量,称为成员变量,某些书上也称为域变量。类中称为成员变量,某些书上也称为域变量。类中的成员变量描述了该类对象所共有的属性特点。的成员变量描述了该类对象所共有的属性特点。n成员方法(成员方法(method):在类中定义的行为方:在类中定义的行为方法,称为成员方法。类中的成员方法描述了该法,称为成员方法。类中的成员方法描述了该类对象所共有的行为特点。类对象所共有的行为特点。n对象(对象(instance):定义了某类的独特个体,:定义了某类的独特个体,该对
3、象中包含了该类共有的所有属性特点和行该对象中包含了该类共有的所有属性特点和行为方法。对象是类的实例。为方法。对象是类的实例。 DavidFuDavidFu面向对象编程的三个特点面向对象编程的三个特点n封装性封装性n将代码及其处理的数据绑定在一起的编程机制n继承性继承性n根据现有的类创建新类的特性n多态性多态性n父类中的方法在子类中具有不同的表现形式的特点称为多态性DavidFuDavidFu类定义类定义n类定义时分为类声明与类主体,具体格式如下:类定义时分为类声明与类主体,具体格式如下:类访问修饰符列表class类名extends父类implements接口列表 声明成员变量1;声明成员变量n
4、;声明成员方法1;声明成员方法n;DavidFuDavidFu对象的创建与使用对象的创建与使用 n对象的创建对象的创建n对象声明与创建的具体格式如下:n类名类名 对象名;对象名;n对象名对象名=new 构造方法(参数列表);构造方法(参数列表);n也可以如下定义:也可以如下定义:n类名类名 对象名对象名=new 构造方法(参数列表);构造方法(参数列表);DavidFuDavidFu构造方法构造方法n构造方法的定义:构造方法的定义:n构造方法必须与所在的类同名;构造方法必须与所在的类同名;n构造方法没有任何返回类型(其中包括关键构造方法没有任何返回类型(其中包括关键字字void的空返回类型)的
5、空返回类型)n任何类都具有构造方法,如果在编程过程中任何类都具有构造方法,如果在编程过程中没有显式的定义类的构造方法,系统将自动没有显式的定义类的构造方法,系统将自动为该类提供一个默认的不带参数的构造方法为该类提供一个默认的不带参数的构造方法n如果在类中已经显式定义了构造方法,系统如果在类中已经显式定义了构造方法,系统将不再提供任何默认的构造方法。将不再提供任何默认的构造方法。DavidFuDavidFu构造方法构造方法n构造方法的定义格式如下:构造方法的定义格式如下:n构造方法访问修饰符类名(方法参数列表)nn方法体npublicclassRect/类声明部分;privatefloatrec
6、tLong,rectWide;publicRect()/类的构造方法rectLong=2.5;rectWide=1.2;DavidFuDavidFu重载方法重载方法n重载方法:重载方法:一个类可以具有多个方法名相同,不同参数列表的成员方法。这些成员方法称为互为重载。其中重载构造方法是一个重要的重载方式。n方法重载具有以下特点:方法重载具有以下特点: 互为重载方法的方法名称必须相同,与方法的返回类型无关。重载方法的参数列表一定不同,至少参数个数与参数的类型有一个是不相同的。重载方法在编译时就确定了方法的调用地址,因此该重载过程称为静态多态性。DavidFuDavidFu主方法与对象的使用主方法与
7、对象的使用 n主方法:主方法:npublicstaticvoidmain(Stringargs)n主方法体nn对象的使用:对象的使用: n引用对象的成员变量n对象对象.成员变量成员变量n引用对象的成员方法n对象对象.成员方法(参数列表)成员方法(参数列表)DavidFuDavidFu本课程纲要本课程纲要变量与方法的使用范围变量与方法的使用范围 变量与方法变量与方法 类的定义与对象的创建类的定义与对象的创建类与对象类与对象DavidFuDavidFu常量与变量常量与变量 nstatic静态关键字静态关键字:static修饰符可以与变量、方法修饰符可以与变量、方法和代码块一起使用。和代码块一起使用
8、。n除了内部类以外,一般类不使用static进行修饰,n而类的成员变量和成员方法可以使用static进行修饰n静态变量与静态方法无需创建对象就可以访问。DavidFuDavidFu常量与变量常量与变量 n实例变量实例变量(instance variable):指类中的属性):指类中的属性成员变量,类的每个实例对象都有该成员变量的的一成员变量,类的每个实例对象都有该成员变量的的一个副本,并且通过构造方法,可以对这些成员变量进个副本,并且通过构造方法,可以对这些成员变量进行赋值。行赋值。nStringstuName;nintstuAge;nStringstuClassNo;n静态变量(static
9、 variable):指另外一些成员变量不是与类的实例一一关联,而是与类相关联,因此也称为类变量。nstaticdoublePI;DavidFuDavidFu实例变量与静态变量的区别实例变量与静态变量的区别n静态变量定义时必须在类型名称前使用静态变量定义时必须在类型名称前使用static关关键字键字 n实例变量在每个对象中都有一个独立的副本。而实例变量在每个对象中都有一个独立的副本。而静态变量对于所有对象都只有一个副本。静态变量对于所有对象都只有一个副本。n一个对象中的实例变量发生了改变,不会影响到一个对象中的实例变量发生了改变,不会影响到另外一个对象中对应的这个实例变量的值。另外一个对象中对
10、应的这个实例变量的值。n在使用实例变量时,必须通过对象调用该实例变在使用实例变量时,必须通过对象调用该实例变量。量。 DavidFuDavidFu方法的声明与调用方法的声明与调用 方法的声明格式:方法的声明格式:访问修饰符列表访问修饰符列表 类型名称类型名称 方法名称方法名称(参数列表参数列表)局部变量声明部分;局部变量声明部分;语句声明部分;语句声明部分;DavidFuDavidFu方法的声明与调用方法的声明与调用 n方法一般有以下两种调用方法:方法一般有以下两种调用方法:n对于非静态成员方法,在同一个类中的其他非静态成员方法中可以直接调用。当非静态成员方法在静态成员方法中调用时,必须使用该
11、类的对象实例变量进行调用。n对于静态成员方法,可以在同一个类的非静态成员方法以及主方法中直接调用。但在其他类中的非静态方法中,应该使用静态方法所属类名调用该方法。DavidFuDavidFu方法的参数传递方法的参数传递 n在在java中,方法的参数传递方式是采用值传递中,方法的参数传递方式是采用值传递方式,即传递的是某变量值的拷贝。方式,即传递的是某变量值的拷贝。 n基本数据类型的参数传递n将参数的基本数据变量的副本传递到方法中,因此方法中修改的变量并不是类中的变量。参见实例实例3-7 parambasic.javan引用数据类型的参数传递n引用数据类型的参数为对象的引用地址,由于方法参数的传
12、递是值传递,将该对象地址的副本传递到方法中,因此在方法中所修改的对象与类中传递的对象是同一个对象。参见实例参见实例3-8 ParamRDavidFuDavidFu本课程纲要本课程纲要变量与方法的使用范围变量与方法的使用范围 变量与方法变量与方法类的定义与对象的创建类的定义与对象的创建类与对象类与对象DavidFuDavidFu变量与方法的使用范围变量与方法的使用范围n全局作用范围变量全局作用范围变量:使用:使用public 、static修饰修饰符修饰的公有静态变量属于全局变量。符修饰的公有静态变量属于全局变量。npublicstaticdoublePI=3.14;;n类作用范围变量类作用范围
13、变量:使用访问修饰符:使用访问修饰符public, protected,缺省,以及缺省,以及private修饰的非静态修饰的非静态成员变量,称为类作用变量,该变量在其他类中成员变量,称为类作用变量,该变量在其他类中可根据其封装性通过对象调用使用。可根据其封装性通过对象调用使用。 Circle类中的属性变量privatefloatradius;DavidFuDavidFu变量与方法的使用范围变量与方法的使用范围n块作用范围变量:块作用范围变量:成员方法中参数变量以及方法体中定义成员方法中参数变量以及方法体中定义的变量以及语句块中定义的变量,称为块作用变量,也称的变量以及语句块中定义的变量,称为块
14、作用变量,也称为局部变量。为局部变量。 n(1)成员方法的变量参数n例如:publicstaticvoidtestParam(intx)方法中的x变量n(2)成员方法体中定义的变量publicdoublegetTriangleArea(doublehigh,doublebaseline)doublearea;area=1/2*high*baseline;returnarea;中的area变量。DavidFuDavidFu变量与方法的使用范围变量与方法的使用范围n(3)静态语句块中的变量n/静态块nstatict;nstatict=30;nSystem.out.println(“静态变量t=”+
15、t);nn(4)控制、循环语句所组成的语句块中定义的变量nfor(inti=0;i10;i+)nnSystem.out.println(i=+i);DavidFuDavidFu在作用域范围中同名变量的解决方案在作用域范围中同名变量的解决方案 n程序设计中,一般不允许在重叠的作用域范围中程序设计中,一般不允许在重叠的作用域范围中定义相同名称的变量。但在定义相同名称的变量。但在java程序设计中,经程序设计中,经常为了避免定义多个相近变量名称,类的属性变常为了避免定义多个相近变量名称,类的属性变量与成员方法中的参数变量经常采用相同名称。量与成员方法中的参数变量经常采用相同名称。 n当成员变量名称与
16、成员方法中的名称相同时,对于非静态属性的成员域,可以通过this.成员变量=参数变量;来对当前成员变量进行赋值。n也可以通过super.成员变量=参数变量;来对父类成员变量进行赋值。n参见例题3-9TestSameNDavidFuDavidFu本章课程纲要本章课程纲要抽象与接口抽象与接口继承与多态继承与多态类与对象类与对象DavidFuDavidFu本课程纲要本课程纲要多态多态继承继承 包与封装包与封装 继承与多态继承与多态DavidFuDavidFu包(包(package) n包的概念与定义包的概念与定义 n包有两个作用,一个是将相似功能的类和接口封装到一个目录中;n第二个作用是保证包是一个
17、唯一命名的集合,使得一个包中使用类名不会影响到其他包中类的命名。n包声明的格式为:包声明的格式为:npackage 包名称包名称 npackage cn.edu.jluzh.javabasic.ch3; DavidFuDavidFu包的导入与用法包的导入与用法 n通过命令行编译带有包的通过命令行编译带有包的java源程序的格式如下:源程序的格式如下:njavac d 路径名路径名 java源程序源程序n例如:例如:javac d . Animal.javan导入包语句定义如下:导入包语句定义如下:nimport包名.*;nimport包名.类型名称;nimportstatic包名.类型名称.静
18、态成员方法名称;DavidFuDavidFu包的导入与用法包的导入与用法 n包与目录有本质区别:包与目录有本质区别:n(1)包与包之间没有嵌套关系,即任何包不会包含其他包。而目录具有包含关系。n(2)包反映了存储类的目录结构,理论上讲,可以有任意多的圆点分隔形成包名。但包名不宜过于复杂,这样会导致存储类的目录结构较深。DavidFuDavidFu包的导入与用法包的导入与用法 n一般定义一般定义java源程序采用如下结构:源程序采用如下结构:package 包名;包名;import 包名包名.*或包名或包名.类名或包名类名或包名.接口名称;接口名称;访问修饰符列表访问修饰符列表 class 类名
19、类名 extends 父类父类 implements 接口列表接口列表类主体类主体class 类名类名类主体类主体DavidFuDavidFu包的导入与用法包的导入与用法 n标准包:在标准包:在java语言程序设计中,除了可以根据实语言程序设计中,除了可以根据实际问题的需要编写自己的类以外,事实上,大部分的际问题的需要编写自己的类以外,事实上,大部分的基础类和方法是不需要用户自行编写的,而是可以直基础类和方法是不需要用户自行编写的,而是可以直接使用接使用Sun公司提供的标准类包中的标准类。公司提供的标准类包中的标准类。DavidFuDavidFu封装四种访问控制模式封装四种访问控制模式 n公有
20、模式公有模式public:采用公有模式访问修饰符所修饰的类、类成采用公有模式访问修饰符所修饰的类、类成员变量以及方法不仅在本类中可以访问,而且可以公开给其员变量以及方法不仅在本类中可以访问,而且可以公开给其他类使用。他类使用。 n受保护模式受保护模式protected:采用受保护模式访问修饰符修饰的类、采用受保护模式访问修饰符修饰的类、类成员变量以及方法,可以在本类中、同一个包中的其他类类成员变量以及方法,可以在本类中、同一个包中的其他类以及不同包中的子类中被访问到。以及不同包中的子类中被访问到。n默认模式默认模式:默认模式就是在类、类的成员变量以及成员方法前默认模式就是在类、类的成员变量以及
21、成员方法前不加任何修饰符的修饰方式。采用这种默认模式,该类可以不加任何修饰符的修饰方式。采用这种默认模式,该类可以被同一个包中的任何类进行访问。被同一个包中的任何类进行访问。n私有模式私有模式private: 采用私有模式修饰的类、成员变量以及成采用私有模式修饰的类、成员变量以及成员方法只能在声明它的类中被访问,在其他类中无法访问。员方法只能在声明它的类中被访问,在其他类中无法访问。DavidFuDavidFu封装封装 n类的访问控制修饰符对类成员的限制由小到大的顺序类的访问控制修饰符对类成员的限制由小到大的顺序为:为:npublicprotected默认模式privaten参见例题3-11S
22、hape.java和Rect.java 修饰词修饰词 同一个类同一个类同一个包同一个包子类子类所有类所有类public允许访问允许访问 允许访问允许访问 允许访问允许访问 允许访问允许访问protected允许访问允许访问 允许访问允许访问 允许访问允许访问default允许访问允许访问 允许访问允许访问private允许访问允许访问DavidFuDavidFu封装封装 类1int a;public int b;protected int c;private int d;类1的子类类2同一个包同一个包DavidFuDavidFu封装封装 包2包1类1int a;public int b;pro
23、tected c;private d;类2包1子类包包3 DavidFuDavidFu本课程纲要本课程纲要多态多态继承继承 包与封装包与封装继承与多态继承与多态DavidFuDavidFu继承继承 n类的继承性是根据当前类创建新类的特性类的继承性是根据当前类创建新类的特性nextends关键字关键字n定义子类的声明格式如下:定义子类的声明格式如下:访问修饰符列表class类名extends父类名成员变量声明部分成员方法声明部分DavidFuDavidFu继承继承 n关于实现继承,创建新类的具体特点如下关于实现继承,创建新类的具体特点如下 :n1)必须先定义父类,再继承父类,否则出现无法找到父类
24、的编译错误。n2)在java语言中,一个类只能继承一个父类,称为单继承。n3)子类可以继承父类的实例成员变量和静态成员变量。换句话说,在子类中,不必定义这些变量,就可以直接使用它们。n4)子类可以继承除了构造方法以外的所有成员方法。因为父类的构造方法用来创建父类的对象,子类所创建的对象应该与父类有所区别。DavidFuDavidFu继承继承 n5)父类不能使用子类中定义的新成员变量和成员方法。这反映了继承的不可逆性。n6)子类可以根据实际情况,重新定义父类的成员方法,从而实现与父类不同的行为特点。这是实现多态性的重要手段。n7)所有的类都默认继承了一个共同父类java.lang.Object。
25、除了java.lang.Object类没有父类,所有的类都有父类,即使没有显式定义继承一个父类。也就是说,java.lang.Object是所有类的父类。n参见实例实例3-12Person.java和和Student.java 类的继承类的继承性性DavidFuDavidFuthis 和和super n在程序中也可以显式使用在程序中也可以显式使用this变量来调用当前类的变量来调用当前类的成员变量,成员方法以及构造方法。成员变量,成员方法以及构造方法。this 的用法如的用法如下下 :n访问成员变量访问成员变量nthis引用成员变量的格式:nthis.实例成员变量;n访问成员方法访问成员方法n
26、this引用成员方法的格式:nthis.实例成员方法(参数列表);DavidFuDavidFuthis 和和super n与与this关键字相对应,如果要在子类中引用父类的关键字相对应,如果要在子类中引用父类的成员变量、方法、或构造方法,就可以使用成员变量、方法、或构造方法,就可以使用super。n访问父类的成员变量访问父类的成员变量nsuper引用成员变量的格式:nsuper.实例成员变量;n引用父类的成员方法引用父类的成员方法nsuper引用父类的成员方法的格式:nsuper.实例成员方法(参数列表);n引用父类的构造方法引用父类的构造方法nsuper引用父类构造方法的格式为:nsuper
27、(参数列表);DavidFuDavidFu类型转换类型转换intanceof运算符运算符 n子类和父类之间可以进行类型转换,其中,转子类和父类之间可以进行类型转换,其中,转换的方式为三种:换的方式为三种:n隐式类型转换:将类型为子类型的数据直接转隐式类型转换:将类型为子类型的数据直接转换为类型为父类型的数据。换为类型为父类型的数据。 nTeacherteacherLi=newTeacher();nPersonLisi=teacherLi;n显式类型转换:将类型为父类型的数据转换为显式类型转换:将类型为父类型的数据转换为类型为子类型的数据。这时必须使用强制类类型为子类型的数据。这时必须使用强制类
28、型转换运算符型转换运算符“( )” DavidFuDavidFuinstanceof运算符的用法运算符的用法ninstanceof的作用:如果两个类型之间没有的作用:如果两个类型之间没有父子关系,则一般不能进行类型转换。父子关系,则一般不能进行类型转换。nTeacherteacherLi=newTeacher();nSystem.out.println(Student)teacherLi);n使用使用intanceof运算符可以判断一个引用表运算符可以判断一个引用表达式所指向的实例对象是否是某种引用类型达式所指向的实例对象是否是某种引用类型的实例对象。的实例对象。ninstanceof运算符的
29、表达式格式为:运算符的表达式格式为:n引用对象引用对象 instanceof 引用类型引用类型n参见实例参见实例3-14 TransTDavidFuDavidFu本课程纲要本课程纲要多态多态 继承继承包与封装包与封装继承与多态继承与多态DavidFuDavidFu静态多态性(静态多态性(overload) n静态多态性是指在具有方法名称相同但参数列表不静态多态性是指在具有方法名称相同但参数列表不同的特性,也称为重载(同的特性,也称为重载(overload)。)。 n重载方法可以是成员方法也可以是构造方法n不同参数列表是指方法的参数个数不同或参数的类型不同或参数个数与类型都相同,但参数的排列顺序
30、不同。n重载方法具有相同的方法名称,相近的功能,有利于程序的维护。DavidFuDavidFu静态多态性(静态多态性(overload) n重载方法的注意事项:重载方法的注意事项:n重载方法的方法名称必须相同n重载方法与返回值类型没有关系n重载方法的参数列表必须不同。n重载方法的地址在程序编译时确定,因此称为静态多态性。DavidFuDavidFu动态多态性(动态多态性(override) n动态多态性是指在父类与子类中具有基本相同的方动态多态性是指在父类与子类中具有基本相同的方法声明首部,但功能不同的非静态成员方法。这时,法声明首部,但功能不同的非静态成员方法。这时,子类的成员方法称为父类的
31、成员方法的覆盖方法,子类的成员方法称为父类的成员方法的覆盖方法,有时也称为重写方法(有时也称为重写方法(override)。)。 n方法声明首部包括如下:方法声明首部包括如下:n访问修饰符列表访问修饰符列表 方法名方法名 (参数列表参数列表)n方法声明首部相同也就是说访问修饰符列表中的内方法声明首部相同也就是说访问修饰符列表中的内容、方法名称以及参数列表都必须相同。容、方法名称以及参数列表都必须相同。n对于覆盖方法,不包括对于覆盖方法,不包括final和和static修饰符。修饰符。n参见实例参见实例3-15 DynamicPoly.java DavidFuDavidFu本章课程纲要本章课程纲
32、要抽象与接口抽象与接口继承与多态继承与多态类与对象类与对象DavidFuDavidFu本课程纲要本课程纲要内部类内部类接口接口 抽象类抽象类 抽象与接口抽象与接口DavidFuDavidFu抽象类抽象类n抽象类:抽象类:当一个类中至少有一个方法是抽象方法或当一个类中至少有一个方法是抽象方法或者定义该类时使用者定义该类时使用abstract关键字,这个类就称为关键字,这个类就称为抽象类。抽象类。n抽象类不能创建实例对象,但可以派生其他子类。子类必须具体实现所有继承的抽象方法,这个子类才不是抽象类。n抽象类必须使用抽象关键字abstract来修饰。n具体定义格式为:具体定义格式为:n访问修饰符访问
33、修饰符 abstract 类名类名n定义成员变量;定义成员变量;n定义抽象成员方法;定义抽象成员方法;n定义成员方法;定义成员方法; DavidFuDavidFu抽象类抽象类n抽象类与普通类的区别如下:抽象类与普通类的区别如下:n(1)抽象类声明时必须使用abstract抽象关键字,抽象类可以没有抽象方法,但如果一个类有一个或一个以上的抽象方法,这个类必须声明为abstract抽象类。n(2)抽象类不能通过构造方法创建自身的实例,但抽象类可以通过其非抽象的子类创建实例,并通过动态多态性调用子类的覆盖成员方法。n(3)抽象类的子类也可以是抽象类,但抽象类必须有自己非抽象的子类,否则无法实现多态性
34、。n参见例题3-16TestAnimalADavidFuDavidFu抽象类抽象类n抽象方法:抽象方法:是指只具有方法声明部分而没有定义方是指只具有方法声明部分而没有定义方法主体的方法。该方法需要在方法前加上法主体的方法。该方法需要在方法前加上abstract抽象关键字。抽象类提供了方法声明与方法主体实抽象关键字。抽象类提供了方法声明与方法主体实现分离机制,提前为所有子类定义好共同的行为模现分离机制,提前为所有子类定义好共同的行为模式名称。式名称。 n抽象方法的具体定义格式如下:抽象方法的具体定义格式如下:n访问修饰符abstract返回值类型方法名(参数列表);n抽象方法与普通成员方法的区别
35、:抽象方法与普通成员方法的区别:n(1)抽象方法没有方法主体;在方法声明部分后加上分号;在返回值类型前加上abstract关键字。n(2)抽象方法不能使用private私有修饰符进行修饰,因为私有方法不能被继承,因此也就不能在子类中重新定义。DavidFuDavidFu本课程纲要本课程纲要内部类内部类接口接口 抽象类抽象类抽象与接口抽象与接口DavidFuDavidFu接口接口n接口:接口:接口是一种特殊的抽象类,是相关常量和抽接口是一种特殊的抽象类,是相关常量和抽象方法的集合。接口中所有的方法都必须是抽象方象方法的集合。接口中所有的方法都必须是抽象方法。接口实现了方法声明与实现的分离机制,使
36、实法。接口实现了方法声明与实现的分离机制,使实现接口的类具有相同的行为模式,但又通过多态性现接口的类具有相同的行为模式,但又通过多态性具有不同的实现方式。具有不同的实现方式。 n与声明类使用与声明类使用class关键字相似,声明接口必须使用关键字相似,声明接口必须使用interface关键字。接口的声明格式如下:关键字。接口的声明格式如下:n(1)接口中只有常量n访问控制修饰符interface接口名称extends父接口名称nn常量成员变量DavidFuDavidFu接口接口n接口中只有抽象方法接口中只有抽象方法n访问控制修饰符interface接口名称extends父接口名称nn抽象方法n
37、n接口中包含常量和成员方法接口中包含常量和成员方法n访问控制修饰符interface接口名称extends父接口名称nn常量成员变量n抽象方法DavidFuDavidFu接口接口nimplements关键字用来实现接口关键字用来实现接口n当类实现接口时,需要使用关键字当类实现接口时,需要使用关键字implements。具体声明格式如下:具体声明格式如下:n访问修饰符列表class类名extends父类implements接口列表nn类主体部分nn访问修饰符列表一般使用访问修饰符列表一般使用public 或默认访问控制权或默认访问控制权限。在限。在java语言中,采用单继承的继承方式,如果语言中
38、,采用单继承的继承方式,如果需要多重继承,则采用实现多个接口的方式来实现。需要多重继承,则采用实现多个接口的方式来实现。 DavidFuDavidFu接口与抽象类的区别接口与抽象类的区别 序号接口抽象类1接口中可以只定义常量或抽象方法,也可以二者都定义。 抽象类中一般不能只定义成员属性,而不定义成员方法。2接口中不能有构造方法以及普通成员方法,只能有抽象方法。抽象类中可以有构造方法以及普通成员方法,但一般至少应该有一个抽象方法。3接口中的成员变量必须是public, static和final修饰的常量,不能有其他普通成员变量。可以是任何成员变量,也可以是常量。DavidFuDavidFu接口与
39、抽象类的区别接口与抽象类的区别 4一个类可以实现多个接口,并且接口可以使用extends进行多重继承其他的接口来扩展当前的接口。单继承,一个类只能继承一个抽象类。5接口中抽象方法在子类中必须完全实现,否则接口无法实例化。抽象类的子类还可以是抽象类,但最终必须有一个非抽象的子类,否则抽象类无法实例化。参见例题3-18 ShapeImpl.java 3-19 TestAnimalIDavidFuDavidFufinal关键字的用法关键字的用法 nfinal关键字可以修饰不具有抽象属性的类、成员变关键字可以修饰不具有抽象属性的类、成员变量以及成员方法。量以及成员方法。n不可以修饰抽象类、接口、构造方
40、法、抽象成员方不可以修饰抽象类、接口、构造方法、抽象成员方法。法。nabstract和和final关键字不能同时使用。关键字不能同时使用。final关键关键字可以修饰类、成员变量和成员方法字可以修饰类、成员变量和成员方法n最终类最终类:在定义类时,在访问修饰符列表中包含:在定义类时,在访问修饰符列表中包含final关键字,该类称为最终类。最终类不能派生出关键字,该类称为最终类。最终类不能派生出子类,也就是说不能作为超类。子类,也就是说不能作为超类。 DavidFuDavidFufinal关键字的用法关键字的用法 n最终成员属性:最终成员属性:在定义类的成员属性时,如果访问修饰符列在定义类的成员
41、属性时,如果访问修饰符列表中包含表中包含final关键字,则该成员属性称为最终成员属性。关键字,则该成员属性称为最终成员属性。 n一种不具有静态属性,该成员属性只能在定义时或在构造方法中赋值一次。n另一种是与静态属性共同修饰变量,这种变量在此之后就不能进行修改了,一般称为常量。n最终成员方法:最终成员方法:在定义类的成员方法时,如果访问修饰符列在定义类的成员方法时,如果访问修饰符列表中包含表中包含final关键字,则该成员方法称为最终成员方法。关键字,则该成员方法称为最终成员方法。n最终成员方法不具有抽象属性,并且该方法不能被其子类的成员方法覆盖。n最终成员方法主要适用于一个不希望改变的行为特
42、征的方法实现。n参见实例实例3-20subFDavidFuDavidFu本课程纲要本课程纲要内部类内部类接口接口 抽象类抽象类抽象与接口抽象与接口DavidFuDavidFu内部类内部类 n内部类是定义在其他类体内部的类。内部类可以具有类名称,内部类是定义在其他类体内部的类。内部类可以具有类名称,也可以不具有类名称。也可以不具有类名称。n内部类根据其是否具有名称,分为实名内部类和匿名内部类内部类根据其是否具有名称,分为实名内部类和匿名内部类 n实名内部类实名内部类 类访问修饰符class外部类名称外部类体;类访问修饰符class实名内部类名称 内部类体;内部类体; 参见例题3-21InnerC
43、lassDDavidFuDavidFu内部类内部类 n非内部类与内部类的区别如下:非内部类与内部类的区别如下:n非内部类的类访问修饰符一般为公有模式非内部类的类访问修饰符一般为公有模式(public) 和缺省模式。和缺省模式。n内部类可以使用保护模式内部类可以使用保护模式(protected)和私有模式和私有模式(private)。n内部类作为类中一个特殊的组成部分,具有类成员内部类作为类中一个特殊的组成部分,具有类成员的一些属性,即内部类可以具有静态修饰符,因此的一些属性,即内部类可以具有静态修饰符,因此内部类可以分为静态内部类和非静态内部类。内部类可以分为静态内部类和非静态内部类。n对于非
44、静态内部类中,如果定义了静态成员域,该对于非静态内部类中,如果定义了静态成员域,该成员域也必须具有最终成员域也必须具有最终(final)属性,并且在非静态属性,并且在非静态内部类中不具有静态方法。内部类中不具有静态方法。 DavidFuDavidFu 匿名内部类匿名内部类n匿名内部类在本文中将简称为匿名类。匿名类的特匿名内部类在本文中将简称为匿名类。匿名类的特点如下:点如下:n(1)不具有类名;n(2)不具有抽象和静态属性;n(3)不能派生出子类。n匿名类的定义格式如下:匿名类的定义格式如下:nnew父类型名称(父类型构造方法的参数列表)nn匿名类体;n覆盖父类的成员方法或接口的成员方法Dav
45、idFuDavidFu 匿名内部类匿名内部类n在以下情况使用匿名类比较合适:在以下情况使用匿名类比较合适:n1)只用到类的一个实例。n2)类在定义后马上用到。n3)只有几行代码就可以完成的类n4)没有必要使用类名,或者说这样做会画蛇添足n使用匿名类的原则是:使用匿名类的原则是:n1)匿名内部类不能有构造方法。n2)匿名内部类不能定义任何静态成员、方法和类。n3)匿名内部类不能是public,protected,private,static。n4)只能创建匿名内部类的一个实例。n5)一个匿名内部类一定是在new的后面,隐含实现一个类。n6)匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。DavidFuDavidF结束结束