C#、C++、Java面向对象比较研究

上传人:沈*** 文档编号:206729183 上传时间:2023-05-04 格式:PDF 页数:69 大小:9.49MB
收藏 版权申诉 举报 下载
C#、C++、Java面向对象比较研究_第1页
第1页 / 共69页
C#、C++、Java面向对象比较研究_第2页
第2页 / 共69页
C#、C++、Java面向对象比较研究_第3页
第3页 / 共69页
资源描述:

《C#、C++、Java面向对象比较研究》由会员分享,可在线阅读,更多相关《C#、C++、Java面向对象比较研究(69页珍藏版)》请在装配图网上搜索。

1、目 录目 录摘 要.3ABSTRACT.4第一章面向对象概述.51.1面向对象的基本概念.51.1.1 对象.51.1.2 类.61.1.3消息和方法.6L 2面向对象的基本特征.71.2.1 封装.71.2.2 继承.81.2.3多态性.8第二章类与对象.92.1类的定义格式.9小结.92.2类中成员的访问修饰符.10小结.112.3类中的数据成员.112 3 1常数据成员.11小结.132.3.2静态数据成员.13小结.152.4类中的成员函数.152.4.1 普通成员函数.15小结.182.4.2 静态成员函数.18小结.202.4.3 构造函数.20小结.232.5对象的撤销.23小结

2、.24第三章继承.253.1继承的定义格式.25第 1页小结.273.2类中成员的属性:.28小结.293.3派生类的构造函数.30小结.313.4类中的同名覆盖.32小结.373.5对象转换.37小结.403.5多重继承.403.5.1接口的定义格式.41小结.423.5.2接口多重继承的实现.42小结.453.5.3复杂的多重继承.46小结.50第四章多态性.514.1静态联编.514.1.1函数重载与模板.51小结.554.1.2运算符重载.55小结.564.1.3指针与强制多态.56小结.594.2动态联编.604.2.1虚函数.60小结.624.2.2抽象类.63小结.66总 结.错

3、误!未定义书签。致 谢.68参考文献69摘要摘 要面向对象的程序设计技术是目前最流行、最实用的软件开发手段。与传统的面向过程程序设计结构化技术完全不同。它的出现是程序设计语言的一场革命。它主要包括类、对象、消息、方法、属性等基本概念,具有封装性、继承、多态性、重载等特点。在面向对象的程序设计中,现实世界的对象被抽象为“类 工 程序员将精力主要集中于要处理的对象的设计和研究上,通过继承、多态、重载可以很方便的实现代码的重用,从而大大提高了软件的开发效率。C+、Jav a和 C#都是目前最流行的面向对象程序设计语言,它们都可以为面向对象的技术提供全面的支持。本文共分为四章,第 一 章主要介绍了面向

4、对象的基本概念和特征。第二章主要比较了 C+、Jav a 和 C#语言类中成员的定义、访问权限、对象的撤消等。第三章主要比较了 C+、Java和 C#语言在继承方面的异同点,并且给出了相关的程序。第四章主要比较了 C+、Jav a 和 C#语言在多态性方面的异同点,并且给出了相关的程序。最后总结了 C+、Java和 C#语言的优劣并给出了进行毕业设计的心得体会。关键词:面 向 对 象 类 继 承 多 态 性 重 载第3页第一章面向对象概述ABSTRACTThe Object Oriented Programming(OOP)is the most popular and usefulmetho

5、d of software developing now.It is different from the traditionalProcess Oriented structured Programming.Its emergence is a revolutionof programming language.It mainly includes these basic concepts such asclasses、objects、messages、methods、attributes etc 9 and thesecharacteristics such as encapsulatio

6、n inheritancepolymorphismoverloading and so on.In the Object Oriented Programming,theobjects in the world are abstracted as classes.Programmers chieflyconcentrate the design and research of objects.By means of theencapsulation、inheritance、polymorphism and overloading,programmers can very convenientl

7、y complete codes of reusing,thusgreatly increasing the development efficiency of software.C+、Java andC#are the most popular Object Oriented Programming language atpresent.They can provid overall support for Object OrientedProgramming.There are four chapters in the thesis.In the first chapter,the bas

8、icconcept and characteristic ofobject-oriented is introduced.In the secondchapter,the definition of member,the access authority,the object removewere chiefly compared in the C+、Java and C#language.In the thirdchapter,similarities and differences at the aspect of the inheritance inthe C+、Java and C#l

9、anguage were compared and given out theprogram of correlation.In the 4th chapter,similiarities and differences atthe aspect of the polymorphism in the C+Java and C#language werecompared and given out the program of correlation.Finally sum up thegood and bad of C+,Java and C#*s language and given out

10、 the tag ofgraduation design.Key Words:Object Oriented Class Inherit Polymorphism Overloading第 7 页第四章继承第一章面向对象概述1.1 面向对象的基本概念1.1.1 对象客观世界的问题都是由客观世界的实体及实体间的相互关系构成的,我们把客观世界的实体称为问题空间的对象。显然,“对象”不是固定的。一本书是一个对象,一家书店也可以是一个对象。世界上的各个事物都是由各种“对象”组成的。任何事物都是对象,复杂的对象可以由相对比较简单的对象以某种方式组成。从这种意义上讲,整个客观世界可认为是一个最复杂的对象。

