C#、C、Java面向对象比较研究.pdf
目 录目 录摘 要.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小结.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总 结.错误!未定义书签。致 谢.68参考文献69摘要摘 要面向对象的程序设计技术是目前最流行、最实用的软件开发手段。与传统的面向过程程序设计结构化技术完全不同。它的出现是程序设计语言的一场革命。它主要包括类、对象、消息、方法、属性等基本概念,具有封装性、继承、多态性、重载等特点。在面向对象的程序设计中,现实世界的对象被抽象为“类 工 程序员将精力主要集中于要处理的对象的设计和研究上,通过继承、多态、重载可以很方便的实现代码的重用,从而大大提高了软件的开发效率。C+、Jav a和 C#都是目前最流行的面向对象程序设计语言,它们都可以为面向对象的技术提供全面的支持。本文共分为四章,第 一 章主要介绍了面向对象的基本概念和特征。第二章主要比较了 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 usefulmethod 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 encapsulation 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 conveniently 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 basicconcept 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#language 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 the tag ofgraduation design.Key Words:Object Oriented Class Inherit Polymorphism Overloading第 7 页第四章继承第一章面向对象概述1.1 面向对象的基本概念1.1.1 对象客观世界的问题都是由客观世界的实体及实体间的相互关系构成的,我们把客观世界的实体称为问题空间的对象。显然,“对象”不是固定的。一本书是一个对象,一家书店也可以是一个对象。世界上的各个事物都是由各种“对象”组成的。任何事物都是对象,复杂的对象可以由相对比较简单的对象以某种方式组成。从这种意义上讲,整个客观世界可认为是一个最复杂的对象。从动态的观点看,对象的操作就是对象的行为。问题空间对象的行为是极其丰富多彩的,而解空间对象的行为是死板的,只有借助于复杂的算法才能操纵解空间的对象而得到解。传统的程序设计语言限制了程序员定义解空间对象,而面向对象语言提供了“对象”概念。这样,程序员就可以自己去定义解空间对象。从存储的角度看,“对象”是一片私有存储,其中有数据也有方法。其他对象的方法不能直接操纵该对象的私有数据,只有对象自己的方法才可操纵它。从对象的实现机制来看,“对象”是一台自动机,其中私有数据表示了对象的状态,该状态只能由自身的方法改变它。每当需要改变对象的状态时。只能由其他对象向该对象发进消息,对象响应消息后按照消息模式找出匹配的方法,并执行该方法。在面向对象的设计中,“对象”是应用领域中的建模实体。所有对象在外观上都表现出相同的特性,即固有的处理能力和通过传邀消息实现的统一的联系方式。在面向对象的程序设计中,“对象”是系统中的基本运行实体。换句话说,“对象”是具有特殊属性(数据)和 行 为 方 式(方法)的实体。对象占有存储空间且具有传统程序设计语言的数据,如变量、数 组、字第30页第四章继承符 串 等。给对象分配存储空间就确定了给定时刻对象的状态,与每一个对象相关的方法定义了该对象上的操作。1.1.2类在面向对象的程序设计中,“对象是程序的基本单位,相似的对象可以和传统语言中的变量与类型关系一样,归并到一类(class)中去。类实质上定义的是一种对象类型,它是对具有相似行为的对象的一种抽象,描述了属于该类型的所有对象的性质。例 如:integer是一个类,它描述了所有整数的性质,“1”、“2”等具体整数都是integer这个类的对象,都具备算术运算和大小比较的处理能力。对象是在执行过程中由其所属的类动态生成的,一个类可以生成多个不同的对象。同一个类的所有对象具有相同的性质,即其外部特性和内部实现都是相同的。一个对象的内部状态(私有属性)只能由其自身来修改,任何别的对象都不能来修改名。因此,同一个类的对象虽然在内部状态的表现形式上相同,但它们可以有不同的内部状态。这些对象并不是一模一样的。1.1.3 消息和方法如何要求对象完成一定的处理工作?对象间如何进行联系?所有这一切都只能通过传递消息来实现。消息用来请求对象执行某一处理或回答某些信息的要求,消息统一了数据流和控制流。某一对象在执行相应的处理时,如果需要,它可以通过传递消息请求其他对象完成某些处理工作或回答某些信息。其他对象在执行所要求的处理活动时,同样可以通过传递消息与别的对象联系。因此,程序的执行是靠在对象间传递消息来完成的。发送消息的对象称为发送者,接收消息的对象称为接收者。消息中只包含发送者的要求,它告诉接收者需要完成哪些处理,但并不指示接收者应该怎样完成这些处理。消息完全由接收者解释,接收者独立决定采用什么方式完成所需的处理。一个对象能够接收不同形式、不同内容的多个消息:相同形式的消息可以送往不同的对象;不同的对象对于形式相同的消息可以有不同的解释,能够作出不同的反应。对于传来的消息,对象可以返回相应的应答信息,但这种返回并不是必需的。消息的形式用消息模式(message pattern)刻 画,一个消息模式定义第 54页第四章继承了一类消息,它可以对应不同内容的消息。对于同一消息模式的不同消息,同一个对象所作的解释和处理都是相同的,只是处理的结果可能不同。因此有处理能力接消息分类,一个消息模式定义对象的一种处理能力。这种处理能力是通过该模式及消息引用表现出来的。所以,只要给出对象的所有消息模式及相应于每个消息模式的处理能力,也就定义了一个对象的固有处理能力。它是定义对象接口的唯一信息。使用对象只需了解它的消息 模 式,所以对象具有极强的“黑盒”性。把所有对象分成各种对象类,每个对象类都定义一组“方法”,代表允许作用于该类对象上的各种操作。1.2面向对象的基本特征1.2.1 封装封装是一利信息隐蔽技 术,用户只能看到对象封装界面上的信息,对象内部对用户是隐蔽的。封装的目的在于将对象的使用者和设计者分开,使用者不必知道行为实现的细节,只需用设计者提供的消息来访问这对象。封装的定义为。(1)一个清楚的边界,所有对象的内部软件的范围被限定在这个边界内;(2)一个 接 口,这个接口描述该对象和其他对象之间的相互作用:(3)受保护的内部实现。这个实现给出了由软件对象提供的功能的细节,实现细节不能在定义这个对象的类的外面访问。封装的概念和类说明有关,而且同样提供如何将一个问题解的各个组件组装在一起的求精过程。封装的基本单位是对象。这个对象的性质由它的粪说明来描述,这个性质被具有同样类的其他对象共享。对象用作封装比讲一个类表示的封装更具体化。有了封装这个定义一个类的每个实例在一个问题求解中是一个单独的封装,或称作组件。对象用于封装的概念可以和集成电路芯片作一类比 块集成电路芯片被封装起来,其内部电路是不可见的,也是使用者不关心的。芯片的使用者只关心芯片引脚的个数、引脚的电气参数以及引卿提供的功能,通过对各个引脚功能的了解,可以将不同的芯片引脚连在一起,组装成具有一定功能的产品。同样,软件设计者可以通过对类和对象的使用达到这个目的。显式地将对象的定义和对象的实现分开是面向对象系统的一大特色。封装本身即模块化,把定义模块和实现模块分开,就使得用面向对象技术第 54页第四章继承所开发设计的软件的维护性、修改性大为改善,这也是软件技术追求的目标之一。1.2.2 继承广义地说,继承是指能够直接获得已有的性质和特性,而不必重复定义它们。在面向对象的软件技术中,继承是子类自动地共享基类(或父类)中定义的数据和方法的机制。一个类直接继承其父类的全部描述(数据和操作)。继承具有传递性,继承性使得相似的对象可以共享程序代码和数据结构,从而大大减少了程序中的冗余信息。使得对软件的修改变得比过去容易得多了。继承性使得用户在开发新的应用系统时不必完全从零开始,可以继承原有的相似系统的功能或者从类库中选取需要的类,再派生出新的类以实现所需要的功能,所以,继承的机制主要是支持程序的重用和保持接口的一致性。1.2.3 多态性所 谓 多 态(plymorphic)即一个名字可具有多种语义。在大多数面向对象的语言中,如果类P 是子类S 的父类,则子类S 的对象s 可以用在父 类 P 的对象p 使用的地方,这就意味着一个公共的消息集(操作)可以送到类P 和 类 S 的对象上。当同样的消息可以被送到一个父类的对象和其子类的对象上时这被称作多态性(polymophism)。在不同的对象上对一个相似的操作使用相同消息的方法和人们在解决问题中的思考方式是相遇的,我们不必为打印整数、浮点数、字符而使用不同的束语。面向对象的语言中,多态引用表示可引用多个类的实例。由于多态具有可表示对象的多个类的能力,因此,它既与动态类型有关,又与静态类型有关。动态类型是在程序执行期间随时可以改变的类型。在强类型面向对象环 境 中,运行系统根据动态类型自动地保留标记的全部多态引用。静态类型是在程序正文中声明实体时确定下来的类型。在编译时已经知邀并确定了对象在运行时的有效类型集合。第 54页第四章继承第二章类与对象2.1类的定义格式C+中类的定义格式:Class 类名称)(修饰符:成员函数或数据成员的说明;);其中是定义类的关键字。类名称是一中标识符,一对花括号内是类的说明部分。说明该类成员。类的成员包含数据成员和成员函数两部分。Java中类的定义格式:修饰符Class类名称(类的属性与方法;)类名称的第一个字母为大写,例如:SystemoC#中类的定义格式:修饰符Class类名称(类的成员;小结在C+中类定义不存在类修饰符,而C#和Java中类修饰符决定了这个类的属性。在Java中类名称的第一个字母必须大写,而C#和C+中类名称无需这个必要。第30页第四章继承2.2类中成员的访问修饰符C+提供了 3个不同的访问权符,它们规定的成员访问属性互不同:(1)public(公有的)具有这种访问属性的成员,可被与该类对象处在同一作用域内的任何函数使用。(2)private(私有的)私有的成员只能被它所在类中的成员函数及该类的友元函数使用。(3)protected(保护的)具有这种访问属性的成员只能被它所在类及从该类派生的子类的成员函数及友元函数使用成员访问控制类自身派生类其他类Public可被访问可被访问可被访问Private可被访问不可被访问不可被访问Protected可被访问可被访问不可被访问Java提供了 4个不同的访问权符,它们规定的成员访问属性互不同:(1)public(公有的)定义成这种等级的属性,可以被任何对象存取,适用于完全公开的数据。(2)private(私有的)定义成这种等级的属性,只可以被同一类的方法所存取,适用于类中不欲公开的数据。(3)protected(保护的)则具有半公开性质的数据,定义成这种等级的数据可以被类,子类及从同一包的其他类的方法存取。(4)default(无修饰符)定义成这种等级的属性,将可以被同一 package类的方法存取。注意:使用default等级时,只是在属性前不加上任何修饰符,而不是在属性前使用default关键字。C#提供了 5个不同的访问权符,它们规定的成员访问属性互不同:存取等级同一类同一 package不同 package其他类子类其他类子类Public可被访问可被访问可被访问可被访问可被访问Private可被访问不可被访问不可被访问不可被访问不可被访问Protected可被访问可被访问可被访问不可被访问可被访问无修饰符可被访问可被访问可被访问不可被访问不可被访问第 54页第四章继承(1)public(公有的)具有这种访问属性的成员,可以被任何随意访问。(2)private(私有的)定义成这种等级的属性成员,只可以被类自身访问。(3)protected(保护的)具有这种访问属性的成员只能被它所在类及从该类继承的任何成员访问。(4)internal(内部的)具有这种访问属性的成员,可被与同一程序集内部的任何类的任何成员访问。(5)internal protected(内部保护的)具有这种访问属性的成员只能被可被与同一程序集内部的中或继承类中被访问。存取等级同一类同一程序集的内部不同一程序集的内部其 他 类子 类其 他 类子 类Public可被访问可被访问可被访问可被访问可被访问Private可被访问不可访问不可访问不可访问不可访问Protected可被访问不可访问可被访问不可访问不可访问Internal可被访问可被访问可被访问不可访问不可访问Protected internal可被访问可访问可被访问不可访问可访问小结Protected关键字在C+、ja v a 和 C#中的作用是完全不同的。标记为 Protected的 C+类,成员函数和变量可以在所在类及从该类派生的子类的成员函数及友元函数使用。标 记 为Protected的 java类,成员函数和变量可以在同一包中或继承类中被访问。标 记 为 Protected的 C#类,方法和变量可以被类或其继承类的任何成员访问。Java中 的 Protected与C#中的 Protected internal相似。Java 中的无修饰符与 C#中 internal的相似。Public和 Private修饰符在C+、ja v a 和 C#中用法都一样。2.3类中的数据成员2.3.1常数据成员常数据成员是类中定义的常量。在类中使用的某个常数值都可以定义为常量。如圆周率,一个星期的天数,每小时的分钟数等。第 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 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(“2002001);Console.WriteLine(学号为:,+Student.StudentID);)运行结果为:学号为:2002001注意:与 常 量 成 员(由const关键字声明)一样,只读成员也用与表示一个不变化的值。但是,赋值给常量的值必须在源代码中指定。而只读成员的值直到程序运行时才知道。只读成员的值在一个构造函数中初始化,而且此后不能在修改。所以常量成员在编译后程序的整个生存周期内保持不变。而只读成员只在此对象生存周期内保持不变第 54页第四章继承Java:定义常量的格式是:修饰符final数据类型常量名=常量表达式值例:class MyClass public final float 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;.如果需要统计雇员总数,这个数据存放在什么地方呢?若以类外的变量来存储总数,不能实现数据的隐藏。若以类中增加一个数据成员用以存放总数,必然在每一个对象中都存储一副本,仅冗余,而且每一个对象分别维护一个“总数,势必造成数据的不一致性。因此,比较理想的方案是类的所有对象共同拥有一个用于存放总数的数据成员。类中的静态数据成员只存储在一个地方,静态数据成员的值对每一个对象都是一样的。如果在某个对象中对静态数据成员的值进行了更新,则所有对象都存取到更新后的相同的值。即所有对象实例共享静态变量,静态变量有且仅有一个副本。在C+中静态成员必须初始化,初始化方法是在类外进行,格式为:数据类型名类名:静态数据成员名=表达式。第 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中静态成员初始化方法是在类中进行,格式为:存取控制修饰符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 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 静态构造函数进行初始化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#中可以通过静态构造函数进行初始化也可以直接进行初始化。和 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关键字。c la s s 类名 private:lprotected:lpublic:返回值类型内联函数名(形参表说明););inline返回值类型类名:内联函数名()(函数体);java的成员函数又称为方法,在类中定义的一般格式如下:修饰符返 回 值 类 型 方 法 名 称(参数表)程序语句注意:用方括号括住的项表可选。修饰符用与定义此方法可被其他类的方法调用的控制权等级。C#的成员函数也称为方法,在类中定义的一般格式如下:属性 修饰符返 回 值 类 型 方 法 名 称(参数表)程序语句注意:用方括号括住的项表可选。修饰符用与定义此方法可被其他类的方法调用的控制权等级。下面分别用和C+、Java和 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)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 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+中的方法,或称函数,既可以在类内部又可在类外部通过“类名:”的形式定义。定义。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()cout64object 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 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 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()从上述格式可以看出,调用静态方法可以不需要对象,通过类名即可以调用。不可以通过对象进行调用,所以静态方法内部只能出现静态变量和静态方法。在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 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构造函数 构造函数在对象被创建的时候由系统自动调用,它的作用就是在对象被创建时利用特定的值构造对象,将对象初始化为一个特定的状态。构造函数的特点: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);MyClassO ;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()Point a(1.5,2.82);Pointb;a.print();b.print();coutendl;)在C+中存在拷贝构造函数。他是一种特殊的构造函数,其形参是本类的对象的引用,其作用是使用一个已经存在的对象(由拷贝构造函数的参数指定的对象)去初始化一 个新的同类的对象。如果程序员没有定义类的拷贝构造函数,系统就会自动生成一个默认的拷贝构造函数。这个默认拷贝构造函数的功能是把初始值对象的每个数据成员的值都复制到新建立的对象中。拷贝构造函数的定义方法Class类名 public:类名(形参表);构造函数类名(类名&对象 名);拷贝构造函数;类名:类名(类名&对 象名)(函数体下面给出一个拷贝构造函数的例子。第 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#中存在指代构造函数。在类的内部,-个构造函数可以调用另外一个构造函数,这是一种好的程