您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 薪酬管理 > 第零章 面向对象程序设计
0-1面向对象程序设计概述在最初面向过程的程序设计方法出现的很早,它的策略是把大的任务划分成许多小的模块,每个模块由过程来实现,每个过程都是基于某种特定的算法,且数据和代码是分离开的。但是,随着程序规模的扩大,这种设计的弊端也就暴露出来:程序开发周期延长、工作量难以预测、软件开发后维护成本成指数级增长、代码重用性差。为了解决这些弊端,出现了面向对象的程序设计方法(ObjectOrientedProgramming,OOP)“面向对象”概念是“面向过程”的一次革命,随之出现的MicrosoftC++、BorlandC++等,VisualC#.NET都是面向对象的程序设计语言。生活中对象的概念在生活中,几乎任何东西都可以看成是对象。把一个东西看成对象,我们就可以孤立地去审查它的性质、它的行为,进而研究它和其他对象的关系。例如:电视机对于我们来说就是一个对象,也可以看作一个“黑盒子”,尽管它内部的工作细节可能很复杂,但是我们不需要知道,只需要知道怎么使用就行了。对象属性型号价格里程行为起动停车行驶属性车轮数量档的数量行为加速换档刹车属性名称颜色品种行为摇尾巴吃东西犬吠面向对象的基本概念面向对象=对象+类+继承+通信抽象:把一组对象放在一起,抽取公共的属性和行为,将其放入一个类中。(1)封装:把数据与对数据进行的操作捆绑在一起,成为一个类型的对象。(2)继承:使得一个类可以获得先前已定义类的全部特征,从而增强了代码的可重用性,提高了开发效率。(3)多态:相同的函数为不同的对象接收时,可导致完全不同的行为。对象对象指的是一个实体的实例,在这个实体中包括了特定的属性数据和对这些数据进行操作的函数。例如:某个特定的人就是对象某个特定的控件就是对象类(class)类是一组具有相同数据结构和相同操作的对象的集合。在一个类中,每个对象都是类的实例,可以使用类中提供的方法。例如:人类控件类0-2类和对象的声明类声明语句[修饰符]class类名[:基类名]{类体}对象声明语句类名对象名=new类名(参数);或类名对象名;对象名=new类名(参数);语法:成员变量[访问修饰符]数据类型成员变量;privateprotectedinternalpublic_namestatus….userNameintchar….bool…classEmployee{privatestring_name;privatechar_gender;privatestring_qualification;privateuint_salary;}…访问成员变量步骤1:创建一个类的对象EmployeeobjEmployee=newEmployee();步骤2:使用点号访问成员变量objEmployee._name=“张三;objEmployee._name='M';0-3访问修饰符Teacher类private成员protected成员public成员internal成员Student类只有Student类在Teacher类都在同一程序集中,才可访问internal成员不可访问不可访问可以访问访问修饰符修饰符说明public所属类的成员以及非所属类的成员都可以访问internal当前程序集可以访问private只有所属类的成员才能访问protected所属类或派生自所属类的类型可以访问0-4类的成员静态成员如果字段、方法、属性、事件、运算符或构造函数声明时指定了static修饰符,就等于声明了一个静态成员。静态成员的特点是从声明开始就只占用一个存储地址。classTest{publicstaticinta=0;//静态字段publicTest(){a++;}}实例成员如果字段、方法、属性、事件、下标指示器、构造函数或析构函数声明时没有指定static修饰符,那么此时声明的是一个实例成员。实例成员的特点是每新建一个实例,就会分配一次存储地址。实例:静态成员与实例成员的区别classCount{privatestaticintcount;//静态privateint_number;//实例publicCount(){count=count+1;_number=_number+1;}publicvoidShow(){this.textBox1.Text=count.ToString();this.textBox2.Text=_number.ToString();}}静态成员从声明开始就只占用一个存储地址;实例成员每新建一个实例,就会分配一次存储地址。因此,静态成员的内容可以在整个程序执行过程中保持同样的内容,而实例成员只跟创建的对象有关0-5属性属性用于刻画对象的特征或表示对象的状态,它提供对类或对象性质的访问。访问修饰符数据类型属性名{get{get访问器代码块}set{set访问器代码块}}只读属性只写属性实例:属性的演示classCount{privateint_pTop;publicintTop{get{return_pTop;//get访问器,获取pTop属性值}set{pTop=value;//set访问器,设置pTop属性值}}}0-6构造函数构造函数是类的一种特殊方法,每次创建类的实例都会调用它[访问修饰符]类名(){//构造函数的主体}语法:…//默认构造函数Employee(){_qualification=“专科生;}…示例:构造函数的概念很重要!classEmployee{privatestring_name;privatechar_gender;privatestring_qualification;privateuint_salary;//默认构造函数privateEmployee(){_qualification=“专科生;}staticvoidMain(){//调用默认构造函数EmployeeobjEmployee=newEmployee();}}参数化构造函数[访问修饰符]类名{//构造函数的主体}语法:([参数列表])…//参数化构造函数Employee(stringstrQualification){_qualification=strQualification;}…示例://默认构造函数privateEmployee(){_qualification=“研究生;}//参数化构造函数privateEmployee(stringstrQualification,stringstrName,chargender,uintempSalary){_qualification=strQualification;_name=strName;_gender=gender;_salary=empSalary;}publicstaticvoidMain(){//调用默认构造函数EmployeeobjGraduate=newEmployee();//调用参数化构造函数EmployeeobjMBA=newEmployee(“ACCPS3“,”张亮“,‘男',5500);}0-7析构函数用于执行清除操作的特殊方法~类名(){//析构函数的主体}语法:…~Employee(){}…示例:0-8方法对象的行为接听响铃挂断PickUp(){….//用于传送和接收信号的代码}Ring(){….//用于显示主叫号码的代码}Hang(){….//用于结束会话的代码}声明方法语法访问修饰符(可选),默认情况下为private[访问修饰符]返回类型方法名([参数列表]){//方法主体}如果不需要返回任何值,方法可能返回void数据类型…..classPoint{intx;inty;voidAssign(){System.Console.WriteLine(“输入点的值);x=int.Parse(System.Console.ReadLine());y=int.Parse(System.Console.ReadLine());}}…..方法Assign()的定义•不返回任何值(void)•不接收任何值(Assign())Assign()方法调用方法语法对象名.方法名([参数列表]);实例类中的方法点号return[表达式];方法重载消费者1固定电话电移动电话帐单管理层供应商1供应商2电信电电话电对不同的数据执行相同的任务…ClassBillPayment{…voidPayBill(inttelephoneNumber){//此方法用于支付固定电话话费}voidPayBill(longconsumerNumber){//此方法用于支付电费}voidPayBill(longconsumerNumber,doubleamount){//此方法用于支付移动电话话费}…}…对不同数据执行相似的功能intgreatest(intnum1,intnum2){Console.WriteLine(“{0}和{1}相比,最大的是:,num1,num2);if(num1num2){returnnum1;}else{returnnum2;}}intgreatest(intnum1,intnum2,intnum3){Console.WriteLine(“{0},{1}和{2}相比,最大的是:,num1,num2,num3);if(num1num2&&num1num3){returnnum1;}elseif(num2num1&&num2num3){returnnum2;}else{returnnum3;}}具有不同数量的参数的方法重载intgreatest(int[]numbers){inttemp=numbers[0];for(inti=1;inumbers.Length;i++){if(tempnumbers[i])temp=numbers[i];}returntemp;}doublegreatest(double[]numbers){doubletemp=numbers[0];for(inti=1;inumbers.Length;i++){if(tempnumbers[i])temp=numbers[i];}returntemp;}具有不同类型的参数的方法重载上机练习:1.定义方法,求x的n次方。2.写两个方法,输入参数是圆的半径,返回值一个是圆的周长,一个是圆的面积。0-9类的继承创建派生类要在派生类的名字后面加上冒号“:”,后面再跟上基类的名字。派生类继承了基类的所有成员,包括成员变量和方法。继承的重要性:如果一个类是从其他类派生的,那么该类也继承其直接基类的所有成员,但基类的构造函数和析构函数除外。继承具有传递性。classA{}classB:A{}//B从A继承ClassBase{//成员变量intbasevar;//成员函数Base_fun1(){//定义}…….…….ClassDerived:Base{//成员变量intderivedvars;//成员函数Derived_fun1(){//定义}…….…….基类voidmain(){Deriveddr_obj=newDerived();dr_obj.Base_fun1();}无需重新编写代码派生类狗马动物基类派生类继承的层次结构示例ClassAnimal{//成员变量inteyes,nose;Animal(){eyes=2;nose=1;}Pet_Animal(){//定义}}基类ClassDog:Animal{//成员变量//成员函数privateBarking(){//定义}privateWagging_Tail(){}}派生类publicclassGraduate:Student,Employee{//成员变量//成员函数}不允许多重继承实例:栈模型的实现栈是一种重要的数据结构,在内存中占用连续的存储单元。栈有两个端点,固定的栈底和浮动的栈顶。为指示栈顶位置还应设一个指示成员变量(栈顶指示器)。栈有两种基本操作
本文标题:第零章 面向对象程序设计
链接地址:https://www.777doc.com/doc-3231480 .html