11、从动态的观点看,对象的操作就是对象的行为。问题空间对象的行为是极其丰富多彩的,而解空间对象的行为是死板的,只有借助于复杂的算法才能操纵解空间的对象而得到解。传统的程序设计语言限制了程序员定义解空间对象,而面向对象语言提供了“对象”概念。这样,程序员就可以自己去定义解空间对象。从存储的角度看,“对象”是一片私有存储,其中有数据也有方法。其他对象的方法不能直接操纵该对象的私有数据,只有对象自己的方法才可操纵它。从对象的实现机制来看,“对象”是一台自动机,其中私有数据表示了对象的状态,该状态只能由自身的方法改变它。每当需要改变对象的状态时。只能由其他对象向该对象发进消息,对象响应消息后按照消息模式找

12、出匹配的方法,并执行该方法。在面向对象的设计中,“对象”是应用领域中的建模实体。所有对象在外观上都表现出相同的特性,即固有的处理能力和通过传邀消息实现的统一的联系方式。在面向对象的程序设计中,“对象”是系统中的基本运行实体。换句话说,“对象”是具有特殊属性(数据)和 行 为 方 式(方法)的实体。对象占有存储空间且具有传统程序设计语言的数据,如变量、数 组、字第30页第四章继承符 串 等。给对象分配存储空间就确定了给定时刻对象的状态,与每一个对象相关的方法定义了该对象上的操作。1.1.2类在面向对象的程序设计中,“对象是程序的基本单位,相似的对象可以和传统语言中的变量与类型关系一样,归并到一类

13、(class)中去。类实质上定义的是一种对象类型,它是对具有相似行为的对象的一种抽象,描述了属于该类型的所有对象的性质。例 如:integer是一个类,它描述了所有整数的性质,“1”、“2”等具体整数都是integer这个类的对象,都具备算术运算和大小比较的处理能力。对象是在执行过程中由其所属的类动态生成的,一个类可以生成多个不同的对象。同一个类的所有对象具有相同的性质,即其外部特性和内部实现都是相同的。一个对象的内部状态(私有属性)只能由其自身来修改,任何别的对象都不能来修改名。因此,同一个类的对象虽然在内部状态的表现形式上相同,但它们可以有不同的内部状态。这些对象并不是一模一样的。1.1.

14、3 消息和方法如何要求对象完成一定的处理工作?对象间如何进行联系?所有这一切都只能通过传递消息来实现。消息用来请求对象执行某一处理或回答某些信息的要求,消息统一了数据流和控制流。某一对象在执行相应的处理时,如果需要,它可以通过传递消息请求其他对象完成某些处理工作或回答某些信息。其他对象在执行所要求的处理活动时,同样可以通过传递消息与别的对象联系。因此,程序的执行是靠在对象间传递消息来完成的。发送消息的对象称为发送者,接收消息的对象称为接收者。消息中只包含发送者的要求,它告诉接收者需要完成哪些处理,但并不指示接收者应该怎样完成这些处理。消息完全由接收者解释,接收者独立决定采用什么方式完成所需的处

15、理。一个对象能够接收不同形式、不同内容的多个消息:相同形式的消息可以送往不同的对象;不同的对象对于形式相同的消息可以有不同的解释,能够作出不同的反应。对于传来的消息,对象可以返回相应的应答信息,但这种返回并不是必需的。消息的形式用消息模式(message pattern)刻 画,一个消息模式定义第 54页第四章继承了一类消息,它可以对应不同内容的消息。对于同一消息模式的不同消息,同一个对象所作的解释和处理都是相同的,只是处理的结果可能不同。因此有处理能力接消息分类,一个消息模式定义对象的一种处理能力。这种处理能力是通过该模式及消息引用表现出来的。所以,只要给出对象的所有消息模式及相应于每个消息

16、模式的处理能力,也就定义了一个对象的固有处理能力。它是定义对象接口的唯一信息。使用对象只需了解它的消息 模 式,所以对象具有极强的“黑盒”性。把所有对象分成各种对象类,每个对象类都定义一组“方法”,代表允许作用于该类对象上的各种操作。1.2面向对象的基本特征1.2.1 封装封装是一利信息隐蔽技 术,用户只能看到对象封装界面上的信息,对象内部对用户是隐蔽的。封装的目的在于将对象的使用者和设计者分开,使用者不必知道行为实现的细节,只需用设计者提供的消息来访问这对象。封装的定义为。(1)一个清楚的边界,所有对象的内部软件的范围被限定在这个边界内;(2)一个 接 口,这个接口描述该对象和其他对象之间的

