好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

第45讲面向对象编程基础.ppt

51页
  • 卖家[上传人]:工****
  • 文档编号:577154738
  • 上传时间:2024-08-21
  • 文档格式:PPT
  • 文档大小:834KB
  • / 51 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 第第4 4、、5 5讲讲面向面向面向面向对对象程序象程序象程序象程序设计设计基基基基础础 * 本章任务§能正确理解类与对象的概念§能使用方法§能正确在方法之间传递信息* 类和对象类和对象 §类: 类是C#程序设计的基本单位•相对对象而言,类似于蓝图•包含方法和数据§对象:•是类的实例•使用关键字 new 创建•对象具有行为对象对象厨房厨房起居室起居室浴室浴室书房书房饭厅饭厅储藏室储藏室门廊门廊类类* 类和对象类和对象§先有对象还是先有类? 类是对象的模板,使用对象前必须先创建类类是对象的模板,使用对象前必须先创建类§---.Net公共类库中包含大量预先定义好的类§---在创建windows应用程序项目时,系统总是自动生成一个Form1类,程序的入口Main方法是该类的一个静态方法§---在windows应用程序运行时,将在main方法中创建一个Form1类的实例* §.NET中的类和对象中的类和对象ü在Visual Studio IDE环境中,工具箱中的控件是被图形文字化的可视化类,当把这些对象添加到窗体设计器上时,即由类创建了对象ü类本质上是一种数据类型* 定义类[访问修饰符访问修饰符] class 类名类名 { [访问修饰符访问修饰符]常量声明;常量声明; [访问修饰符访问修饰符]字段声明;字段声明; [访问修饰符访问修饰符]方法声明;方法声明; [访问修饰符访问修饰符]属性声明;属性声明; [访问修饰符访问修饰符]构造函数声明;构造函数声明; [访问修饰符访问修饰符]析构函数声明;析构函数声明; }说明:说明:使用类声明可以创建新的类。

      类声明以一个声明头开始,其组使用类声明可以创建新的类类声明以一个声明头开始,其组成方式如下:先是指定类的特性或者修饰符,后跟类的名字,成方式如下:先是指定类的特性或者修饰符,后跟类的名字,它由一组包含在大括号(它由一组包含在大括号({})中的成员声明组成)中的成员声明组成 例如例如:定义:定义rectangle 类:类: public class rectangle //定义类定义类 { public double length; //定义字段定义字段 public double width; //定义字段定义字段 }* 类的修饰符类的修饰符§public(公有类):表示外界可以不受限制地对该类访问;§private(私有类):表示只有本类才能访问;§protected(保护类):表示只能对其所在类和从该类派生的子类进行访问;§internal(内部类): 表示仅能访问本程序;§abstract(抽象类):说明该类可以用来做其他类的基类,可以继承但不能单独使用;§Scaled(密封类):说明该类不能作为其他类的基类,不能派生新的类;§省略类修饰符则表示为private 。

      1.将类实例化为对象对象对象2.类成员的访问<类名类名> <对象名对象名> = new <类名类名>();例如:例如:rectangle rec1= new rectangle();对象名对象名.数据数据例如:例如:rec1.length;* •对类名推荐使用Pascal命名规范:每个单词的首字母要大写•创建并初始化对象[属性属性] [访问修饰符访问修饰符] class <类名类名> {<类的成员列表类的成员列表>;}<类名类名> <对象名对象名> = new <类名类名>();总结定义类* 类成员§在类的定义中,包含有各种类成员,概括起来类的成员有两种:存储数据的成员存储数据的成员与操作数据的成员操作数据的成员存储数据的成员叫“字段”,操作数据成员又有很多种 §“字段”是类定义中的数据,也叫类的变量 §“属性”用于读取和写入“字段”值 §“方法”实质上就是函数,通常用于对字段进行计算和操作,即对类中的数据进行操作,以实现特定的功能§“构造函数”是在用类声明对象时,完成对象字段的初始化工作 字段为类中的成员,是表示与对象或类关联的变量,字段常定义的类型有public(公有型)、private(私有型)等。

      字段例如:例如:class triangle //定义类定义类{public string name ; //字段成员字段成员public double sideA; //字段成员字段成员public double sideB; //字段成员字段成员public double sideC; //字段成员字段成员}* 加上static保留字为静态成员,没有这个保留字的为非静态成员 区别: 静态成员属于类所有,非静态成员属于类的对象所有,因此访问静态成员只能由类来访问,而访问非静态成员必须由对象进行访问静态字段静态字段的访问格式静态字段的访问格式:类名类名.静态成员名静态成员名非静态字段的访问格式:对象名非静态字段的访问格式:对象名.非静态成员名非静态成员名* class Teacher{ public string number="1001"; //非静态字段 public string name="张宁"; //非静态字段 public static double pay=3650.5; //静态字段}static void Main(string[] args){ Teacher t1 = new Teacher(); string str = "职工编号:" + t1.number + ",姓名:" + t1.name + ",工资:" + Teacher.pay.ToString(); Console.WriteLine(str );} 例如:number和name为非静态字段, pay为静态字段,因此访问前面两个字段用对象调用t1.number和t1.name,访问最后一个字段用类来调用Teacher.pay。

      * §类的方法表示一类事物所具备的动作,在C#中就是类或对象为完成一项任务而执行的指令序列§在编写程序中使用方法主要是便于修改、增加可读性,方法可以重用和封装方法方法 * 编写方法§编写方法前的准备工作:•该方法主要是实现什么功能?根据功能起一个容易记的方法名•实现该方法需要用户提供什么数据?确定方法的参数如计算n!,就需要给该方法传入一个整数n•该方法是实现操作或是计算?§若是操作,方法的返回类型可以定为void§若是计算,需要确定需要给调用者返回一个什么类型的结果如求n!需要给调用者返回一个长整型的阶乘值§方法的最后一个执行语句应当是: (若是操作可以省略)return 表达式;* 编写方法§编写方法前的准备工作:•该方法可以给哪些人使用:§public:所有人都可以使用§private:只能给本类使用§protected:可以给本类和派生类使用•方法要写在类(class)中 编写方法§方法定义的格式[ [方法修饰符方法修饰符] ] 返回值类型 方法名 返回值类型 方法名([([形参列表形参列表])]){ {方法体方法体} }l方法修饰符是可选的它可以是方法修饰符是可选的它可以是public, private, protected 等之一。

      等之一默认为默认为privatel方法名要符合标识符的命名规则方法名要符合标识符的命名规则l参数的声明和变量一样,即参数的声明和变量一样,即 类型名类型名 参数名参数名 的格式,用于接收调的格式,用于接收调用者传过来的数值,也相当于方法的局部变量多个参数之间用用者传过来的数值,也相当于方法的局部变量多个参数之间用逗号分隔逗号分隔 任务任务3:根据圆的半径计算:根据圆的半径计算圆面积圆面积任务描述:任务描述:§输入圆半径§单击“计算”按钮,显示圆面积 §需要定义Circle类§自定义方法Area()需要根据参数r计算面积任务任务3:根据圆的半径计算圆面积:根据圆的半径计算圆面积* 代码代码……//定义Circle类 public class Circle { public const double PI = 3.14159; public double r; public double Area(double r) { this.r = r; //this.r表示类的字段,r表示方法Area的形参 double s = PI * this.r * this.r; return s; }}返回面积返回面积传入半径传入半径* 代码代码……//修改“计算”按钮,在其Click事件处理程序 private void btnCompute_Click(object sender, EventArgs e){ Circle circle1 = new Circle(); double r = double.Parse(txtR.Text ); //将实参r中的值传递给方法area中的形参r double s = circle1.Area(r); string res = "园半径是:" + circle1.r + "厘米,面积是:" + s.ToString() + "平方厘米"; txtResult.Text = res; }* 方法参数按值传递 public double Area (double r)double s = double s = circle1.Area(r); circle1.Area(r); 方法的声明方法的调用方法的调用调用者调用者area方法方法11.511.5* 使用以下代码,调用上述方法,结果是什么?使用以下代码,调用上述方法,结果是什么?public double Area(double r, double s) { this.r = r; s = PI * this.r * this.r; return s; } double a = 0; Circle circle1 = new Circle(); double r = double.Parse(txtR.Text); double s = circle1.Area(r, a); string res = "半径是:" + circle1.r + "厘米,面积是:" + s.ToString() + "平方厘米," + "a的值是:" + a; txtResult.Text = res; 方法参数按值传递值传递* 使用以下代码,调用上述方法,结果是什么?使用以下代码,调用上述方法,结果是什么?public double Area(double r, ref ref double s) { this.r = r; s = PI * this.r * this.r; return s; } double a = 0; //必须初始化 Circle circle1 = new Circle(); double r = double.Parse(txtR.Text); double s = circle1.Area(r, refref a); string res = "园半径是:" + circle1.r + "厘米,面积是:" + s.ToString() + "平方厘米," + "a的值是:" + a; txtResult.Text = res; 通过引用传递引用传递参数如果要传递原值并修改它,使用引用参数就非常方便。

      在传递时变量必须被初始化 public double area(double r, public double area(double r, outout double s) double s) { { this.r = r; this.r = r; s = PI * this.r * this.r; s = PI * this.r * this.r; return s; return s; } } double a; //double a; //不必初始化不必初始化Circle circle1 = new Circle();Circle circle1 = new Circle(); double r = double r = double.Parse(txtR.Textdouble.Parse(txtR.Text ); ); double s = circle1.area(r, double s = circle1.area(r, outout a); a); string res = "string res = "园园半半径径是:是:" + circle1.r + "" + circle1.r + "厘米,面厘米,面积是:是:" + " + s.ToStrings.ToString() + "() + "平方厘米,平方厘米," + "a" + "a的的值是:是:" + a;" + a;通过引用传递引用传递参数 在参数前面加一个out关键字,可将该参数设置成一个输出参数,输出参数用来返回一个结果,不必先初始化。

      方法的重载§方法重载,就是声明两个以上的同名方法,实现对不同数据类型的相同处理§两点基本要求: 1)重载的方法名称必须相同 2)重载的方法,其形参个数或类型必须不同 §例: public void swap(ref int a,ref int b){ … } public void swap(ref float a,ref float b){…} public void swap(ref float a){…} 系统会根据参数的类型或个数,寻求最匹配的方法予以调用方法的重载* §编译器通过识别方法的签名来区分调用哪个方法§方法的签名包括方法名、参数的类型、个数和顺序§对以下重载的方法,编译器能够正确识别:§对以下方法,编译器无法识别,会报错:方法的重载public void Foo(int a, float b)public void Foo(float a, int b)public void Foo(int a, int b)public void Foo(int b, int a)* 方法的重载* 属性属性,从外部属性,从外部(类的使用者类的使用者)来看,类似于类的字段。

      从内部来看,类似于类的字段从内部(类的作者类的作者)来看,类似来看,类似于类的方法于类的方法class Triangle { Private double sideA; public double SideA //定义SideA属性 { get { return sideA; } set { sideA = value; } } ……get访问器访问器set访问器访问器* §属性是一种用于访问类或对象性质的成员,它与字段不同的是属性不表示存储位置,不直接操作类的数据内容,而是通过访问器进行访问§使用属性可以像使用公共数据成员一样,这样既可以使类中数据被轻松访问,又可以避免随意访问类中公共数据而出现的安全性问题,提高了程序安全可靠性,充分体现了对象的封装性。

      属性属性 * §如果只提供 get访问器, 那么这个属性是只读的§如果只提供 set访问器,那么这个属性是只写的§建议:•将所有字段都定义为private•如果字段需要公开,请使用属性将其公开属性* §属性的访问方法与类的字段成员的访问方法一样,根据属性声明时是否为静态有下列两种访问形式 非静态属性成员访问:对象名.属性名 静态属性成员访问:类名.属性名属性的使用属性的使用* 属性的使用属性的使用 //创建对象 Triangle tri1 = new Triangle(); …… s1 = double.Parse(txtSideA.Text); s2 = double.Parse(txtSideB.Text); s3 = double.Parse(txtSideC.Text); //使用属性set访问器写入数据 tri1.SideA = s1; tri1.SideB = s2; tri1.SideC = s3; …… //使用属性get访问器读取数据 txtRes.Text = "三角形三边长分别为:"+ tri1.SideA + "厘米、" + tri1.SideB + "厘米和"+ tri1.SideC + "厘米。

      "; * §构造函数是特殊的方法,用来实现对象的初始化•与类同名•没有返回值§构造函数用于,当实例化一个对象时,会对类的成员进行初始化构造函数* §如果我们想使对象初始化时,可以按照设计者的预期来进行,就需要自己书写构造函数的代码若Triangle类,我们想初始化三边长是0,构造函数可以定义为: class Triangle { …… public Triangle(double sA) //构造函数 { sideA = sideB = sideC = sA; } …… } Triangle tri1 = new Triangle(0); 构造函数的定义* class Triangle { private double sideA; private double sideB; private double sideC; public Triangle() //系统默认构造函数 { } public Triangle(double sA) //构造函数 { sideA = sideB = sideC = sA; } …… }构造函数的重载* §当没有构造函数时,.NET会提供一个默认空的构造函数。

      如上例中的Triangle类,会有一个默认构造函数: public Triangle() //系统默认构造函数 { }§编译器只会当类中没有构造函数时,提供一个默认构造函数但是若提供了其它版本的构造函数,而没有提供默认构造函数,将不能调用默认构造函数构造函数的重载* §例如上例中没有定义 public Triangle() { }§就不能这样去实例化对象: Triangle tri1 = new Triangle(); 构造函数的重载* 析构函数析构函数也是类的特殊方法,主要用于释放类的实例析构函数的名字与类名相同,但它的前面需要加一个“~”符号;与构造函数不同的是析构函数不能带参数,也没有返回值;当撤消对象时,自动调用析构函数;析构函数不能被继承,也不能被重载 析构函数声明格式:~ 类名称(){ 语句块 } 例如:class Round { public Round() { }//构造函数 public Round (int r) { this.r = r; }//构造函数重载 ~Round() //析构函数 { Console.WriteLine("~Round () is release"); }}* §面向对象编程的重要特性有:封装、继承和多态。

      §封装性封装性是指将数据与对数据的操作作为一个整体,以类的形式进行定义,这种机制叫做“封装”§继承性继承性是指在类之间建立一种关系,即在基类的基础上建立新的类称为派生类,使得新定义的派生类可以继承基类的成员,还可以定义新的成员,建立起类的新层次§多态性多态性是指在类中定义了功能不同但名称相同的方法或属性,通过在类中声明虚拟方法和属性,在派生类中重写这些方法成员的实现,使得调用名称相同的方法成员所执行的操作可能不同,展示出类的多态性继承与多态* 类的继承派生类声明格式:Class 派生类名:基类名{ 语句块}1.派生类与基类 派生类是从基类中继承成员,并且添加新成员或重新定义成员,一般称被继承的类为基类或父类,继承后产生的新类称为派生类或子类 基类中构造函数和析构函数不能被派生类继承,其它成员都能被继承即:派生类具有父类所有的公共属性和方法 * 派生类2.基类成员修饰符 基类成员修饰符可为public、protected、private其含义如下: public:访问该成员不受任何限制,可以被基类和派生类访问,也可以被外部代码访问 protected:访问该成员仅限于包含它的类和派生类,外部代码不能访问。

      private:该成员仅限于包含它的类,不能被派生类和外部代码访问 如果不涉及继承,则private和protected没有区别.* C#中类继承规则§派生类只能继承于一个基类§派生类自然继承基类的成员,但不能继承基类的构造函数§基类中的成员声明时,不管是什么访问控制方式,总能被子类继承访问控制方式只决定了派生类成员是否能访问基类成员§类的继承可以传递,Object类是所有类的基类 §派生类是对基类的扩展,可以声明新的成员,但不能消除已继承的基类成员§派生类定义中,如果声明了与基类同名的成员,则基类中同名的成员将被覆盖C#中类继承规则* public class Person { private string name; //人物都有姓名 private char sex; //人物都有性别 private int age; //人物都有年龄 public Person() { } public Person(string name, char sex, int age) { this.Name = name; this.Sex = sex; this.Age = age; } //以下都是封装字段,为了数据的安全; public string Name { get { return name; } set { this.name = value; } } * public char Sex { get { return sex; } set { this.sex = value; } } public int Age { get { return age; } set { this.age = value; } } //定义方法,比如吃饭 public void Eat() { Console.WriteLine(Name + "正在吃饭!"); } }* //派生类(子类) public class ZhangSan : Person { public ZhangSan() { } //这时,张三这个类就有了父类的公共属性和方法 public ZhangSan(string name, char sex, int age) { this.Name = name; this.Sex = sex; this.Age = age; } } ZhangSan zs = new ZhangSan("张三", '男', 20); zs.Eat();//测试* 虚拟方法和重写方法1.虚拟方法 派生类继承了基类方法,如果在派生类中需要用到与基类相同方法名,但方法执行的操作内容不同时,则需要“重写”它们,即重写方法成员的实现。

      在基类中声明方法时用virtual关键字来修饰,表示此方法为虚拟方法,用virtual声明的方法可以在派生类中重写虚拟方法声明中不能包含static、abstract、override修饰符 在声明方法时没有用virtual关键字的,该方法为非虚拟方法非虚拟方法的执行是不变的,不管方法在它声明的类的实例中,还是在派生类的实例中被调用,执行都是相同的 虚拟方法和重写方法2.重写方法 重写方法就是在派生类中用相同的名称重写基类继承的虚拟方法,也就是在派生类中重新定义此虚拟方法的实现,在声明方法时用override关键字来修饰,表示该方法为重写方法虚拟方法的执行可以被派生类重写后改变,具体实现时要求重写方法的方法名、返回值类型、参数表中的参数个数、类型顺序都必须与基类中的虚拟方法完全一致在方法声明中不能有new、static、virtual修饰符 抽象类和抽象成员1.抽象类 在类声明中用abstract关键字进行修饰,表明此类只能是其他类的基类,称为抽象类在类中含有一个或一个以上的抽象成员的类必须声明为抽象类,抽象类也可以包含非抽象类成员,当类中一个抽象类成员都没有的情况下,也可以将该类声明为抽象类。

      抽象类是为了提供一个比较合适的类,由此派生出其他的类,它不能实例化,而是在派生类中实现它不能实例化,而是在派生类中实现2.抽象成员 抽象类中包含的抽象成员可以是抽象属性和抽象方法,声明时都用abstract关键字进行修饰,表示该属性和方法未实现,其中抽象方法没有方法体,但必须声明,在它的派生类中通过重写提供实现。

      点击阅读更多内容
      相关文档
      2025国开山东开大《土质学与土力学》形成性考核123答案+终结性考核答案.docx 中学综合素质知识点梳理【中学教师资格证】.docx 2025国开山东开大《特许经营概论》形成性考核123答案+终结性考核答案.doc 2025年高考英语全国一卷真题(含答案).docx 2025国开山东《农民专业合作社创建与管理》形成性考核123答案+终结性考核答案.docx 2025国开山东开大《自然现象探秘》形成性考核123答案+终结性考核答案.docx 2025国开山东《消费心理学》形成性考核123答案+终结性考核答案.doc 2025国开山东《小微企业管理》形成性考核123答案+终结性考核答案.doc 2025国开山东开大《资本经营》形成性考核123答案+终结性考试答案.docx 2025国开山东《小学生心理健康教育》形考123答案+终结性考试答案.docx 2025国开《视频策划与制作》形考任务1-4答案.docx 2025国开《亲子关系与亲子沟通》形考任务234答案+期末大作业答案.docx 2025国开电大《煤矿地质》形成性考核123答案.docx 2025国开电大《冶金原理》形考任务1234答案.docx 2025国开《在线学习项目运营与管理》形考任务1234答案.doc 2025国开电大《在线教育的理论与实践》阶段测验1-4答案.docx 2024 年注册环保工程师《专业基础考试》真题及答案解析【完整版】.docx 环保工程师---2023 年注册环保工程师《专业基础考试》真题及答案解析【完整版】.docx 2025国开《液压与气压传动》形考任务一参考答案.docx 2025年春江苏开放大学教育研究方法060616计分:形成性作业2、3答案.docx
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.