《【教学课件】第6章面向对象程序设计.ppt》由会员分享,可在线阅读,更多相关《【教学课件】第6章面向对象程序设计.ppt(48页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第6章 面向对象程序设计Java语言是面向对象的程序设计语言,不再遵循面向过程的程序设计思想。要全面掌握利用Java语言进行程序设计,必须理解面向对象的程序设计(Object-Oriented Programming,OOP)思想。6.1 面向对象的基本概念面向对象是Java语言的基本特征,这是与C+的明显区别。在C+中,由于面向过程和面向对象的混合应用,使得开发出来的应用程序既存在面向对象的特征,又有面向过程的处理方式,因而开发出来的应用程序再分析的难度加大。随着计算机硬件设备功能的进一步提高,使得基于对象的编程成为可能。基于对象的编程更加符合人们的思维模式,编写的程序更加健壮和强大。Jav
2、a语言是纯面向对象的语言,支持对象和类的概念,支持类的单重继承。同时Java引入接口的概念,使接口与单继承结合可完成Java语言的多重继承。6.1.1 面向过程与和面向对象的程序设计面向过程的程序设计语言最重要的特点是按照解决问题的步骤来设计程序。比较典型的语言有:C语言、Pascal语言、Basic语言等,它们都是面向过程的程序设计语言。在传统的面向过程的程序设计思想中,通常将存放基本数据类型的变量作为程序处理对象、以变量的赋值作为程序的基本操作、以变量值的改变作为程序运行的状态。当需要代码重用时,调用已经组织好的过程或函数。在这种应用方式中,如果软件项目较庞大,程序的调试和维护将变得异常困
3、难。随着计算机技术的发展,人们越来越需要一种新的程序设计思想;面向对象的程序设计思想,是将世界看成由许多彼此之间能联络的对象组成。面向对象的程序设计是以信息的隐藏和数据抽象等思想和概念为基础的,这使得采用面向对象设计的应用程序具有简单、直观、接近人类的自然思维方式等特点。对客观事物的描述以分析事物的属性、行为和相互之间的关系为研究的基本对象。并将数据和操作放入同一个数据结构中,即同一个统一体中。面向对象程序设计中,所有对象都与属性和活动联系在一起,因此面向对象程序设计以一种更贴近真实世界的模型组织程序的。要以面向对象的观点设计Java程序,Java程序可以看作是相互合作的对象所构成的集合。6.
4、1.2 对象和封装在程序设计中,对象(Object)是指具有属性和动作的实体。在现实世界中,可以明确标识的任何一个物体都可以看作是一个对象。对象有自己的行为和状态。对象的状态就是属性,对象的行为就是方法的集合。如图所示描述了一个对象与其状态和行为,即对象的属性和方法。6.1.3 类和实例类的英文单词是class,类是基于对象的基本概念。类是一组对象的抽象化模型,是对象的总和,对象是类的实例。如果将一个类作具体化和实例化,就生成了这个类的一个对象。可以从一个类中创建许多实例。对象和实例两个词通常可以互换。类和对象(实例)之间的关系可以比作汽车的设计方案和具体汽车的关系。用一种设计方案可以生产出任
5、意多的汽车来。图所示是一个Circle类,其中包括Circle对象的属性Radius和Circle对象的行为方法findArea(),通过此类可以实例化多个不同的对象。6.2 类类是Java语言的核心,是组成Java程序的基本要素。类封装了一类对象的状态和行为。类是用来定义对象的模板。在创建对象之前必须首先定义类。6.2.1 类的定义当对一个类定义的时候,必须明确声明类的属性和方法。类的定义是以类的可见性起始、关键字class作为定义、合法的Java标识符作为名称。类定义的基本格式为:类修饰符 class ClassName /类体的内容6.2.2 成员变量和局部变量从类的定义中可以知道,类体
6、分为两部分:变量和方法的定义。变量定义部分所定义的变量被称为类的成员变量。在方法体中定义的变量和方法的参数被称为局部变量。下面从几个方面讲述成员变量和局部变量。1类中变量的定义2成员变量和局部变量的类型3成员变量和局部变量的作用范围4成员变量分类5成员变量的隐藏6.2.3 成员方法在类的定义中包括了成员方法,类的成员方法实现了类所具有的行为。类对象可以使用类中的方法对类进行访问。1方法的定义方法的定义包括两部分:方法的声明和方法的实现。其一般格式为:accessType returnType name(parameter)/方法体,方法的具体实现代码,包括局部变量的定义和合法的Java语句2方
7、法的重载方法的重载是指一个类中可以有多个方法具有相同的名字,但这些方法的参数必须不同,不同之处可以是参数的类型和参数的数量。当调用一个重载方法时,JVM自动根据当前对方法的调用形式,在类的定义中匹配形式符合的成员方法,匹配成功后,就调用此成员方法。6.2.4 构造方法Java中提供了一个特殊的成员方法构造方法。构造方法通常用来完成对象的初始化工作。构造方法是一种特殊的方法,名字必须与其类的名称完全相同,并且不返回任何数据类型,即void类型,但void必须省略不写。在一个类中,可以有多个构造方法,也可以没有构造方法。下面是关于类的构造方法的例子。public class Constructor
8、Demoint a,b;ConstructorDemo()a=12;ConstructorDemo(int d,int e)a=d;b=e;6.2.5 main方法前面讲到Java程序分为两种:Java应用程序和Java小 应 用 程 序。Java应 用 程 序 即 Java Application是 可 以 独 立 运 行 的,所 有 的Application都有一个主方法,即main()方法,这是应用执行的入口点。main()方法的一般格式为:public static void main(String args)这里的各项中除了方法参数名args可以改变外,其他都要和格式中的完全一样,包
9、括大小写。6.2.6 类对象的创建、使用和清除要使用Java类中的属性和方法,必须创建类对象,然后通过类对象来引用类的成员变量和方法。1对象的创建对象的创建包括两个步骤,对象的声明和为对象分配内存。2对象的使用当对象创建后,类中的成员变量和方法就会被分配相应的存储空间。3对象的清除由于对象是通过使用new运算符动态分配内存的,所以还要销毁这些对象、释放其存储空间以备重新分配。6.2.7 方法中参数的传递和其他语言一样,Java中的方法也可以带有参数。当使用这些带有参数的方法时,必须向方法传递参数。按传递参数方式的不同,可分为两种:按值传递(按值调用)和按引用传递(按引用调用)。1按值传递在这种
10、方法中,把实参的值复制后被传递给形参,故方法中对形参的改变不会影响实参的值。2按引用传递在这种方法中,是将一个实参的引用(不是参数的值)传递给方法中的形参,这意味着对参数的改变将会影响传递给方法的实参的值。6.3 包包是类的容器或集合,它将一组类集中到一起。Java通过包就可以方便地管理程序中的类了。6.3.1 包的作用使用包可以有以下3个方面的作用。1组织类包能够将类组织成单元。正如在硬盘上有文件夹或目录来组织文件和应用程序一样,包能够将类组织成组,以便对每个程序可以只使用其所需的那些类集。2防止类命名混乱包减少了命名冲突带来的问题。随着Java中类数量的增长,与别的类重名的可能性也不断增加
11、,这样如果试图将多组类集中到单个程序中时,就容易出现命名冲突的可能。包能够隐藏类,以使这些冲突被避免。3控制包中类、接口、成员变量和方法的可见性在包中,除声明为private的成员变量和方法外,类中所有的成员变量和方法可以被同一包中的其他类和方法访问。6.3.2 包的定义要创建一个包非常容易,通过关键字package声明即可。package语句必须作为Java源文件的第一条语句,用来指明该源文件定义的类所在的包。package语句的一般格式为:package PackageName;其中,package为关键字,说明后面的标识符定义了包的名字;PackageName为定义的包的名称,为Java
12、中合法的标识符。包名可以是一个合法的标识符,也可以是若干个标识符加“.”分割而成。6.3.3 运行包中的类Java中的包是以目录的形式来组织的。要运行包中的类,必须表明类所属的包。请读者看下面的例子。package china.tianjin;class packageDemopublic static void main(String args)System.out.println(包测试);6.3.4 引入包中的类在编写源文件时,除了使用自己定义的类外,还要使用别人或Java中提供的类,在使用这些类之前,必须向程序中引入这些包中的类。Java中使用import语句引入包中的类。在一个程序中
13、可以有多个import语句,但必须写在package语句(如果有)和源文件类定义之间。import有下面两种形式:import packageName.ClassName;/引入包packageName中的类ClassNameimport packageName.*;/引入包packageName中的所有类6.4 类中变量和方法的访问权限当用一个类创建了一个对象后,该对象可以通过“.”运算符操作自己的变量和使用类中的方法。但对象和方法的使用是有一定限制的,即对象是否可以通过“.”运算符使用类中的变量和方法。在类的变量和方法被定义时,可以使用修饰符来指定变量和方法的访问权限。用来确定访问权限的修
14、饰符如表所示。6.4.1 公有类型变量和方法用public修饰的成员变量和方法被称为公有变量和公有方法。公有变量和公有方法可以被同一个类、子类、同一个包中的类和不同包中的类所访问。关于public修饰符的应用请看下面的例子。/*在包packDemo中定义类PubDemo,其中定义了公有整型变量intAge和方法setCount()*/package packDemo;class PubDemo public int intAge;/定义public修饰的int类型变量intAge public void setCount(int a,int b)/定义public修饰的setCount方法 S
15、ystem.out.println(“变量intAge的值为:”+intAge)System.out.println(“此方法被访问”);6.4.2 受保护类型变量和方法用protected修饰的成员变量和方法被称为受保护型变量和保护型方法。受保护型变量和受保护型方法可以被同一个类、子类、同一个包中的类所访问,不允许不同包中的类访问。关于protected修饰符的应用请看下面的例子。/*在包packDemo中定义类ProDemo,其中定义了受保护整型变量intAge和方法setCount()*/package packDemo;class ProDemo protected int intAg
16、e;/定义protected修饰的int类型变量intAge protected void setCount()/定义protected修饰的setCount方法 System.out.println(“变量intAge的值为:”+intAge)System.out.println(“此方法被访问”);6.4.3 私有类型变量和方法用private修饰的成员变量和方法叫私有变量和方法。私有型变量和方法只能在本类中使用,在子类、同一个包中的类和不同包中的类中不允许访问。关于private修饰符的应用请看下面的例子。/*在包packDemo中定义类PriDemo,其中定义了私有整型变量intAge
17、和方法setCount()*/package packDemo;class PriDemo private int intAge;/定义private修饰的int类型变量intAge private void setCount(int a)/定义private修饰的setCount方法 System.out.println(“变量intAge的值为:”+intAge);System.out.println(“此方法被访问”);public static void main(String args)PriDemo obj=new PriDemo();/生成类PriDemo的对象 Obj.setC
18、ount(30);/访问类PriDemo中的private方法setCount6.5 类的继承在面向对象的程序设计中,继承是不可或缺的部分,没有使用继承的程序设计,就不能称为面向对象的程序设计。通过继承机制,能够使用以前构造的类的方法和属性,通过简单的程序代码来构造功能强大的类,这样会节省很多编程时间,更为重要的是这样做可以减少代码出错的机会。6.5.1 继承的概念继承的一般含义是指接收来自父母的财产。换句话来说,继承是子女拥有父母所拥有的财产。面向对象的程序设计中的继承和上述含义类似,只不过这里继承的实体不是财产,而是类。即子类拥有父类的成员变量和方法。读者请看下面的一段代码,分别定义了类名
19、为Person和Student的两个类。6.5.2 继承的实现创建子类在类的声明中,通过使用关键字extends来创建一个类的子类。其格式如下:class ChildClass extends FatherClass其中,ChildClass、FatherClass分别为子类和父类的名称;extends为继承的关键字,说明类ChildClass继承类FatherClass。例如,类Student继承了上面定义的类Person,则可用如下代码声明。class Student extends Person int score;void study()6.5.3 继承数据成员和方法如果一个类是另一个
20、类的子类,则子类就会拥有父类中的部分成员变量和方法。子类拥有父类的成员变量和方法有以下几种情况。子类和父类在同一个包中:子类可继承父类中的public、protected和友好类型的成员变量和方法;不能继承private型的成员变量和方法。子类和父类不在同一个包:子类可继承父类的public、protected的成员变量和方法;不能继承private和友好型的成员变量和方法。子类继承父类的成员变量和方法的具体情况见图所示。6.5.4 覆盖覆盖是指子类拥有父类相同的成员。覆盖包括下面两种情况。成员变量的覆盖:子类中定义的成员变量和父类中的成员变量同名。成员方法的覆盖:子类中定义的成员方法和父类中
21、的成员方法在方法名、返回类型、参数个数及类型都相同。覆盖可以隐藏父类中的成员变量和方法,覆盖的目的通过在子类中重新定义变量和方法来扩展父类的功能。这里是个简单的覆盖应用的例子,程序OverrideDemo.java清单包含下面3个类:Bird类中定义了fly()和getValue(int s)两个方法。类Pigeon是Bird类的子类,在Pigeon中定义了fly()方法和getValue()方法。类Test用来调用Pigeon中的方法。6.5.5 继承中要注意的问题Java不采用C+语言中的多重继承机制,这可以为编程带来方便。多重继承是指一个类可以是多个父类的子类,使得类的层次关系变得很复杂
22、;而且,如果几个父类含有相同的成员变量或相同的方法,那就会给类的变量和方法的继承及调用带来混乱。Java中的继承采用单重继承,即每一个类只能有一个父类,从而避免了混乱。6.6 类的多态性除继承外,多态也是面向对象的程序设计的一种基本特征。当类从某个父类派生出来时,可能需要修改父类中某个方法的实现方式,多态机制能够分别实现用于不同子类的方法,但方法的定义在共同的父类中进行,当子类中的方法被调用时,启动的是该子类的方法。尽管该方法的实现在各个子类之间是不同的,但是对于外部调用来说,不必关心具体的实现,只需关心其共同的接口。多态机制是面向对象的精华之一,它是建立在继承基础之上的。当方法被不同的对象调
23、用时,能产生不同的行为,这种现象就称为多态。每个子类都可以用具体的行为来覆盖父类的方法,例如,定义一个描述动物的类Animal,Animal类中用方法move()来描述动物的移动。表示大象的类Elephant和表示兔子的类Rabbit都继承动物类Animal,同时,也拥有了方法move();但大象的移动缓慢,而兔子移动很快,所以,大象类Elephant和兔子类Rabbit的移动方法move()应该拥有不同的定义。6.7 抽象类抽象类是Java中的一种特殊的类。抽象类不能创建对象,而只能由其派生子类创建。抽象类是专门作其他类的父类来使用的。6.7.1 理解抽象类例如,要描述几何图形的情况。假如设
24、计一些类来描述几何对象,如圆、长方形等。几何对象有许多共同的属性和行为。线型的颜色和宽度是几何图形的共同属性,而计算几何图形的面积和周长是几何图形共同的方法。这样可以定义类Geometric来描述所有的几何图形对象。这个类中包括属性color(颜色)和weight(宽度),以及计算面积的方法getArea()和计算周长的方法getPerimeter()。但方法getArea()和getPerimeter()不能在类Geometric中实现,因为这些方法的实现依赖于几何对象的具体类型。上述的方法叫抽象方法,抽象方法只能有方法的声明,不能有方法的具体实现。包含抽象方法的类叫抽象类。6.7.2 抽象
25、类的定义抽象类的定义包括类的定义和抽象方法的定义。1抽象类的定义1抽象类的定义用关键字abstract修饰符来定义抽象类,abstract放在关键字class之前。定义格式如下:abstract class ClassName2抽象方法定义用关键字abstract修饰符来定义抽象方法,abstract放在方法返回类型之前。定义格式如下:abstract returnType methodName()其中,returnType为方法返回的类型;methodName为方法名。6.7.3 抽象类的应用抽象类必须作为其他类的父类,并且,子类要全部实现父类中的抽象方法。在下面的例子文件AbstractD
26、emo.java中,定义了一个抽象类Geometric,其中定义了求面积的抽象方法getArea()和求周长的抽象方法getPerimenter()。Geometric抽象类要求在其子类中要有具体实现计算面积和周长的方法getArea()和getPerimeter()。6.8 接口Java中的类不支持多重继承,即一个类只能有一个父类。单继承性使得Java简单,易于程序的管理。为了实现多重继承的功能,Java通过实现多个接口来完成多重继承的特点。6.8.1 接口的定义定义一个接口通过使用关键字interface来实现。接口的定义和类的定义类似,分为接口的声明和接口体。接口的定义格式为:inter
27、face 接口名 /接口体中的变量和方法在Java接口中,所有的方法都是抽象的方法,所有的变量都是static常量。下面定义一个名为MyFirstable的接口:interface MyFirstable /声明接口MyFirstable static final int MAX=100;/定义一个int类型的变量MAX int MIN=20;/定义一个int类型的变量MIN abstract void method();/声明一个抽象的方法method()float sum(float x,float y);/声明一个抽象方法sum(float x,float y)6.8.2 接口的使用一个
28、类通过使用关键字implements声明自己使用一个或多个接口。若使用多个接口,接口名之间用逗号隔开。格式如下:class ClassName implements Interface1,Interface2说 明:类 ClassName中 实 现 了 两 个 接 口:Interface1和Interface2。接口中的方法全部是抽象方法,故实现此接口的类必须实现接口中的所有方法。要在类中实现接口的方法,方法的名字、返回类型、参数个数及类型必须和接口中的完全一致。6.8.3 接口的继承利用关键字extends,一个接口可以继承另一个接口,其语法与继承类时的语法相同。当一个类实现了一个接口,而该
29、接口继承了另一个接口时,此类必须实现所有接口中的方法。下面是一个关于接口继承的示例。6.9 内部类可以在一个类的内部定义另一个类,这种存在于一个类内部的类被称为内部类。在Java中,内部类分为:静态类、成员类、局部类和匿名类。下面将分别介绍。6.9.1 匿名类(anonymous class)匿名类没有明确的类定义格式,是指将类的定义和类对象的创建合并在一起的情况。看代码如下。6.9.2 静态类(static class)静态类作为类的静态成员存在于某个类中。要定义一个静态类只需在类的定义中加入关键字static即可。在下面的例子中,在类OuterClass中定义一个静态类InnerClass
30、,请看下面的代码:class OuterClass static class InnerClass6.9.3 成员类(member class)成员类作为一般的成员变量存在于某个类中。定义一个成员类和定义一个一般的类没有任何区别。读者请看下面的例子,例子中在类OuterClass中定义了一个成员类MemberClass,代码如下:class OuterClass class MemberClass6.9.4 局部类(local class)局部类和局部变量一样,是指在方法内部定义的类。局部类的定义和一般类的定义类似。在下面的例子中,在类OuterClass的方法method()中定义了一个局部
31、类LocalClass,请看下面的代码:class OuterClass void method()/类OuterClass的成员方法 class LocalClass /成员方法中定义局部类LocalClass6.10 和类相关的其他关键字和类相关的其他修饰符包括:final、static、this、super。下面分别讲述。6.10.1 final修饰符final字面的含义为:最终、最后。修饰符final可用来修饰类、成员变量、成员方法。1final修饰类如果类在定义时,加上了final修饰符,说明该类是最终类,不能被作为父类进行继承。请看下面的例子:final class FinalCl
32、assDemo /类体部分,同一般类的类体2final修饰变量final修饰符可用来修饰变量,用final修饰的变量是最终变量,即常量。Java中的常量可以被访问,但不能修改其值。如下是对一个常量的定义格式:final type VariableName=InitValue;3final修饰方法final修饰符除了修饰类和变量外,还可以用来修饰方法。用final修饰的方法称为最终方法。继承包含最终方法的类的子类不能覆盖该最终方法。即子类不能对父类中的最终方法进行修改。最终方法的定义格式为:final returnType methodName()4final修饰符综合实例6.10.2 stat
33、ic修饰符static修饰符可用来修饰类中的变量和方法。用static修饰的成员变量称为静态变量或类变量,用static修饰的成员方法称为静态方法或类方法。1类变量和实例变量类成员变量可分为类变量和实例变量。实例变量属于类的对象,而类变量属于类。也就是说,不同对象的实例变量被分配不同的内存空间,而类变量对于所有的类对象共享同一个内存空间。2类方法和实例方法在类中用static修饰的方法称为类方法,而不被static修饰的方法称为实例方法。类方法在类被加载到内存中时,就被分配了内存空间;而实例方法只有在生成类对象时,才分配内存空间。6.10.3 this关键字this关键字指对象自身的引用,即类
34、本身。请看下面关于this关键字的使用。class ThisDemo int a;/定义成员变量a void setValue(int a)/定义成员函数setValue(),参数为a this.a=a;/为成员变量a赋值6.10.4 super关键字super关键字指明了是对父类的引用。当一个子类中的成员变量和方法同其父类的成员变量和方法完全相同时,则父类中的成员变量和方法将被隐藏,不能被子类继承。如果想在子类中使用被其覆盖的父类的成员变量和方法时,就可以使用关键字super。6.11 小结本章是Java中最重要的一章,在这一章中,介绍了如何定义类、创建对象和使用对象。类是对象的模版,而对象是类的实例。Java中修饰类的修饰符只能是public或缺省,而成员变量和方法的修饰符可以是public、private、protected和缺省,这些都指出了类及其成员的访问方式。方法中的参数有两种传递方式,当参数为对象时按引用传递,当为简单数据类型时按值传递。本章还介绍了类的继承、覆盖和多态等方面的知识,以及包、接口、抽象类、内部类等方面的知识,并详细介绍了Java中的一些常用的关键字final、static、this、super的使用。