17、相互作用:(3)受保护的内部实现。这个实现给出了由软件对象提供的功能的细节,实现细节不能在定义这个对象的类的外面访问。封装的概念和类说明有关,而且同样提供如何将一个问题解的各个组件组装在一起的求精过程。封装的基本单位是对象。这个对象的性质由它的粪说明来描述,这个性质被具有同样类的其他对象共享。对象用作封装比讲一个类表示的封装更具体化。有了封装这个定义一个类的每个实例在一个问题求解中是一个单独的封装,或称作组件。对象用于封装的概念可以和集成电路芯片作一类比 块集成电路芯片被封装起来,其内部电路是不可见的,也是使用者不关心的。芯片的使用者只关心芯片引脚的个数、引脚的电气参数以及引卿提供的功能,通过

18、对各个引脚功能的了解,可以将不同的芯片引脚连在一起,组装成具有一定功能的产品。同样,软件设计者可以通过对类和对象的使用达到这个目的。显式地将对象的定义和对象的实现分开是面向对象系统的一大特色。封装本身即模块化,把定义模块和实现模块分开,就使得用面向对象技术第 54页第四章继承所开发设计的软件的维护性、修改性大为改善,这也是软件技术追求的目标之一。1.2.2 继承广义地说,继承是指能够直接获得已有的性质和特性,而不必重复定义它们。在面向对象的软件技术中,继承是子类自动地共享基类(或父类)中定义的数据和方法的机制。一个类直接继承其父类的全部描述(数据和操作)。继承具有传递性,继承性使得相似的对象可

19、以共享程序代码和数据结构,从而大大减少了程序中的冗余信息。使得对软件的修改变得比过去容易得多了。继承性使得用户在开发新的应用系统时不必完全从零开始,可以继承原有的相似系统的功能或者从类库中选取需要的类,再派生出新的类以实现所需要的功能,所以,继承的机制主要是支持程序的重用和保持接口的一致性。1.2.3 多态性所 谓 多 态(plymorphic)即一个名字可具有多种语义。在大多数面向对象的语言中,如果类P 是子类S 的父类,则子类S 的对象s 可以用在父 类 P 的对象p 使用的地方,这就意味着一个公共的消息集(操作)可以送到类P 和 类 S 的对象上。当同样的消息可以被送到一个父类的对象和其

20、子类的对象上时这被称作多态性(polymophism)。在不同的对象上对一个相似的操作使用相同消息的方法和人们在解决问题中的思考方式是相遇的,我们不必为打印整数、浮点数、字符而使用不同的束语。面向对象的语言中,多态引用表示可引用多个类的实例。由于多态具有可表示对象的多个类的能力,因此,它既与动态类型有关,又与静态类型有关。动态类型是在程序执行期间随时可以改变的类型。在强类型面向对象环 境 中,运行系统根据动态类型自动地保留标记的全部多态引用。静态类型是在程序正文中声明实体时确定下来的类型。在编译时已经知邀并确定了对象在运行时的有效类型集合。第 54页第四章继承第二章类与对象2.1类的定义格式C

21、+中类的定义格式:Class 类名称)(修饰符:成员函数或数据成员的说明;);其中是定义类的关键字。类名称是一中标识符,一对花括号内是类的说明部分。说明该类成员。类的成员包含数据成员和成员函数两部分。Java中类的定义格式:修饰符Class类名称(类的属性与方法;)类名称的第一个字母为大写,例如:SystemoC#中类的定义格式:修饰符Class类名称(类的成员;小结在C+中类定义不存在类修饰符,而C#和Java中类修饰符决定了这个类的属性。在Java中类名称的第一个字母必须大写,而C#和C+中类名称无需这个必要。第30页第四章继承2.2类中成员的访问修饰符C+提供了 3个不同的访问权符,它们

22、规定的成员访问属性互不同:(1)public(公有的)具有这种访问属性的成员,可被与该类对象处在同一作用域内的任何函数使用。(2)private(私有的)私有的成员只能被它所在类中的成员函数及该类的友元函数使用。(3)protected(保护的)具有这种访问属性的成员只能被它所在类及从该类派生的子类的成员函数及友元函数使用成员访问控制类自身派生类其他类Public可被访问可被访问可被访问Private可被访问不可被访问不可被访问Protected可被访问可被访问不可被访问Java提供了 4个不同的访问权符,它们规定的成员访问属性互不同:(1)public(公有的)定义成这种等级的属性,可以被任

23、何对象存取,适用于完全公开的数据。(2)private(私有的)定义成这种等级的属性,只可以被同一类的方法所存取,适用于类中不欲公开的数据。(3)protected(保护的)则具有半公开性质的数据,定义成这种等级的数据可以被类,子类及从同一包的其他类的方法存取。(4)default(无修饰符)定义成这种等级的属性,将可以被同一 package类的方法存取。注意:使用default等级时,只是在属性前不加上任何修饰符,而不是在属性前使用default关键字。C#提供了 5个不同的访问权符,它们规定的成员访问属性互不同:存取等级同一类同一 package不同 package其他类子类其他类子类Pu

24、blic可被访问可被访问可被访问可被访问可被访问Private可被访问不可被访问不可被访问不可被访问不可被访问Protected可被访问可被访问可被访问不可被访问可被访问无修饰符可被访问可被访问可被访问不可被访问不可被访问第 54页第四章继承(1)public(公有的)具有这种访问属性的成员,可以被任何随意访问。(2)private(私有的)定义成这种等级的属性成员,只可以被类自身访问。(3)protected(保护的)具有这种访问属性的成员只能被它所在类及从该类继承的任何成员访问。(4)internal(内部的)具有这种访问属性的成员,可被与同一程序集内部的任何类的任何成员访问。(5)int

