资源预览内容
第1页 / 共75页
第2页 / 共75页
第3页 / 共75页
第4页 / 共75页
第5页 / 共75页
第6页 / 共75页
第7页 / 共75页
第8页 / 共75页
第9页 / 共75页
第10页 / 共75页
亲,该文档总共75页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
病原体侵入机体,消弱机体防御机能,破坏机体内环境的相对稳定性,且在一定部位生长繁殖,引起不同程度的病理生理过程第第3章章 面向对象编程基础面向对象编程基础1. 理解基本概念理解基本概念2. 理解理解类类3. 使用构造函数使用构造函数4. 学习学习方法方法5. 学习学习属性属性掌握掌握1病原体侵入机体,消弱机体防御机能,破坏机体内环境的相对稳定性,且在一定部位生长繁殖,引起不同程度的病理生理过程 姓名、性别、年龄等:属性姓名、性别、年龄等:属性学习课程、参加社会活动:方法学习课程、参加社会活动:方法3.1 面向对象编程概念面向对象编程概念 1. 对象对象具有属性和操作(方法)的实体。具有属性和操作(方法)的实体。 属性:对象所处的状态属性:对象所处的状态 方法:用于改变对象状态以达到特定的功能方法:用于改变对象状态以达到特定的功能 对象有一个唯一的标识名对象有一个唯一的标识名 2. 类类在对象之上的抽象,一种抽象的数据类型在对象之上的抽象,一种抽象的数据类型 3. 类是对象的模板,对象是类的具体化或类的实例类是对象的模板,对象是类的具体化或类的实例示例:示例:学生学生类类各位同学各位同学对象对象2病原体侵入机体,消弱机体防御机能,破坏机体内环境的相对稳定性,且在一定部位生长繁殖,引起不同程度的病理生理过程对象对象 与与 类类属性型号价格里程行为起动停车行驶属性车轮数量档的数量行为加速换档刹车属性名称颜色品种行为摇尾巴吃东西犬 吠 3病原体侵入机体,消弱机体防御机能,破坏机体内环境的相对稳定性,且在一定部位生长繁殖,引起不同程度的病理生理过程面向对象程序设计在处理对象时,面向对象程序设计在处理对象时,必须遵循的三个原则:必须遵循的三个原则:1 1封装封装封装封装用一个框架把数据和代码组合在一起,形成一个对象。用一个框架把数据和代码组合在一起,形成一个对象。类是支持对象封装的工具,对象则是封装的基本单元。类是支持对象封装的工具,对象则是封装的基本单元。2 2继承继承继承继承利用继承可以创建分等级层次的类,继承是父类和子类之间利用继承可以创建分等级层次的类,继承是父类和子类之间共享数据和方法的机制,通常把父类称为基类,子类称为派生类。共享数据和方法的机制,通常把父类称为基类,子类称为派生类。单继承:一个基类可以有任意数目的派生类,即单继承:一个基类可以有任意数目的派生类,即 一父多子一父多子多继承:一个类若有两个或两个以上的直接基类,即一子多多继承:一个类若有两个或两个以上的直接基类,即一子多父,称为多重继承,父,称为多重继承,C#通过接口来实现通过接口来实现3 3多态性多态性多态性多态性同一个操作作用于不同的对象,可以有不同的解释,产生不同一个操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。分为静态多态和动态多态同的执行结果。分为静态多态和动态多态根据参数的差别根据参数的差别 直接调用直接调用对象方法对象方法根据基类根据基类 间接调用间接调用对象方法对象方法4病原体侵入机体,消弱机体防御机能,破坏机体内环境的相对稳定性,且在一定部位生长繁殖,引起不同程度的病理生理过程3.2 类类3.2.1 类的声明类的声明语法形式:语法形式:属性集信息属性集信息 类修饰符类修饰符 class 类名类名 : 类基类基 类主体类主体 1.属性集信息属性集信息是是C#语言为程序中定义的各种实语言为程序中定义的各种实体附加一些说明信息,是体附加一些说明信息,是C#语言的一个重要特征语言的一个重要特征。属于高级编程内容,一般涉及不到。属于高级编程内容,一般涉及不到。2.类名:唯一标识名类名:唯一标识名3.类基:直接基类或接口。默认基类是类基:直接基类或接口。默认基类是object类,类,多个接口之间用逗号相隔多个接口之间用逗号相隔4.类修饰符类修饰符访问权限、类的类型等,注意同一访问权限、类的类型等,注意同一修饰符不允许出现多次,见表修饰符不允许出现多次,见表3.15病原体侵入机体,消弱机体防御机能,破坏机体内环境的相对稳定性,且在一定部位生长繁殖,引起不同程度的病理生理过程表表3.1 3.1 类修饰符类修饰符修饰符作 用 说 明public表示不限制对类的访问。类的访问权限省略时默认为 publicprotected表示该类只能被这个类的成员或派生类成员访问private表示该类只能被这个类的成员访问,很少用internal表示该类能够由程序集中的所有文件使用,而不能由程序集之外的对象使用new只允许用在嵌套类中,它表示所修饰的类会隐藏继承下来的同名成员abstract表示这是一个抽象类,该类含有抽象成员,因此不能被实例化,只能用作基类sealed表示这是一个密封类,不能从这个类再派生出其他类。显然密封类不能同时为抽象类示例:class Student / 类主体6病原体侵入机体,消弱机体防御机能,破坏机体内环境的相对稳定性,且在一定部位生长繁殖,引起不同程度的病理生理过程3.2.2 类的成员类的成员类体(类主体)用于定义该类的成员类体(类主体)用于定义该类的成员 用一对花括号用一对花括号 括起来,由两部分组成:括起来,由两部分组成: 1. 类体中以类成员声明形式引入的类成员类体中以类成员声明形式引入的类成员 包括:常数声明、字段声明、方法声明、包括:常数声明、字段声明、方法声明、属性声明、事件声明、索引器声明、运算符声属性声明、事件声明、索引器声明、运算符声明、构造函数声明、析构函数声明、静态构造明、构造函数声明、析构函数声明、静态构造函数、类型声明等函数、类型声明等 2. 直接从基类继承而来的成员直接从基类继承而来的成员7病原体侵入机体,消弱机体防御机能,破坏机体内环境的相对稳定性,且在一定部位生长繁殖,引起不同程度的病理生理过程一、成员类型:一、成员类型:(1)静态成员)静态成员 在字段、方法、属性、事件、运算符和构造函数在字段、方法、属性、事件、运算符和构造函数声明中含有声明中含有public static修饰符修饰符(2)实例成员)实例成员 在字段、方法、属性、事件、运算符和构造函数在字段、方法、属性、事件、运算符和构造函数声明中不含有声明中不含有public static修饰符修饰符二、默认成员访问修饰符二、默认成员访问修饰符private 类成员注意点:类成员注意点:8病原体侵入机体,消弱机体防御机能,破坏机体内环境的相对稳定性,且在一定部位生长繁殖,引起不同程度的病理生理过程class Program class AClass public static int x=1; public int y=2; static void Main(string args) AClass ab = new AClass(); Console.WriteLine(y=0,x=1,ab.y,AClass.x); 9病原体侵入机体,消弱机体防御机能,破坏机体内环境的相对稳定性,且在一定部位生长繁殖,引起不同程度的病理生理过程1常数声明常数声明语法形式:语法形式:属性集信息属性集信息 常数修饰符常数修饰符 const 类型类型 标识标识符符 = 常数表达式常数表达式 , 常数修饰符常数修饰符 new、public、protected、 private 、 internal public:访问不受限制:访问不受限制 protected:访问仅限于包含类或从包含类派生的:访问仅限于包含类或从包含类派生的类型类型 internal:访问仅限于当前程序集。:访问仅限于当前程序集。 private:访问仅限于包含类。:访问仅限于包含类。类型类型sbyte、byte、short、ushort、int、uint、long、ulong、char、float、double、decimal、bool、string、枚举类型或引用类型。常数表达式的值类型、枚举类型或引用类型。常数表达式的值类型应与目标类型一致,或者通过隐式转换规则转换成目标应与目标类型一致,或者通过隐式转换规则转换成目标类型。类型。10病原体侵入机体,消弱机体防御机能,破坏机体内环境的相对稳定性,且在一定部位生长繁殖,引起不同程度的病理生理过程例如:例如:class A_const public const int X=10; const double PI=3.14159; / 默认访问修饰符默认访问修饰符private const double Y= 0.618+3.14;注意注意1. 常数表达式的值是一个可以在编译时计算的值常数表达式的值是一个可以在编译时计算的值注意注意2. 常数声明不允许使用常数声明不允许使用static修饰符,只能通过类访问修饰符,只能通过类访问。class Test public static void Main( ) A_const m = new A_const ( ); Console.WriteLine (“X=0, PI=1,Y=2”, A_const.X , A_const.PI, A_const.Y); 11病原体侵入机体,消弱机体防御机能,破坏机体内环境的相对稳定性,且在一定部位生长繁殖,引起不同程度的病理生理过程2字段声明字段声明语法形式语法形式:属性集信息属性集信息 字段修饰符字段修饰符 类型类型 变量声明列表;变量声明列表;1.变量声明列表变量声明列表标识符或用逗号标识符或用逗号“,”分隔的多个标分隔的多个标识符,并且变量标识符还可用赋值号识符,并且变量标识符还可用赋值号“=”设定初始值。设定初始值。2.字段修饰符字段修饰符new、public、protected、private、 internal、 static、readonly、volatilestatic: 静态变量。利用类直接访问静态变量,静态变量。利用类直接访问静态变量, 利用类的实例(对象)访问非静态变量利用类的实例(对象)访问非静态变量readonly:只读变量,声明时或在构造函数中赋值,一:只读变量,声明时或在构造函数中赋值,一旦赋值不可改变。与旦赋值不可改变。与const常量不同,常量不同,const常量编常量编译时赋值计算。译时赋值计算。volatile:表示字段可能被多个并发执行的进程修改。:表示字段可能被多个并发执行的进程修改。12病原体侵入机体,消弱机体防御机能,破坏机体内环境的相对稳定性,且在一定部位生长繁殖,引起不同程度的病理生理过程【例【例3.1】 通过构造函数给只读字段赋值通过构造函数给只读字段赋值using System;public class Area public readonly double Radius; / Radius是只读字段是只读字段 private double x, y ; public double Size ; public static double Sum=0.0 ; public Area ( ) Radius=1.0; / 通过构造函数对通过构造函数对radius赋值赋值 class Test public static void Main( ) Area s1 = new Area( ); /s1.Radius = 2; Console.WriteLine (Radius=0, Size=1,Sum=2,s1.Radius,s1.Size , Area.Sum);/ 静态字段通过类访问静态字段通过类访问Area.Sum,实例字段通过对象访问,实例字段通过对象访问s1.Size Console.Read (); 出错了出错了! !无法修改只读字段无法修改只读字段13病原体侵入机体,消弱机体防御机能,破坏机体内环境的相对稳定性,且在一定部位生长繁殖,引起不同程度的病理生理过程3.2.3 构造函数和析构函数构造函数和析构函数1构造函数构造函数(1) 实现对象初始化实现对象初始化(2) 分为分为实例构造函数实例构造函数和和静态构造函数静态构造函数(3) 函数调用时机:函数调用时机:new1)实例构造函数的声明)实例构造函数的声明语法形式语法形式:属性集信息属性集信息 构造函数修饰符构造函数修饰符 标识符标识符 ( 参数列表参数列表 ) : base ( 参数列表参数列表 ) : this ( 参数列表参数列表 ) 构造函数语句块构造函数语句块 public与类名相同与类名相同没有返回值没有返回值构造函数重载:构造函数重载:参数个数或类型不同参数个数或类型不同调用基类同参数列表的构造函数调用基类同参数列表的构造函数调用本类同参数列表的构造函数调用本类同参数列表的构造函数14病原体侵入机体,消弱机体防御机能,破坏机体内环境的相对稳定性,且在一定部位生长繁殖,引起不同程度的病理生理过程1.构造函数修饰符构造函数修饰符public、protected、internal、private、extern一般地,构造函数总是一般地,构造函数总是public类型的。类型的。如果是如果是private类型的,表明类不能被外部类实例化。类型的,表明类不能被外部类实例化。 2.标识符(标识符(参数列表参数列表 opt)构造函数名构造函数名必须与这个类同名,无返回类型和返回值必须与这个类同名,无返回类型和返回值 构造函数可以有构造函数可以有0n个参数个参数构造函数重载构造函数重载 3. 用用new运算符创建一个类的对象时,类名后的一对圆运算符创建一个类的对象时,类名后的一对圆括号提供初始化列表,系统根据这个初始化列表的参括号提供初始化列表,系统根据这个初始化列表的参数个数、参数类型和参数顺序调用不同的构造函数。数个数、参数类型和参数顺序调用不同的构造函数。实例构造函数注意点:实例构造函数注意点:15病原体侵入机体,消弱机体防御机能,破坏机体内环境的相对稳定性,且在一定部位生长繁殖,引起不同程度的病理生理过程class Test static void Main() Time t1, t2, t3, t4 ; / 对对t1, t2, t3, t4分别调用分别调用不同的构造函数不同的构造函数 t1= new Time (); t2 = new Time(8); t3 = new Time(8, 30); t4 = new Time(8,30,30); 【例【例3.2】 Time类的构造函数及其重载类的构造函数及其重载using System;public class Time private int hour, minute, second; public Time ( ) hour=minute=second=0; public Time (int h) hour=h; minute=second=0; public Time (int h, int m) hour=h; minute=m; second=0; public Time (int h, int m, int s) hour=h; minute=m; second=s; public string getTime()return hour.ToString()+:+minute.ToString()+:+second.ToString();Console.WriteLine(t1=0,t1.getTime();16病原体侵入机体,消弱机体防御机能,破坏机体内环境的相对稳定性,且在一定部位生长繁殖,引起不同程度的病理生理过程【例【例3.3】 构造函数初始化构造函数初始化using System;class Point public double x, y; public Point( ) x = 0; y = 0; public Point(double x, double y) this.x = x; / 当当this在实例构造函数中使用时,在实例构造函数中使用时, this.y = y; / 它的值就是对该构造的对象的引用它的值就是对该构造的对象的引用class Test public static void Main( ) Point a = new Point( ); Point b = new Point(3, 4);/ 用构造函数初始化对象用构造函数初始化对象 Console.WriteLine (a.x=0, a.y=1, a.x, a.y ); Console.WriteLine (b.x=0, b.y=1, b.x, b.y ); Console.Read (); a.x=0, a.y=0b.x=3, b.y=417病原体侵入机体,消弱机体防御机能,破坏机体内环境的相对稳定性,且在一定部位生长繁殖,引起不同程度的病理生理过程构造函数注意点:构造函数注意点:1.若类中没有提供构造函数,则若类中没有提供构造函数,则CLR会会自动提供一个默认的构造函数自动提供一个默认的构造函数2.一旦类中提供了自定义的构造函数,一旦类中提供了自定义的构造函数,系统则不提供默认的构造函数系统则不提供默认的构造函数3.不必显示调用构造函数不必显示调用构造函数4.实例构造函数不能被继承实例构造函数不能被继承18病原体侵入机体,消弱机体防御机能,破坏机体内环境的相对稳定性,且在一定部位生长繁殖,引起不同程度的病理生理过程派生类构造函数的调用派生类构造函数的调用1.调用时机:创建派生类的对象时,即调用时机:创建派生类的对象时,即 new2.构造函数不被继承构造函数不被继承3.派生类构造函数在执行前,派生类构造函数在执行前,1.首先显式或隐式地调用基类构造函数首先显式或隐式地调用基类构造函数4.默认调用基类的无参数构造函数默认调用基类的无参数构造函数1.除非显式地指定调用有参数构造函数除非显式地指定调用有参数构造函数5.this关键字引用类的当前实例关键字引用类的当前实例6.base关键字用于从派生类中访问基类的成员关键字用于从派生类中访问基类的成员1.调用基类上已被其他方法重写的方法调用基类上已被其他方法重写的方法2.指定创建派生类实例时应调用的基类构造函数指定创建派生类实例时应调用的基类构造函数19病原体侵入机体,消弱机体防御机能,破坏机体内环境的相对稳定性,且在一定部位生长繁殖,引起不同程度的病理生理过程【例【例3.4】 派生类构造函数及其调用派生类构造函数及其调用using System;class Point private int x, y; public Point() x = 0; y = 0; Console.WriteLine (Point() constructor : 0 , this ); public Point(int x, int y) this.x = x; this.y = y; Console.WriteLine (Point(x,y) constructor : 0 , this ); class Circle : Point private double radius; public Circle () / 默认约定调用基类的无参构造函数默认约定调用基类的无参构造函数Point() Console.WriteLine (Circle () constructor : 0 , this ); public Circle (double radius ): base ( ) this.radius = radius; Console.WriteLine (Circle (radius) constructor : 0 , this ); public Circle (int x, int y, double radius ): base (x, y ) this.radius = radius; Console.WriteLine (Circle (x, y, radius) constructor : 0 , this ); class Test static void Main() Point a = new Point(); Circle b = new Circle (3.5); Circle c = new Circle (1, 1, 4.8);Console.Read (); 1325420病原体侵入机体,消弱机体防御机能,破坏机体内环境的相对稳定性,且在一定部位生长繁殖,引起不同程度的病理生理过程2)静态构造函数的声明)静态构造函数的声明语法形式语法形式:属性集信息属性集信息 静态构造函数修饰符静态构造函数修饰符 标识符标识符()静态构造函数体静态构造函数体 静态构造函数修饰符静态构造函数修饰符 extern static 或者或者static extern 。如有。如有extern修饰,则是一个外部静态构造函修饰,则是一个外部静态构造函数,不提供任何实际的实现,静态构造函数体仅仅是一数,不提供任何实际的实现,静态构造函数体仅仅是一个分号个分号 标识符标识符 是静态构造函数名,必须与类同名且不能是静态构造函数名,必须与类同名且不能有参数有参数 静态构造函数体静态构造函数体只能对静态数据成员进行初始化只能对静态数据成员进行初始化21病原体侵入机体,消弱机体防御机能,破坏机体内环境的相对稳定性,且在一定部位生长繁殖,引起不同程度的病理生理过程1.静态构造函数不可继承,不能直接调用静态构造函数不可继承,不能直接调用2.调用时机:调用时机:1) 创建类的实例创建类的实例2) 引用类的任何静态成员引用类的任何静态成员3.至多被执行一次至多被执行一次4.若类没有声明静态构造函数,而又包含若类没有声明静态构造函数,而又包含带有初始设定的静态字段时,编译器会带有初始设定的静态字段时,编译器会自动生成一个默认的静态构造函数自动生成一个默认的静态构造函数静态构造函数注意点:静态构造函数注意点:22病原体侵入机体,消弱机体防御机能,破坏机体内环境的相对稳定性,且在一定部位生长繁殖,引起不同程度的病理生理过程2析构函数析构函数语法形式:属性集信息属性集信息 extern 标识符标识符 ( ) 析构函数体析构函数体 标识符标识符必须与类名相同,前面需加必须与类名相同,前面需加“” 析构函数析构函数不能写返回类型,也不能带参不能写返回类型,也不能带参数,一个类最多只能有一个析构函数数,一个类最多只能有一个析构函数23病原体侵入机体,消弱机体防御机能,破坏机体内环境的相对稳定性,且在一定部位生长繁殖,引起不同程度的病理生理过程析构函数注意点析构函数注意点1.析构函数不能由程序显式地调用,析构函数不能由程序显式地调用,而是由系统在释放对象时自动调用而是由系统在释放对象时自动调用2.派生类对象的析构函数调用链:派生类对象的析构函数调用链:1)执行派生类的析构函数)执行派生类的析构函数2)执行基类的析构函数,直到调)执行基类的析构函数,直到调用用object类的析构函数为止类的析构函数为止与执行构造函数的顺序相反与执行构造函数的顺序相反24病原体侵入机体,消弱机体防御机能,破坏机体内环境的相对稳定性,且在一定部位生长繁殖,引起不同程度的病理生理过程第第3章章 面向对象编程基础面向对象编程基础1. 理解基本概念理解基本概念2. 理解理解类类3. 使用构造函数使用构造函数4. 学习学习方法方法5. 学习学习属性属性掌握掌握25病原体侵入机体,消弱机体防御机能,破坏机体内环境的相对稳定性,且在一定部位生长繁殖,引起不同程度的病理生理过程回顾回顾l对象对象 具有属性和操作(方法)的实体具有属性和操作(方法)的实体l类类 对象的抽象,抽象的数据类型对象的抽象,抽象的数据类型l类是对象的模板类是对象的模板l对象是类的具体化对象是类的具体化 或或 类的实例类的实例26病原体侵入机体,消弱机体防御机能,破坏机体内环境的相对稳定性,且在一定部位生长繁殖,引起不同程度的病理生理过程类的成员类的成员l1.类体中以类成员声明形式引入的类成员类体中以类成员声明形式引入的类成员l包括:常数声明、字段声明、构造函数声明、包括:常数声明、字段声明、构造函数声明、析构函数声明、静态构造函数、方法声明、析构函数声明、静态构造函数、方法声明、属性声明等属性声明等l2. 直接从基类继承而来的成员直接从基类继承而来的成员27病原体侵入机体,消弱机体防御机能,破坏机体内环境的相对稳定性,且在一定部位生长繁殖,引起不同程度的病理生理过程访问修饰符访问修饰符lpublicl访问不受限制访问不受限制lprotectedl只能被本身或派生类的实例访问只能被本身或派生类的实例访问lprivatel只能被本身访问只能被本身访问lstaticl静态,非实例静态,非实例28病原体侵入机体,消弱机体防御机能,破坏机体内环境的相对稳定性,且在一定部位生长繁殖,引起不同程度的病理生理过程构造函数构造函数l构造函数构造函数实例构造函数实例构造函数l与类名同名与类名同名l在类进行在类进行new运算(即类实例化时)运算(即类实例化时)lthis :引用当前类的实例:引用当前类的实例lbase:用于从派生类中访问基类的成员:用于从派生类中访问基类的成员l调用基类上已被其他方法重写的方法调用基类上已被其他方法重写的方法l指定创建派生类实例时应该调用的基类构造函数指定创建派生类实例时应该调用的基类构造函数l调用顺序调用顺序l先基类后派生类先基类后派生类29病原体侵入机体,消弱机体防御机能,破坏机体内环境的相对稳定性,且在一定部位生长繁殖,引起不同程度的病理生理过程3.3 方法方法3.3.1 方法的声明语法形式:属性集信息属性集信息 方法修饰符方法修饰符 返回类型返回类型 方法名方法名 ( 形参表形参表 ) 方法体方法体1. C#中所有的变量、方法都必须封装在类中中所有的变量、方法都必须封装在类中2. 对象间、类间只能通过类所提供的方法进行互操作对象间、类间只能通过类所提供的方法进行互操作3. 从方法的声明、方法的参数、静态方法与实例方法、从方法的声明、方法的参数、静态方法与实例方法、方法的重载与覆盖等方面理解方法的重载与覆盖等方面理解30病原体侵入机体,消弱机体防御机能,破坏机体内环境的相对稳定性,且在一定部位生长繁殖,引起不同程度的病理生理过程表3.2 方法修饰符修修 饰 符符作作 用用 说 明明new在一个在一个继承承结构中,用于构中,用于隐藏基藏基类同名的方法同名的方法public表示表示该方法可以在任何地方被方法可以在任何地方被访问,默默认publicprotected表示表示该方法可以在它的方法可以在它的类体或派生体或派生类类体中被体中被访问,但不能在,但不能在类体外体外访问private表示表示该方法只能在方法只能在这个个类体内被体内被访问internal表示表示该方法可以被同方法可以被同处于一个工程的文件(程序集)于一个工程的文件(程序集)访问static表示表示该方法属于方法属于类本身,而不属于某特定本身,而不属于某特定对象象virtual表示表示该方法可在派生方法可在派生类中重写,来更改中重写,来更改该方法的方法的实现abstract表示表示该方法方法仅仅定定义了方法名及了方法名及执行方式,但没有行方式,但没有给出具体出具体实现,所以包含所以包含这种方法的种方法的类是抽象是抽象类,有待于派生,有待于派生类的的实现override表示表示该方法是将从基方法是将从基类继承的承的virtual方法的新方法的新实现sealed表示表示这是一个密封方法,它必是一个密封方法,它必须同同时包含包含override修修饰,以防止它,以防止它的派生的派生类进一步重写一步重写该方法方法extern表示表示该方法从外部方法从外部实现31病原体侵入机体,消弱机体防御机能,破坏机体内环境的相对稳定性,且在一定部位生长繁殖,引起不同程度的病理生理过程表表3.3 修饰符的无效组合修饰符的无效组合修修 饰 符符不能与下列不能与下列选项一起使用一起使用staticvirtual、abstract 和和 overridevirtualstatic、abstract 和和 overrideoverridenew、static 和和 virtualabstractvirtual 和和 staticnewoverrideexternabstract返回类型返回类型方法可以返回值也可以不返回值。返回值类型为任意一种C#的数据类型,通过return语句返回。如果方法不返回值,则它的返回类型可标为void,默认情况下为 void方法名方法名:除 Main()、关键字以外32病原体侵入机体,消弱机体防御机能,破坏机体内环境的相对稳定性,且在一定部位生长繁殖,引起不同程度的病理生理过程【例例3.6】 下面程序中的StackTp类定义了几个方法以模拟实现一个压栈操作。using System;class StackTp int MaxSize; int Top; int StkList; public StackTp ( ) / 构造函数构造函数 MaxSize=100; Top=0; StkList=new int MaxSize; public StackTp(int size) / 构造函数构造函数 MaxSize=size; Top=0; StkList=new int MaxSize; public bool isEmptyStack() / 方法方法 if (Top=0) return true; else return false; public bool isFullStack() if (Top=MaxSize) return true; else return false; public void push(int x) StkListTop=x; Top+; class Test public static void Main() StackTp ST = new StackTp(20); string s1; if (ST.isEmptyStack() ) / 调用方法调用方法 s1=Empty; else s1=not Empty; Console.WriteLine (Stack is + s1); for (int i=0; iy) tmp=x; x=y; y=tmp; if (xz) tmp=x; x=z; z=tmp; if (yz) tmp=y; y=z; z=tmp; /Console.WriteLine(“x=0, y=1, z=2 x,y,z); class Test static void Main() Myclass m = new Myclass ( ); int a, b, c; a=30; b=20; c=10; m.Sort (a, b, c); Console.WriteLine (a=0, b=1, c=2 , a, b, c ); Console.Read (); 【例例3.7】 演示了当方法Sort传递的是值参数时,对形参的修改不影响其实参。35病原体侵入机体,消弱机体防御机能,破坏机体内环境的相对稳定性,且在一定部位生长繁殖,引起不同程度的病理生理过程是值参数传递方式,形参另外分配一块内存,是值参数传递方式,形参另外分配一块内存,接受实参的引用值副本接受实参的引用值副本1. 对引用值的修改不会影响实参对引用值的修改不会影响实参2. 如果改变的是所引用的对象,则将会影如果改变的是所引用的对象,则将会影响实参所引用的对象响实参所引用的对象值参数值参数传递传递引用对象引用对象内存首地址内存首地址36病原体侵入机体,消弱机体防御机能,破坏机体内环境的相对稳定性,且在一定部位生长繁殖,引起不同程度的病理生理过程using System;class Myclass public void SortArray (int a) int i, j, pos,tmp; for (i=0; ia.Length 1 ; i+) for (pos=j=i; ja j) pos=j; if (pos != i ) tmp=ai;ai=apos;apos=tmp; class Test static void Main() Myclass m = new Myclass ( ); int score = 87,89,56,90,100,75,64,45, 80, 84 ; m.SortArray(score); for ( int i=0; iy) tmp=x; x=y; y=tmp; if (xz) tmp=x; x=z; z=tmp; if (yz) tmp=y; y=z; z=tmp; /Console.WriteLine(“x=0, y=1, z=2 x,y,z); class Test static void Main() Myclass m = new Myclass ( ); int a, b, c; a=30; b=20; c=10; m.Sort (a, b, c); Console.WriteLine (a=0, b=1, c=2 , a, b, c ); Console.Read (); 【例例3.7】 演示了当方法Sort传递的是值参数时,对形参的修改不影响其实参。39病原体侵入机体,消弱机体防御机能,破坏机体内环境的相对稳定性,且在一定部位生长繁殖,引起不同程度的病理生理过程2. 引用参数引用参数引用参数引用参数形参的改变形参的改变影响影响实参实参1.例例3.7中中 实际变量实际变量a、b、c是不随形参是不随形参x、y、z的,但的,但如果想改变实际变量如果想改变实际变量a、b、c的值,则用引用参数的值,则用引用参数2.C#用用ref修饰符修饰符 声明声明 引用参数引用参数3.引用参数不创建新的存储单元,与方法调用中的实际引用参数不创建新的存储单元,与方法调用中的实际参数变量同处一个存储单元参数变量同处一个存储单元传递内存地址传递内存地址4.属于输入参数属于输入参数40病原体侵入机体,消弱机体防御机能,破坏机体内环境的相对稳定性,且在一定部位生长繁殖,引起不同程度的病理生理过程【例【例3.9】 将例将例3.7程序中程序中Sort方法的值参数传递方式改成引用参数传递,这方法的值参数传递方式改成引用参数传递,这样在方法样在方法Sort中对参数中对参数x、y、z按从小到大的排序影响了调用它的实参按从小到大的排序影响了调用它的实参a、b、c。using System;class Myclass public void Sort (ref int x, ref int y, ref int z) int tmp; / tmp是方法是方法Sort的局部变量的局部变量 / 将将x, y, z按从小到大排序按从小到大排序 if (xy) tmp=x; x=y; y=tmp; if (xz) tmp=x; x=z; z=tmp; if (yz) tmp=y; y=z; z=tmp; class Test static void Main() Myclass m = new Myclass ( ); int a, b, c; a=30; b=20; c=10; m.Sort (ref a, ref b, ref c); Console.WriteLine (a=0, b=1, c=2 , a, b, c ); Console.Read(); 41病原体侵入机体,消弱机体防御机能,破坏机体内环境的相对稳定性,且在一定部位生长繁殖,引起不同程度的病理生理过程使用使用ref声明引用参数的注意:声明引用参数的注意:(1)方法的参数声明中)方法的参数声明中ref关键字仅对关键字仅对紧跟紧跟在它后面的在它后面的参数有效,而不能应用于整个参数表。参数有效,而不能应用于整个参数表。例如,例如,Sort方法中方法中x、y、z都要加都要加ref修饰修饰(2)在方法的调用中也要用)在方法的调用中也要用refref修饰实参修饰实参,且实参必,且实参必须为变量,实参和形参的数据类型必须完全匹配须为变量,实参和形参的数据类型必须完全匹配(3)在方法外(方法调用前),)在方法外(方法调用前),ref参数参数必须明确赋值必须明确赋值(4) ref参数也可以用于传递引用类型的对象参数也可以用于传递引用类型的对象42病原体侵入机体,消弱机体防御机能,破坏机体内环境的相对稳定性,且在一定部位生长繁殖,引起不同程度的病理生理过程第第3章章 面向对象编程基础面向对象编程基础l方法声明方法声明如同如同C语言的语言的“函数函数”l访问修饰符默认为访问修饰符默认为publicl方法参数方法参数l值参数(值类型、引用类型)值参数(值类型、引用类型)l引用参数引用参数refl输出参数输出参数outl参数数组参数数组paramsl方法方法43病原体侵入机体,消弱机体防御机能,破坏机体内环境的相对稳定性,且在一定部位生长繁殖,引起不同程度的病理生理过程l方法重载与覆盖方法重载与覆盖l方法签名方法签名l方法覆盖方法覆盖new 和和 虚方法虚方法virtual overridel属性属性propertylget访问器访问器lset访问器访问器44病原体侵入机体,消弱机体防御机能,破坏机体内环境的相对稳定性,且在一定部位生长繁殖,引起不同程度的病理生理过程3. 输出参数输出参数1. 用法与用法与ref参数相似参数相似, 但为但为输出参数值输出参数值2. 只能用于从方法中传出值,只能用于从方法中传出值,因此必须在方法结束之前因此必须在方法结束之前对对out参数赋值参数赋值3. 在参数前加在参数前加out修饰符的形式参数修饰符的形式参数4. out参数也可以用于传递引用类型的对象参数也可以用于传递引用类型的对象45病原体侵入机体,消弱机体防御机能,破坏机体内环境的相对稳定性,且在一定部位生长繁殖,引起不同程度的病理生理过程class Test static void Main() Myclass m = new Myclass ( ); int score = 87,89,56,90,100,75,64,45, 80, 84 ; int smax, smin; double savg; m.MaxMinArray(score, out smax, out smin, out savg); Console.Write (Max=0, Min=1, Avg=2 , smax, smin, savg ); Console.Read (); 【例【例3.10】 求一个数组中元素的最大值、最小值和平均值。求一个数组中元素的最大值、最小值和平均值。using System;class Myclass public void MaxMinArray (int a, out int max, out int min, out double avg ) int sum ; sum = max = min = a0 ;for (int i=1; imax) max=ai; if (aimin) min=ai; sum+=ai;avg=sum / a.Length; 46病原体侵入机体,消弱机体防御机能,破坏机体内环境的相对稳定性,且在一定部位生长繁殖,引起不同程度的病理生理过程【例【例3.11】 下面程序定义了两个方法,一个是下面程序定义了两个方法,一个是Swap1,一个是,一个是Swap2,它,它们都有两个引用对象作为参数,但们都有两个引用对象作为参数,但Swap2的参数加了的参数加了ref修饰,调用这两个方修饰,调用这两个方法产生的结果是不一样的。法产生的结果是不一样的。using System;class Myclass public void Swap1 (string s, string t) string tmp; tmp=s; s=t; t=tmp; public void Swap2 (ref string s, ref string t) string tmp; tmp=s; s=t; t=tmp; class Test static void Main() Myclass m = new Myclass ( ); string s1=ABCDEFG, string s2=134567; m.Swap1(s1,s2); Console.WriteLine (s1=0 , s1 ); Console.WriteLine (s2=0 , s2 ); m.Swap2(ref s1, ref s2); Console.WriteLine (s1=0 , s1 ); Console.WriteLine (s2=0 , s2 ); Console.Read (); s1,s2的引用的引用并没有改变并没有改变s1,s2的引用的引用互相交换了互相交换了47病原体侵入机体,消弱机体防御机能,破坏机体内环境的相对稳定性,且在一定部位生长繁殖,引起不同程度的病理生理过程4参数数组参数数组3.3.3 静态方法与实例方法静态方法与实例方法特点:特点:参数为可变长度参数为可变长度 使用使用params关键字来指定一个可变长度的参数表关键字来指定一个可变长度的参数表注意:注意:1. 一个方法中只能声明一个一个方法中只能声明一个params参数参数2. params参数必须放在参数表最后参数必须放在参数表最后3. params参数是一个一维数组,参数数组的参数:参数是一个一维数组,参数数组的参数:0n4. params不可与不可与ref、out修饰符组合使用修饰符组合使用1. 静态方法用静态方法用static修饰修饰2. 只能访问类中的静态成员只能访问类中的静态成员48病原体侵入机体,消弱机体防御机能,破坏机体内环境的相对稳定性,且在一定部位生长繁殖,引起不同程度的病理生理过程【例例3.12】 下面程序演示了Myclass类中的方法MaxMin有一个参数数组类型的参数,在调用这个方法时具有灵活性。using System;class Myclass public void MaxMin (out int max, out int min, params int a ) / 如果可变参数为零个,如果可变参数为零个, / 取一个约定值或产生异常取一个约定值或产生异常 if (a.Length=0) max=min= 1; return ; max = min = a0 ; for (int i=1; imax) max=ai;if (ai=y ? x : y ; public double max (double x, double y) return x=y ? x : y ; public int max (int x, int y, int z) return max ( max (x, y), z) ; public double max ( double x, double y, double z) return max ( max (x, y), z) ; class Test static void Main() Myclass m = new Myclass ( ); int a, b, c; double e, f, g ; a=10; b=20; c=30; e = 1.5; f = 3.5 ; g = 5.5; Console.WriteLine (max(0,1)= 2 ,a,b, m.max(a,b); Console.WriteLine (max(0,1,2)= 3 ,a,b,c, m.max(a,b,c); Console.WriteLine (max(0,1)= 2 , e,f,m.max(e,f); Console.WriteLine (max(0,1,2)= 3 ,e,f,g, m.max(e,f,g); Console.Read (); 51病原体侵入机体,消弱机体防御机能,破坏机体内环境的相对稳定性,且在一定部位生长繁殖,引起不同程度的病理生理过程方法的方法的覆盖覆盖使用使用new隐藏有相同签名的方法隐藏有相同签名的方法1. 当派生类与基类有相同名称或签名的成员时,当派生类与基类有相同名称或签名的成员时,在派生类中默认隐藏基类成员,但提示警告在派生类中默认隐藏基类成员,但提示警告2. 在派生类成员声明中加在派生类成员声明中加new修饰符,可以取消修饰符,可以取消警告信息警告信息3. 基类对象被引用到派生类对象时,基类对象被引用到派生类对象时,访问访问的仍是的仍是基类的方法基类的方法静态多态静态多态52病原体侵入机体,消弱机体防御机能,破坏机体内环境的相对稳定性,且在一定部位生长繁殖,引起不同程度的病理生理过程【例【例3.15】 定义了一个基类定义了一个基类Shape,含有字段域,含有字段域width和和height,分别表示形状的宽和高,并定义,分别表示形状的宽和高,并定义了一个了一个area方法,求形状的面积。它的派生类方法,求形状的面积。它的派生类Triangle和和Trapezia都用关键字都用关键字new修饰了修饰了area方法方法using System;class Shape protected double width; protected double height; public Shape( ) width=height=0; public Shape(double x) width=height=x; public Shape(double w, double h ) width=w;height=h; public double area ( ) return width*height; class Triangle : Shape / 三角形三角形 public Triangle (double x, double y):base(x,y) new public double area ( ) / 派生类方法与基类方法同名,编译时会有警告信息派生类方法与基类方法同名,编译时会有警告信息 return width*height/2 ; class Trapezia : Shape / 梯形梯形 double width2 ; public Trapezia(double w1, double w2, double h) : base (w1, h) width2=w2; new public double area ( ) / 加加new隐藏基类的隐藏基类的area方法方法 return (width+width2)*height/2 ; class Test static void Main() Shape A = new Shape(2, 4); Triangle B = new Triangle(1, 2); Trapezia C = new Trapezia(2, 3, 4); Console.WriteLine(A.area= 0 , A.area(); / 调调Shape的的area方法方法 Console.WriteLine(B.area= 0 , B.area(); / 调调Triangle的的area方法方法 Console.WriteLine(C.area= 0 , C.area(); / 调调Trapezia的的area方法方法 A = B; / 在在C#中,基类的引用也能够引用派生类对象中,基类的引用也能够引用派生类对象 Console.WriteLine(A.area= 0 , A.area(); / 调调Shape的的area方法方法 A = C; Console.WriteLine(A.area= 0 , A.area(); / 调调Shape的的area方法方法 Console.Read(); 基类基类方法方法53病原体侵入机体,消弱机体防御机能,破坏机体内环境的相对稳定性,且在一定部位生长繁殖,引起不同程度的病理生理过程1.虚方法:基类的方法用关键字virtual修饰2.对基类的虚方法重载:派生类用关键字override修饰与基类中虚方法有相同签名的方法注意:注意:(1)不能将虚方法声明为静态的)不能将虚方法声明为静态的(static)(2)不能将虚方法声明为私有的)不能将虚方法声明为私有的(private)(3)覆盖方法必须与它相关的虚方法匹配)覆盖方法必须与它相关的虚方法匹配(4)一个覆盖方法覆盖的必须是虚方法)一个覆盖方法覆盖的必须是虚方法实现运行时多态(实现运行时多态(动态绑定动态绑定)54病原体侵入机体,消弱机体防御机能,破坏机体内环境的相对稳定性,且在一定部位生长繁殖,引起不同程度的病理生理过程【例【例3.16】 将例将例3.15改写,改写,Shape类中的方法类中的方法area用用virtual修饰,而派生类修饰,而派生类Triangle和和Trapezia用用override修饰修饰area方法。方法。using System;class Shape protected double width; protected double height; public Shape( ) width=height=0; public Shape(double x) width=height=x; public Shape(double w, double h ) width=w; height=h; public virtual double area ( ) / 基类中用基类中用virtual修饰符声明一个虚方法修饰符声明一个虚方法 return width*height; class Triangle: Shape / 三角形三角形 public Triangle (double x, double y):base(x,y) public override double area ( ) / 派生类中用派生类中用override修饰符覆盖基类虚方法修饰符覆盖基类虚方法 return width*height/2 ; class Trapezia : Shape / 梯形梯形 double width2 ; public Trapezia(double w1, double w2, double h) : base (w1, h) width2=w2; public override double area ( ) 派生类中用派生类中用override修饰符覆盖基类虚方法修饰符覆盖基类虚方法 return (width+width2)*height/2 ; class Test static void Main() Shape A = new Shape(2, 4); Triangle B = new Triangle(1, 2); Trapezia C = new Trapezia(2, 3, 4); Console.WriteLine(A.area= 0 , A.area(); / 调调Shape的的area方法方法 Console.WriteLine(B.area= 0 , B.area(); / 调调Triangle的的area方法方法 Console.WriteLine(C.area= 0 , C.area(); / 调调Trapezia的的area方法方法 A = B; Console.WriteLine(A.area= 0 , A.area(); / 调派生类调派生类Triangle的的area方法方法 A = C; Console.WriteLine(A.area= 0 , A.area(); / 调调派生类派生类 Trapezia的的area方法方法 Console.Read(); 派生类派生类方法方法55病原体侵入机体,消弱机体防御机能,破坏机体内环境的相对稳定性,且在一定部位生长繁殖,引起不同程度的病理生理过程3.4 属性属性property1. 回顾一下回顾一下 例例3.2(P51)。)。为了实现良好的数据封装和数据隐藏,为了实现良好的数据封装和数据隐藏,类的类的字段字段成员的访问属性一般设置成成员的访问属性一般设置成private(默认)或(默认)或protected利用利用public 方法方法来访问私有的或受来访问私有的或受保护的字段保护的字段56病原体侵入机体,消弱机体防御机能,破坏机体内环境的相对稳定性,且在一定部位生长繁殖,引起不同程度的病理生理过程 public string getTime() return hour.ToString()+:+minute.ToString()+:+second.ToString(); 【例例3.2】 Time类的构造函数及其重载using System;public class Time private int hour, minute, second; public Time ( ) hour=minute=second=0; public Time (int h) hour=h; minute=second=0; public Time (int h, int m) hour=h; minute=m; second=0; public Time (int h, int m, int s) hour=h; minute=m; second=s; class Test static void Main() Time t1, t2, t3, t4 ; t1= new Time (); t2 = new Time(8); t3 = new Time(8, 30); t4 = new Time(8,30,30); t1.getTime(); t2.getTime(); t3.getTime(); t4.getTime(); 57病原体侵入机体,消弱机体防御机能,破坏机体内环境的相对稳定性,且在一定部位生长繁殖,引起不同程度的病理生理过程3.4 属性属性 1.保持原有的数据封装和数据隐藏,类的字段成员保持原有的数据封装和数据隐藏,类的字段成员的访问属性仍然设置成的访问属性仍然设置成private(默认)或(默认)或protected?2.不利用不利用public方法来访问私有的或受保护的字段方法来访问私有的或受保护的字段 属性(属性(property)属性值的读属性值的读/写与字段域语法相同;写与字段域语法相同;利用利用get和和set访问器实现属性值的读访问器实现属性值的读/写写如何做?如何做?58病原体侵入机体,消弱机体防御机能,破坏机体内环境的相对稳定性,且在一定部位生长繁殖,引起不同程度的病理生理过程语法形式:语法形式:属性集信息属性集信息 属性修饰符属性修饰符 类型类型 成员名成员名 访问器声明访问器声明 属性修饰符属性修饰符与方法修饰符与方法修饰符(public,private,protected,)相同,包括相同,包括new、static、virtual、abstract、override和和4种访问修饰符的合法组合,遵循相同的种访问修饰符的合法组合,遵循相同的规则。规则。 访问器声明访问器声明声明属性的访问器,声明属性的访问器,get访问器或访问器或set访问器,访问器,或者两个或者两个语法形式:语法形式:get / 读访问器读访问器 / 访问器语句块访问器语句块 set / 写访问器写访问器 / 访问器语句块访问器语句块 属性的声明方法属性的声明方法59病原体侵入机体,消弱机体防御机能,破坏机体内环境的相对稳定性,且在一定部位生长繁殖,引起不同程度的病理生理过程1. get访问器访问器1. 返回值类型与属性的类型相同返回值类型与属性的类型相同2. 在语句块中的在语句块中的return语句必须有一个语句必须有一个可隐式转换为属性类型的表达式可隐式转换为属性类型的表达式2. set访问器访问器1. 没有返回值没有返回值2. 有一个隐式的值参数有一个隐式的值参数value,类型与属,类型与属性的类型相同。性的类型相同。3. 属性的种类属性的种类1. 读读/写属性:同时包含写属性:同时包含get和和set访问器访问器的属性的属性2.只读只读/只写属性:只包含只写属性:只包含get或或set访问访问器的属性器的属性属性中的访问器使用注意属性中的访问器使用注意60病原体侵入机体,消弱机体防御机能,破坏机体内环境的相对稳定性,且在一定部位生长繁殖,引起不同程度的病理生理过程【例【例3.17】 对对TextBox类的类的text、fontname、fontsize、multiline域域提供属性方式的读提供属性方式的读/写访问。写访问。using System;class TextBox private string text; private string fontname; private int fontsize; private bool multiline; public TextBox ( ) text=text1; fontname=宋体宋体; fontsize=12; multiline=false; public string Text / Text属性,可读可写属性,可读可写 get return text; set text=value; public string FontName / FontName属性,属性,只读属性只读属性 get return fontname; public int FontSize / FontSize属性,属性,可读可写可读可写 get return fontsize; set fontsize = value; public bool MultiLine / MultiLine属性,属性,只写只写 set multiline = value; class Test static void Main() TextBox Text1= new TextBox (); / 调用调用Text属性的属性的get访问器访问器 Console.WriteLine (Text1.Text= 0 , Text1.Text); Text1.Text = 这是文本框这是文本框 ; / 调用调用Text属性的属性的set访问器访问器 Console.WriteLine (Text1.Text= 0 , Text1.Text); Console.WriteLine (Text1.Fontname= 0 , Text1.FontName); Text1.FontSize=36; Text1.MultiLine = true; Console.WriteLine (Text1.FontSize= 0 , Text1.FontSize); Console.Read (); 61病原体侵入机体,消弱机体防御机能,破坏机体内环境的相对稳定性,且在一定部位生长繁殖,引起不同程度的病理生理过程【例【例3.18】 定义定义Label类,设置类,设置Width和和Heigh属性,分别存放两点之间属性,分别存放两点之间在水平坐标轴和垂直坐标轴上的投影长度。在水平坐标轴和垂直坐标轴上的投影长度。using System;class Point int x, y; public int X get return x; public int Y get return y; public Point ( ) x=y=0; public Point (int x, int y) this.x=x; this.y=y; class Label Point p1=new Point ( ); Point p2=new Point (5, 10); public int Width / 计算两点之间在水平坐标轴上的投影长度计算两点之间在水平坐标轴上的投影长度 get return p2.X p1.X; public int Height /计算两点之间在垂直坐标轴上的投影长度计算两点之间在垂直坐标轴上的投影长度 get return p2.Y p1.Y; class Test static void Main() Label Label1= new Label (); Console.WriteLine (Label1.Width= 0 , Label1.Width); Console.WriteLine (Label1.Height= 0 , Label1.Height); Console.Read (); 62病原体侵入机体,消弱机体防御机能,破坏机体内环境的相对稳定性,且在一定部位生长繁殖,引起不同程度的病理生理过程3.5 综合应用实例综合应用实例【例【例3.19】 学生成绩管理程序。根据学生选修的课程及课程学学生成绩管理程序。根据学生选修的课程及课程学分和课程成绩计算分和课程成绩计算GPA,最后按,最后按GPA的值对学生进行排序。的值对学生进行排序。基本思路:本程序的学生总人数、课程名、课程学分可以基本思路:本程序的学生总人数、课程名、课程学分可以由控制台输入,为叙述简单,假定每个学生所选修的课程由控制台输入,为叙述简单,假定每个学生所选修的课程相同。相同。Course类类中定义了课程名、课程学分字段域,中定义了课程名、课程学分字段域,Name属性、构造函数。属性、构造函数。Student类类中定义中定义 字段字段: 学生姓名、学号、选修课程数、学生姓名、学号、选修课程数、Course类对象数组、成绩和类对象数组、成绩和GPA等等 属性属性: CourseNum静态属性、静态属性、GPA属性、属性、Name属性属性 方法方法: SetCourse方法方法设置课程名,静态方法设置课程名,静态方法AddData方法方法给每个学生加入姓名、学号、成绩。给每个学生加入姓名、学号、成绩。ComputeGPA 方法方法计算学生成绩的计算学生成绩的GPAstuSwap方法方法对两个对两个Student对象内容进行交换。对象内容进行交换。63病原体侵入机体,消弱机体防御机能,破坏机体内环境的相对稳定性,且在一定部位生长繁殖,引起不同程度的病理生理过程class Coursestring courseName; / 课程名课程名 int courseMark; / 课程学分课程学分public Course() public Course(string Name, int Mark)courseName=Name;courseMark=Mark;public string Name / Name属性,课程名可读可写属性,课程名可读可写get return courseName;set courseName=value;public int Mark / Mark属性,课程学分可读可写属性,课程学分可读可写get return courseMark;set courseMark=value; 64病原体侵入机体,消弱机体防御机能,破坏机体内环境的相对稳定性,且在一定部位生长繁殖,引起不同程度的病理生理过程class Studentstring stuName; / 学生姓名学生姓名string stuID; / 学生学号学生学号static int numberOfCourse; static Course list ; int stuScore; /每个学生对象的各课程成绩每个学生对象的各课程成绩double stuGPA; / GPA值值public Student() list=new CoursenumberOfCourse; for (int i=0; inumberOfCourse;i+)listi=new Course();stuScore=new intnumberOfCourse; 加加static修饰符表明这修饰符表明这个域为所有学生类对个域为所有学生类对象共享象共享Course类类对象数组,对象数组,用于设置每用于设置每门课程名、门课程名、课程学分课程学分65病原体侵入机体,消弱机体防御机能,破坏机体内环境的相对稳定性,且在一定部位生长繁殖,引起不同程度的病理生理过程/ 将将CourseNum定义成静态属性是因为它只对静态域进行操作定义成静态属性是因为它只对静态域进行操作public static int CourseNum get return numberOfCourse;set numberOfCourse=value;public double GPA / GPA属性是只读属性属性是只读属性getreturn stuGPA;public string Name / Name属性可读可写属性可读可写get return stuName;setstuName=value;66病原体侵入机体,消弱机体防御机能,破坏机体内环境的相对稳定性,且在一定部位生长繁殖,引起不同程度的病理生理过程/ 将将SetCourse设为静态方法,是因为它仅访问静态数据域设为静态方法,是因为它仅访问静态数据域/ 不需要创建不需要创建Student类对象就可直接用类对象就可直接用Student类名调用类名调用/ 它的形参是一个参数数组,这样调用时就可根据实际选修的课程数来它的形参是一个参数数组,这样调用时就可根据实际选修的课程数来设置设置public static void SetCourse(params Course topic)for (int i=0; itopic.Length ; i+)listi.Name =topici.Name;listi.Mark =topici.Mark;/ AddData方法将一个学生的数据添加到学生类对象数组中方法将一个学生的数据添加到学生类对象数组中public void AddData(string name, string Id, int score)stuName=name;stuID=Id;for (int i=0;iscore.Length; i+)stuScorei=scorei;67病原体侵入机体,消弱机体防御机能,破坏机体内环境的相对稳定性,且在一定部位生长繁殖,引起不同程度的病理生理过程/ 根据课程的学分以及学生成绩计算根据课程的学分以及学生成绩计算GPApublic void ComputeGPA() int i;double sMark, sumMark=0, sumGP=0;for (i=0;i=95) sMark=4.5; else if (stuScorei=90) sMark=4; else if (stuScorei=85) sMark=3.5;else if (stuScorei=80) sMark=3; else if (stuScorei=75) sMark=2.5; else if (stuScorei=70) sMark=2; else if (stuScorei=65) sMark=1.5; else if (stuScorei=60) sMark=1; else sMark=0;sumGP+=listi.Mark*sMark;sumMark+=listi.Mark;stuGPA=sumGP/sumMark;68病原体侵入机体,消弱机体防御机能,破坏机体内环境的相对稳定性,且在一定部位生长繁殖,引起不同程度的病理生理过程/ stuSwap方法提供两个方法提供两个Student类对象的交换操作,注意形参被修饰为类对象的交换操作,注意形参被修饰为refpublic void stuSwap(ref Student stu1, ref Student stu2) string name,Id;int i;int score=new int Student.CourseNum;double gpa;name=stu1.Name;Id=stu1.stuID;gpa=stu1.GPA;for (i=0;iStudent.CourseNum;i+)scorei=stu1.stuScorei;stu1.stuName=stu2.stuName;stu1.stuID=stu2.stuID;stu1.stuGPA=stu2.stuGPA;for (i=0;iStudent.CourseNum;i+)stu1.stuScorei=stu2.stuScorei;stu2.stuName=name;stu2.stuID=Id;stu2.stuGPA=gpa;for (i=0;iStudent.CourseNum;i+)stu2.stuScorei=scorei;静态属性静态属性69病原体侵入机体,消弱机体防御机能,破坏机体内环境的相对稳定性,且在一定部位生长繁殖,引起不同程度的病理生理过程Test类中的类中的MaxMinGPA方法求最大和最小方法求最大和最小GPA值,值,SortGPA方法按学生的方法按学生的GPA值对值对Student类对象数组进行排序。类对象数组进行排序。Test类代码如下:类代码如下:class Test public static void Main() Test T=new Test ();int i,j,Num,Mark;string sline,Name,Id;double sMax,sMin;Console.Write(请输入学生总人数请输入学生总人数);sline=Console.ReadLine(); / 从控制台接受学生总人数从控制台接受学生总人数Num=int.Parse(sline); / 将将string类型转换成类型转换成int类型类型Console.Write(请输入选修课程总数请输入选修课程总数);sline=Console.ReadLine();Student.CourseNum=int.Parse(sline); / CourseNum是是Student的静态属性的静态属性 Student Stu=new Student Num; / 根据输入的学生总人数,动态地创建对象根据输入的学生总人数,动态地创建对象70病原体侵入机体,消弱机体防御机能,破坏机体内环境的相对稳定性,且在一定部位生长繁殖,引起不同程度的病理生理过程 / 对对Student类的对象数组进行初始化类的对象数组进行初始化for (i=0;iNum;i+) Stui=new Student ();Course tp=new CourseStudent.CourseNum; / 根据课程数创建根据课程数创建Course类对象数组类对象数组int score=new int Student.CourseNum;/ 具体输入每门课名称、学分具体输入每门课名称、学分for (i=0;iStudent.CourseNum; i+) Console.Write(请输入选修课程名请输入选修课程名);Name=Console.ReadLine(); Console.Write(请输入选修课程学分请输入选修课程学分);sline=Console.ReadLine(); Mark=int.Parse(sline); tpi=new Course (Name,Mark); / 根据课程名、学分对根据课程名、学分对Course数组进行初始化数组进行初始化Student.SetCourse(tp); / 用类名调用用类名调用Student的静态方法的静态方法SetCouse71病原体侵入机体,消弱机体防御机能,破坏机体内环境的相对稳定性,且在一定部位生长繁殖,引起不同程度的病理生理过程 / 输入学生姓名、学号、各门课成绩输入学生姓名、学号、各门课成绩for (i=0;iNum;i+) Console.Write(请输入学生姓名请输入学生姓名);Name=Console.ReadLine(); Console.Write(请输入学号请输入学号);Id=Console.ReadLine();for (j=0;jStudent.CourseNum;j+)Console.Write(请输入请输入0课程的成绩课程的成绩,tpj.Name);sline=Console.ReadLine();scorej=int.Parse(sline);Stui.AddData(Name,Id,score); / 将当前输入的一个学生数据加到对象数组中将当前输入的一个学生数据加到对象数组中Stui.ComputeGPA(); / 计算当前这个学生的计算当前这个学生的GPAConsole.WriteLine(你的你的GPA值是:值是:0:F2,Stui.GPA);T.MaxMinGPA(out sMax, out sMin,Stu); / 计算计算GPA的最大值和最小值的最大值和最小值Console.WriteLine(GPA最高为最高为0:F2, 最低为:最低为:1:F2, sMax,sMin);Console.WriteLine(按按GPA从高到低输出:从高到低输出:);T.SortGPA(ref Stu);for (i=0; iNum; i+)Console.WriteLine( 0 ,1:F2, Stui.Name, Stui.GPA);Console.Read ();72病原体侵入机体,消弱机体防御机能,破坏机体内环境的相对稳定性,且在一定部位生长繁殖,引起不同程度的病理生理过程/ MaxMinGPA方法用于计算方法用于计算Student类对象数组中类对象数组中GPA的最大值和最小值的最大值和最小值/ 它的形参它的形参max和和min被修饰为被修饰为out型,表明它的实参不需要进行初始化,从方法中获得返回值型,表明它的实参不需要进行初始化,从方法中获得返回值public void MaxMinGPA(out double max, out double min, Student stu)if (stu.Length=0)max=min= 1;return;max=min=stu0.GPA; for (int i=1; istu.Length; i+)if (maxstui.GPA) min=stui.GPA; / SortGPA方法按选择排序法对方法按选择排序法对Student类对象数组排序类对象数组排序 / 当需要交换时,再调用当需要交换时,再调用Student的的stuSwap方法方法 / 请注意它的形参被修饰为请注意它的形参被修饰为ref,而在方法体内调用,而在方法体内调用stuSwap方法时实参也要修饰方法时实参也要修饰refpublic void SortGPA(ref Student stu) int i,j,pos;for (i=0;istu.Length 1;i+) for (j=(pos=i)+1; jstu.Length;j+)if (stupos.GPAstuj.GPA)pos=j;if (pos!=i)stui.stuSwap(ref stui,ref stupos);73病原体侵入机体,消弱机体防御机能,破坏机体内环境的相对稳定性,且在一定部位生长繁殖,引起不同程度的病理生理过程程序运行结果如下:74病原体侵入机体,消弱机体防御机能,破坏机体内环境的相对稳定性,且在一定部位生长繁殖,引起不同程度的病理生理过程注意事项注意事项l及时保存课程实验中所书写的代码和数据库文及时保存课程实验中所书写的代码和数据库文件。件。 l存放方式:存放方式:1) 自带自带U盘盘 2) 网络存储,如网易、搜狐、新浪、网络存储,如网易、搜狐、新浪、TOM等免费等免费电子邮箱电子邮箱,等等75
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号