25、ernal protected(内部保护的)具有这种访问属性的成员只能被可被与同一程序集内部的中或继承类中被访问。存取等级同一类同一程序集的内部不同一程序集的内部其 他 类子 类其 他 类子 类Public可被访问可被访问可被访问可被访问可被访问Private可被访问不可访问不可访问不可访问不可访问Protected可被访问不可访问可被访问不可访问不可访问Internal可被访问可被访问可被访问不可访问不可访问Protected internal可被访问可访问可被访问不可访问可访问小结Protected关键字在C+、ja v a 和 C#中的作用是完全不同的。标记为 Protected的 C+

26、类,成员函数和变量可以在所在类及从该类派生的子类的成员函数及友元函数使用。标 记 为Protected的 java类,成员函数和变量可以在同一包中或继承类中被访问。标 记 为 Protected的 C#类,方法和变量可以被类或其继承类的任何成员访问。Java中 的 Protected与C#中的 Protected internal相似。Java 中的无修饰符与 C#中 internal的相似。Public和 Private修饰符在C+、ja v a 和 C#中用法都一样。2.3类中的数据成员2.3.1常数据成员常数据成员是类中定义的常量。在类中使用的某个常数值都可以定义为常量。如圆周率,一个星

27、期的天数,每小时的分钟数等。第 54页第四章继承在C+中定义const常量的格式是:常量修饰符类型标识符常量名注意:在C+中不允许在类中对一个const型数据成员直接进行初始化。例如:class MyClassconst float pi=3.14;错误用法 float x,y;);正确的初始化方法是:常数据成员由构造函数初始化列表方法初始化class MyClassconst float pi;float x,y;public:MyClass();MyClass:MyClass():pi(3.14)在C#中定义const常量的格式是:常量修饰符类型标识符常量名=常量表达式值;例:class

28、MyClass public:const float pi=3.14float x,y;);在C#中定义readonly常量的格式是:访问修饰符 static readonly类型关键字成员标志符=表达式;例:using System;class Studentpublic readonly StudentIDpublic Student(string specifedStudent ID)StudentID=specifedStudent ID;)class Classroom public static void Main()Student Student l=new Student(“2

29、002001);Console.WriteLine(学号为:,+Student.StudentID);)运行结果为:学号为:2002001注意:与 常 量 成 员(由const关键字声明)一样,只读成员也用与表示一个不变化的值。但是,赋值给常量的值必须在源代码中指定。而只读成员的值直到程序运行时才知道。只读成员的值在一个构造函数中初始化,而且此后不能在修改。所以常量成员在编译后程序的整个生存周期内保持不变。而只读成员只在此对象生存周期内保持不变第 54页第四章继承Java:定义常量的格式是:修饰符final数据类型常量名=常量表达式值例:class MyClass public final f

30、loat pi=3.14;float x,y;小结在 C+中不允许在类中对一个const型数据成员直接进行初始化。常数据成员由构造函数初始化列表方法初始化。和 C+不同C#可以在类中对一个const型数据成员直接进行初始化,并且在C#中存在readonly常量。和 C+、C#不同java用的是final标识符对一个常数据成员直接进行初始化。2.3.2静态数据成员静态数据成员是为了解决同一个类的不同对象之间的数据和函数共享问题。例如,我们可以抽象出某公司的全体雇员的共性,设计如下的雇员类:class employee private:int EmpNo;int ID;char*name;.如果需

31、要统计雇员总数,这个数据存放在什么地方呢?若以类外的变量来存储总数,不能实现数据的隐藏。若以类中增加一个数据成员用以存放总数,必然在每一个对象中都存储一副本,仅冗余,而且每一个对象分别维护一个“总数,势必造成数据的不一致性。因此,比较理想的方案是类的所有对象共同拥有一个用于存放总数的数据成员。类中的静态数据成员只存储在一个地方,静态数据成员的值对每一个对象都是一样的。如果在某个对象中对静态数据成员的值进行了更新,则所有对象都存取到更新后的相同的值。即所有对象实例共享静态变量,静态变量有且仅有一个副本。在C+中静态成员必须初始化,初始化方法是在类外进行,格式为:数据类型名类名:静态数据成员名=表

32、达式。第 54页第四章继承在 C+中访问静态成员的方法对public型静态成员有:方法1:类名:静态成员名方法2:对象名.静态成员名方法3:对象指针。静态成员名例:#include iostream.hclass A_C public:static int x;void print()co utxn,n;);int A_C:x=100;/静态成员的初始化void main()A_C a,b;.print();b.print();A_C:x=200;a.print();b.print();)运行结果为:100,100,200,200在 Java中静态成员初始化方法是在类中进行,格式为:存取控制修

33、饰符static数据内型名静态数据成员名=表达式。用静态静态构造器进行初始化,格式为:static 静态数据成员名=表达式;)在 Java中访问静态成员的方法方法1:类名.静态成员名(这种方法在对象定义之前或之后均可使用。)方法2:对象名.静态成员名(这种方法只能在对象定义之后使用。)例:import tio.*;public class A_C public static int x;static x=100 静态构造器进行初始化public void print()System.out.println(x););public class A_C Testpublic static void

34、 main(string args)(A_C a=new A_C();A_C b=new A_C();a.print();b.print();)运行结果为:100,100在 c#中静态成员初始化方法是在类中进行,格式为:static存取控制修饰符数据内型名静态数据成员名=表达式。用静态构造函数进行,格式为:static 类 名()第 54页第四章继承静态数据成员名=表达式;)在 C#中访问静态成员的方法对 public型静态成员有:类名.静态成员名例:using Systempublic class A_C public static int x;static A_C()x=100 静态构造函

35、数进行初始化public void print()Console.WriteLine(x););public class A_C Testpublic static void Main()(A_C a=new A_C();A_C b=new A_C();a.print();b.print();)运行结果为:100,100小结在 C+中可以通过类名,对象名和对象指针进行访问。在java中可一通过类名和对象名进行访问。和 C+,java不同C#只能用类名来访问静态数据成员。在 java中可以过静态构造器进行初始化也可以直接进行初始化。在 C#中可以通过静态构造函数进行初始化也可以直接进行初始化。和

36、 C#,java不同C+只能通过类名引用静态数据成员名进行初始化。2.4类中的成员函数2.4.1普通成员函数C+:成员函数的一般定义格式:c la s s 类名 private:protected:Ipublic:返回值类型函数名(形参说明表);成员函数说明;第 54页第四章继承返回值类型 类名:函数名(形参列表)成员函数定义内联成员函数(1)隐式声明:将函数体直接放在类定义体内。c la s s 类名 private:lprotected:lpublic:返回值类型内联函数名(形参列表)函数体;(2)显示声明:类定义体中只有函数说明,无函数体,函数的定义放在类主体之外,且前面加上inline

37、关键字。c la s s 类名 private:lprotected:lpublic:返回值类型内联函数名(形参表说明););inline返回值类型类名:内联函数名()(函数体);java的成员函数又称为方法,在类中定义的一般格式如下:修饰符返 回 值 类 型 方 法 名 称(参数表)程序语句注意:用方括号括住的项表可选。修饰符用与定义此方法可被其他类的方法调用的控制权等级。C#的成员函数也称为方法,在类中定义的一般格式如下:属性 修饰符返 回 值 类 型 方 法 名 称(参数表)程序语句注意:用方括号括住的项表可选。修饰符用与定义此方法可被其他类的方法调用的控制权等级。下面分别用和C+、Ja

38、va和 C#定义一个复数类程序 Complex.cppclass Complex private:double re,im;public:void SetRe(double x)re=x;void Setlm(double y)im=y;double GetRe()return re;double Getlm()return im;void input();void print();第54页第四章继承inline void Complex:input()cinreim;void Complex:print()if(im0)c o u t re u+,i m T,;else coutvvrev0

39、)System.out.print(re+im+i);else System.out.print(re+im+T9);)下面用C#重新编写这个复数类程序 Complex.esclass Complex private:double re;private double im;public string datal,data2;public void SetRe(double x)re=x;public void Setlm(double y)im=y;public double GetRe()return re;public double Getlm()return im;public void

40、 input();data 1 =Console.ReadLine();re=double.parselnt(datal)data2=Console.ReadLine();第54页第四章继承im=double.parselnt(data2)public void print()if(im0)Console.WriteLine(re+”+im+i);else Console.WriteLine(re+im+i);小结通过前面三个不同版本的复数类。C+不同与Java和 C#,它接受文件 作 用 域 方 法-C+程序没有封装在类中。C+中的方法,或称函数,既可以在类内部又可在类外部通过“类名:”的形

41、式定义。定义。Java和 C#中的方法始终包含在类中。如果某个方法需要被多个类调用可以在其他类中定义同样的方法,然后调用这个新类的方法。和 C+不同在C#和 java中依靠标准库来提供输入和输出。2.4.2静态成员函数为了在不生成类对象的情况下,直接访问静态数据成员,C+定义了静态成员函数。定义静态成员函数的格式如下:static返回值类型成员函数名(形参列表);静态成员函数属于整个类,由同一个类的所有对象共同维护。point#includeclass pointpoint(int xx=0,int yy=O)X=xx;Y=yy;countp+;static void GetC()cout64

42、object id=,countendl;int point:countp=0void main()point A (4,5)A.GetC()Point B(5,6)point:GetC()该程序的结果是注意:第 54页第四章继承(1)静态成员函数可以直接访问的数据有:该类中的静态数据成员与静态函数成员、全局变量和常量;(2)访问类中的非静态数据和函数成员,只能通过参数传递方式得到对象名,然后通过对象名来访问。例如:c l a ssA p ub l i c:st a t i c v o i d f(A a)p r i v a t e:i n t x;);v o i d A:f(A a)(c o

43、 ut x;对的引用是错误的c o ut a.x正确由此可见,通过静态成员函数访问非静态成员是相当麻烦的,我们一般用静态成员函数来访问全局变量或同一个类中的静态数据成员,特别是和后者一起作用,达到对同一个类中对象之间共享的数据进行维护的目的。p ub l i c型静态成员函数有三种调用方法:(1)类名:静态成员函数名(实参表)(2)对象名.静态成员函数名(实参表)(3)对象指针-静态成员函数名(实参表)在j a v a中的定义静态成员函数的格式如下:s t a t i c返 回 值 类 型 方 法 名(形 参 列 表);在j a v a中类外使用静态方法的格式是:类名方法名(参数)用j a v

44、 a来重新编写上面的程序.c l a s s p o i nt s t a t i c c o unt=0;p o i nt(i nt x x,i nt y y)X=x x;Y=y y;c o unt p+;p ub l i c c l a s s p o i nt t e s t p ub l i c s t a t i c v o i d m a i n(S t r i ng a r gs )p o i nt A=ne w p o i nt(4,5)p o i nt.G e t C()p o i nt B=ne w p o i nt(5,6)p o i nt.G e t C()从上述格式可

45、以看出,调用静态方法可以不需要对象,通过类名即可以调用。不可以通过对象进行调用,所以静态方法内部只能出现静态变量和静态方法。在C#中的定义静态成员函数的格式如下:方法修饰符s t a t i c返 回 值 类 型 方 法 名(形 参 列 表);在C#中类外使用静态方法的格式是:第 54页第四章继承类名.方法名(参数)对象名方法名(参数)用 C#来重新编写上面的程序.class pointpoint(int xx=0,int yy=0)X=xx;Y=yy;countp+;static count=0;static void GetC()p ub l i c c l a s s p o i nt

46、t e s t p ub l i c s t a t i c v o i d M a i n(S t r i ng a r gs )p o i nt A=ne w p o i nt(4,5)A.G e t C()p o i nt B=ne w p o i nt (5,6)p o i nt.G e t C()小结在 C+和 c#中可以通过类名和对象名访问静态成员函数。并且静态成员函数可以访问非静态数据成员。而 在 java中只能通过类名访问静态成员。静态方法不能访问非访问静态成员。2.4.3构造函数 构造函数在对象被创建的时候由系统自动调用,它的作用就是在对象被创建时利用特定的值构造对象,将对象

47、初始化为一个特定的状态。构造函数的特点:a.构造函数名必须和类名相同b.构造函数没有返回值(也不允许用void)c.构造函数由系统自动调用,任何函数都无法再调用它。d.通常构造函数被定义在公有部分。e.如果程序员没有定义构造函数,系统会自动生成一个缺省的构造函数。f.构造函数具有普通成员函数的特征,并且可以重载。在 C+中构造函数定义格式如下:public类 名 称(参数表)程序语句第 54页第四章继承例:class MyClass private:int x;int y;A*pa;public:MyClass(int a,int b)x=a;y=b;MyClass(int a);MyClas

48、sO ;MyClass:MyClass(int a)x=a;pa=new A;成员变量赋初值可以采用初始化成员列表方法例如:#include 例stream.hclass Point double x,yconst double pi;public:Point(double xx,double yy);Point():x(0),y(0),pi(3.14);void print(););void Point:print()coutvv(”vvxvv,vvyvv);Point:Point(double xx,double yy):pi(3.14),x(xx),y(yy)void main()Poi

49、nt a(1.5,2.82);Pointb;a.print();b.print();coutendl;)在C+中存在拷贝构造函数。他是一种特殊的构造函数,其形参是本类的对象的引用,其作用是使用一个已经存在的对象(由拷贝构造函数的参数指定的对象)去初始化一 个新的同类的对象。如果程序员没有定义类的拷贝构造函数,系统就会自动生成一个默认的拷贝构造函数。这个默认拷贝构造函数的功能是把初始值对象的每个数据成员的值都复制到新建立的对象中。拷贝构造函数的定义方法Class类名 public:类名(形参表);构造函数类名(类名&对象 名);拷贝构造函数;类名:类名(类名&对 象名)(函数体下面给出一个拷贝构

50、造函数的例子。第 54页第四章继承class Point private:int x,y;public:Point(int xx=0,int yy=0)x=xx;y=yy;Point(Point&p);int GetX()return x;int GetY()return y;);Point:Point(Point&p)拷贝构造函数 x=p.x;y=p.y;在java中构造函数定义格式如下:修饰符 类名称(参数表)(程序语句)在C#中构造函数定义格式如下 属性 修饰符类名称(参数表)(程序语句)在java和C#中存在指代构造函数。在类的内部,-个构造函数可以调用另外一个构造函数,这是一种好的程

51、序设计风格,因为这使类的创建更具有合理性。在构造函数内部使用th is,它用与指代另外一个构造函数java中指代构造函数:class pointint x,y;point()this(0,0)调用带两个整型参数的构造函数point(int a,int b)x=a;y=b;)C#中指代构造函数:class point int x,y;point():this(0,0)调用带两个整型参数的构造函数point(int a,int b)x=a;y=b;)point类中的第一个构造函数通过this调用了第二个构造函数完成了对象的初始化。第 54页第四章继承小结C+、java和C#中都可以通过构造函数给对

52、象赋初值。如果没有为类规定任何构造函数的情况下,C+和java都会为系统提供默认的构造函数。但C#不会提供默认的构造函数。在C+中不具备指代构造函数,在java中不具备拷贝构造函数。C#和C+都具有拷贝构造函数。但在C#中系统不会自动提供默认的拷贝构造函数。C#和C+都具指代构造函数,但它们在语法的定义上还是有差别。C+中的构造函数可以在类的外部 通 过“类名:”的形式定义。Java和C#中的构造函数始终包含在类中。2.5对象的撤销在 C+和 c#语言中析构函数用来完成对象被删除前的一些清理工作,也就是专门的扫尾工作。析构函数是在对象的生存期即将结束的时刻由系统自动调用的。它的调用完成后,对象

53、也就消失了,相应的内存空间也被释放。析构函数的定义方法 类 名()举例说明如下:class StrTp private:char*s;public:StrTp()s=new char81;-StrTp(););StrTp:StrTp()delete s;析构函数的特点a.析构函数名由 即类名组成b.析构函数没有返回值c.析构函数没有任何参数d.通常析构函数由系统自动调用e.析构函数被定义在public部分f.如果程序员没有定义析构函数系统会自动生成一个缺省的析构函数。在 Java语言中有这样一个专门的函数(方法),即 finalize。方法,它提供了用于进行撤消对象是的扫尾工作,在对一个对象进

54、行垃圾收集前,Java语言运行系统会自动调用该对象的finalize。方法来释放系统资源,在 Java第 54页第四章继承语言中由于引入了自动垃圾收集机制,不会出现C+语言中那样的存储器泄漏等问题,所以finalize。方法的作用不像C+语言中的析构函数那样重要.如果不定义finalize。方法,Java语言将调用它提供的默认进行扫尾工作.finalize。方法定义形式如下:声名finalize。方法格式:void finalize().;举例说明如下:class myClassint DataMemberl;int DataMember2;public myClass()DataMember

55、 1 =1 ;DataMember2=2;void finalize()DataMemberl=null;DataMember2=null;小结C+中,程序员有时必须提供析构函数.由于从堆分配的内存不回自动回收.所以正却编写析构函数非常关键.C#可以象C+一样编写析构函数,也可以象java一样通过自动垃圾回收由系统自动完成。在java和 C#这两种语言中,与 C+不同都可以通过自动垃圾回收由系统自动完成。对象不在被引用时一例现有引用已经指向新对象时当前不可访问的对象就称为垃圾。系统定期清理内存,并检索这些已死的对象。程序员则无须关心这种明显的内存泄漏。从而减轻了正确编写析构函数的依赖性,提高了

56、该语言的效率和安全性第 54页第四章继承第三章继承3.1继承的定义格式在C+语言中,一个派生类可以从一个基类派生,也可从多个基类派生。从一个基类派生的基承称为单继承;从多个基类派生的基承称为多继承。如下图所示。图 3-1(单继承)第30页第四章继承图3-2(多继承)C+语言中单继承的定义格式如下:class 派生类名:继承方式 基类名(派生类新定义成员);其中,派生类名 是新定义的类名,它是从 基类名 中派生的,并且按照规定的 继承方式 派生的。继承方式 常使用如下三种关键字给予表示:public表示公有基类。private表示私有基类(默认的继承方式)。protected表示保护基类。C+语

57、言中多继承下派生类的定义格式如下:class i生类名:(继承方式1 基类名,(继承方式2 基类名,派生类新定义成员第33页第四章继承其中,继承方式1,是三种继承方式:public,private和 protected 之例血:class Aclass Bclass C:public A,public B其中,派生类具有两个基类(类和类),因此,类是多继承的。按照继承的归定,派生类地成员包含了基类中和基类中的成员以及该类本身的成员Ja v a去除了 C+中对多重继承的语法支持。因此,一个类最多只能有一个直接父类,整个继承关系可以构成一棵树。Ja v a继承的定义格式如下:修 饰 符class

58、A extend B/B为父类,A为子类(定 义A类特有的方法和属性)定 义A类继承类B后,A类便可存取B类中存取控制等级为非private的成员。语法中的修饰符为定义继承后,子类的存取控制等级。C#继承的定义格式如下:cla ss类名:基类名(定 义A类特有的成员小结C+、C#和Jav a都有继承机制。但一个C#和Jav a类只允许有一个基类。它们都只支持单一继承不支持多重继承。C+有public、private和pr otected三种继承方式。而Jav a和C#都只有public 一种继承方式。和C+不同它们靠修饰符来限制子类的存取控制等级。在语法定义上Ja v a中用extends关键

59、字来指定继承的基类。C#和C+用一个冒号(:)指定继承基类。第 54页第四章继承3.2类中成员的属性C+:父 类 中 的 静态 成 员 类 型派生后的类 型子类的访问 方 法类 外 的 访 问方 法PublicPublic直接引用名字基类名:静态成员名子类名:静态成员名Protected直接引用名字基类名:静态成员名Private直接引用名字基类名:静态成员名ProtectedProtected直接引用名字无法访问Private直接引用名字无法访问PrivatePrivate无法访问无法访问父类中的成员类型该成员是否 有 被 继承继 承 方 式在子类中的访 问 属 性Public是Public

60、PublicPrivate是标识符不可用Protected是ProtectedPublic是PrivatePrivatePrivate是标识符不可用Protected是PrivatePublic是ProtectedProtectedPrivate是标识符不可用Protected是Protected第 54页致谢Java和 C#的对比:C#java功能注意PublicPublic标记为public的 C#类可以被任意访问JAVA中与C#类似InternalN/A标记为internal的 C#类只在同一个配件文件中可以被访问。在 JAVA中的默认的类访问意味着该类只能在其自己所在的包中被访问。这与

61、C#中相同。然而,在 C#中可以直接将一个类标记为internal以达到同样的功能ProtectedN/A标记为protected的 C#嵌套类可以被包含它的类或继承于它的类的类访问只能在内部类中被使用ProtectedinternalProtected标记为protected的 C#嵌套类可以被包含它的类或继承于包含它的类的类访问Java中与C#类似,它只能在内部类中被使用。标记为protected的嵌套java类而以被同一个包中的继承类和类访问PrivatePrivate标记为private的 C#嵌套类只能被包含它的类访问Java中与C#类似,它只能在内部类中被使用sealedfinal

62、标记为此的C#及 java的类不能生成子类Java中与C#类似,该关键字不能与abstract关键字联合使用abstractabstract标记为abstract的 C#类不能被初始化。如果其子类实现了所有的抽象方 法(如果有的话),那么子类可以被初始化Java中与C#类似,该关键字不能与sealed修饰符联合使用小结在 C+中有三种继承,静态成员和非静态成员在继承下有不同的访问属性。而在Java和 C#中只有一种继承,成员的访问属性是根据定义它时的访问权限决定。第73页第四章继承3.3派生类的构造函数C+中定义派生类构造函数的一般语法形式为:派生类名:派生类名(参数总表):基类名1(参数表达

63、1),基类名2(参数表2),.,基类名n(参数表n),内嵌对象名1(内嵌对象参数表1),内嵌对象名2(内嵌对象参数表2),.,内嵌对象名m(内嵌对象参数表m)派生类新增成员的初始化语句;例如:class pointprivate int x,y;point(int x,int y)this-x=x;this-y=y)class circle:public pointprivate int radius;public:circle(int x,int y,int r):point(x,y),radius(r)java中定义派生类构造函数的一般语法形式为基类名(参数总表)super(参数表达);派

64、生类新增成员的初始化语句;例如:class pointint x,y;point(int x,int y)this.x=x;this.y=y)class circle extend point int radius;circle(int x,int y,int r)super(x,y);/super必须写在构造函数第一行radius=r;)C#中定义派生类构造函数的般语法形式为基类名(参数总表):base(参数表达)派生类新增成员的初始化语句;例如:class pointint x,y;point(int x,int y)this.x=x;this.y=yclass circle extend

65、 point第54页第四章继承 int radius;circle(int x,int y,int r):base(x,y)radius=r;小结C+、C#和java派生类构造函数相同点:(1)派生类不会继承基类的构造函数,派生类构造函数体只需对新增的成员进行初始化,基类成员初始化由基类构造函数完成。(2)参数总表中,应包含所有基类和内嵌对象所需的初始化参数以及本派生类新增成员所需的初始化参数。(3)若父类没有定义构造函数,那么父类对象的初始化采用系统默认的构造函数。此时,可以根据自己的需要随意设置子类中的构造函数。若父类定义默认构造函数,子类根据自己的需要设置构造函数。C+、C#和java派

66、生类构造函数不同点:在C+中,(1).当派生类构造函数的初始化成员列表中若未出现某基类名或某内嵌对象名,表明该基类或该内嵌对象具有默认构造函数,系统将调用该默认构造函数对该基类成员或该内嵌对象进行初始化。(2)基类名以及内嵌对象名的顺序是任意的,不过为了阅读方便,一般将所有基类名写在内嵌对象名之前。(3)基类构造函数的调用顺序是按照声明派生类时,列在基类表中的基类名顺序来安排的,与派生类构造函数初始化列表中基类名的排列顺序无关。(4)内嵌对象构造函数的调用顺序是按照派生类中,内嵌对象的定义顺序进行的,也与派生类构造函数初始化列表中列出的内嵌对象名顺序无关。在java中:(1)若父类定义的构造函数都是带有参数的,那么子类的构造函数必须通 过super调用父类的构造函数。(2)定义子类构造函数时super(参数表达)必须写在子类构造函数第一(3)在通过构造函数创建对象时,派生类跟在子类后面。在C#中:(1)若父类定义的构造函数都是带有参数的,那么子类的构造函数必须通 过base调用父类的构造函数。(2)在通过构造函数创建对象时,派生类跟在子类后面。第 54页第四章继承3.4类中的同名覆盖同

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!