收藏 分销(赏)

C面向对象编程基础学习笔记.pptx

上传人:精**** 文档编号:4170991 上传时间:2024-08-10 格式:PPTX 页数:59 大小:171.12KB
下载 相关 举报
C面向对象编程基础学习笔记.pptx_第1页
第1页 / 共59页
C面向对象编程基础学习笔记.pptx_第2页
第2页 / 共59页
C面向对象编程基础学习笔记.pptx_第3页
第3页 / 共59页
C面向对象编程基础学习笔记.pptx_第4页
第4页 / 共59页
C面向对象编程基础学习笔记.pptx_第5页
第5页 / 共59页
点击查看更多>>
资源描述

1、1第第3 3章章 C#C#面向对象编程基础面向对象编程基础面向对象程序设计是相对结构化程序设计而言的。使面向对象程序设计是相对结构化程序设计而言的。使用面向对象思想编制软件,是当前最流行的程序设用面向对象思想编制软件,是当前最流行的程序设计方法。本章介绍面向对象程序设计的一些基本概计方法。本章介绍面向对象程序设计的一些基本概念和技术。念和技术。23.1 继承继承在在2.1.5节,定义了一个描述个人情况的节,定义了一个描述个人情况的Person类。如类。如需要描述一个雇员,当然可以从头开始定义需要描述一个雇员,当然可以从头开始定义Employee类用来描述雇员。但这样不能利用类用来描述雇员。但这

2、样不能利用Person类中已定义的函数和数据。比较好的方法是类中已定义的函数和数据。比较好的方法是以以Person类为基类,派生出类为基类,派生出Employee类,类,Employee类继承了类继承了Person类的数据成员和函数成类的数据成员和函数成员,既员,既Person类的数据成员和函数成员成为类的数据成员和函数成员成为Employee类的成员。这个类的成员。这个Employee类叫以类叫以Person类为基类的派生类,这是类为基类的派生类,这是C#提出的方法。提出的方法。C#用继用继承的方法,实现代码的重用。承的方法,实现代码的重用。33.1.1 3.1.1 派生类的声明格式派生类的

3、声明格式 派生类的声明格式如下:派生类的声明格式如下:附加说明附加说明 类修饰符类修饰符 class class 派生类名派生类名:基类名基类名 类体类体 雇员类雇员类EmployeeEmployee定义如下:定义如下:class Employee:Person class Employee:Person private string department;private string department;private decimal salary;private decimal salary;public Employee(string Name,int Age,public Emplo

4、yee(string Name,int Age,string D,decimal S):base(Name,Age)string D,decimal S):base(Name,Age)department=D;department=D;salary=S;salary=S;4public new void Display()/public new void Display()/注意注意newnew base.Display();/base.Display();/访问基类的同名方法访问基类的同名方法Console.WriteLine(Console.WriteLine(“部门:部门:0 0 薪金:

5、薪金:11”,department,salary);department,salary);主函数如下:主函数如下:class Class1class Class1 static void Main(string args)static void Main(string args)Employee OneEmployeeEmployee OneEmployee=new=new Employee(Employee(“李四李四”,30,30,计算机系计算机系,2000);,2000);OneEmployee.Display();OneEmployee.Display();53.1.2 3.1.2 隐

6、藏基类方法隐藏基类方法 在派生类中,可以声明与基类完全相同的新方在派生类中,可以声明与基类完全相同的新方法,完全相同是指和基类方法的函数类型、函数名、法,完全相同是指和基类方法的函数类型、函数名、参数类型和个数都相同。如上例中的参数类型和个数都相同。如上例中的方法方法DisplayDisplay()()。这样做不算错误,但会导致编译器发出警告。这样做不算错误,但会导致编译器发出警告。如果增加如果增加newnew修饰符,表示认可,编译器不再发出修饰符,表示认可,编译器不再发出警告。请注意,警告。请注意,声明与基类完全相同新方法,并不声明与基类完全相同新方法,并不是移走基类同名方法,只是在派生类中

7、必须用如下是移走基类同名方法,只是在派生类中必须用如下格式访问格式访问基类中同名方法基类中同名方法:base.base.Display();Display();也就是说派生类的新方法隐藏了也就是说派生类的新方法隐藏了基类同名方法。基类同名方法。63.1.3 base 关键字关键字 base base关键字用于从派生类中访问基类成员,它有两关键字用于从派生类中访问基类成员,它有两种基本用法:种基本用法:在定义派生类的构造函数中,指明要调用的基类构在定义派生类的构造函数中,指明要调用的基类构造函数,由于基类可能有多个构造函数,根据造函数,由于基类可能有多个构造函数,根据basebase后的参数类型

8、和个数,指明要调用哪一个基类构造后的参数类型和个数,指明要调用哪一个基类构造函数。函数。在派生类的方法中调用基类中被派生类隐藏的方法。在派生类的方法中调用基类中被派生类隐藏的方法。73.1.4 C#语言类继承特点语言类继承特点 C#C#语言只允许单继承,即派生类只能有一个基类。语言只允许单继承,即派生类只能有一个基类。C#C#语言继承是可以传递的,语言继承是可以传递的,如果如果C C从从B B派生,派生,B B从从A A派生,那么派生,那么C C不不但继承但继承B B的成员,还要继承的成员,还要继承A A中的成员。中的成员。派生类可以添加新成员,但不能删除基类中的成员派生类可以添加新成员,但不

9、能删除基类中的成员派生类不继承基类的构造函数和析构函数。能继承基类的属性。派生类不继承基类的构造函数和析构函数。能继承基类的属性。派生类可以派生类可以隐藏隐藏基类的同名成员,如果在派生类中基类的同名成员,如果在派生类中隐藏了隐藏了基类基类同名成员,基类该成员在派生类中就不能被直接访问,只能通同名成员,基类该成员在派生类中就不能被直接访问,只能通过过base.base.基类方法名访问。基类方法名访问。派生类对象也是其基类的对象,但基类对象却不一定是其派生派生类对象也是其基类的对象,但基类对象却不一定是其派生类的对象。例如,前边定义的雇员类类的对象。例如,前边定义的雇员类EmployeeEmplo

10、yee是是PersonPerson类的派类的派生类,所有雇员都是生类,所有雇员都是PersonPerson类的成员,但很多类的成员,但很多PersonPerson类的成员类的成员并不是雇员,可能是学生、自由职业者、儿童等。因此并不是雇员,可能是学生、自由职业者、儿童等。因此C#C#语言语言规定,基类的引用变量可以引用其派生类对象,但派生类的引规定,基类的引用变量可以引用其派生类对象,但派生类的引用变量不可以引用其基类对象。用变量不可以引用其基类对象。83.2 类的成员类的成员 由于由于C#程序中每个变量或函数都必须属程序中每个变量或函数都必须属于一个类或结构,不能象于一个类或结构,不能象C或或

11、C+那样建立全那样建立全局变量,因此所有的变量或函数都是类或结局变量,因此所有的变量或函数都是类或结构的成员。类的成员可以分为两大类构的成员。类的成员可以分为两大类:类本身类本身所声明的以及从基类中继承来的。所声明的以及从基类中继承来的。93.2.1 类的成员类型类的成员类型 类的成员包括以下类型类的成员包括以下类型 局部变量局部变量:在在forfor、switchswitch等语句中和类方法中定义的变量等语句中和类方法中定义的变量 字段字段:即类中的变量或常量,包括静态字段、实例字段、常量即类中的变量或常量,包括静态字段、实例字段、常量 和只读字段。和只读字段。方法成员:即类中的方法,包括静

12、态方法和实例方法。方法成员:即类中的方法,包括静态方法和实例方法。属性:按属性指定的属性:按属性指定的getget方法和方法和setset方法对字段进行读写。属方法对字段进行读写。属 性本质上是方法。性本质上是方法。事件:代表事件本身,同时是事件处理函数的代表。事件:代表事件本身,同时是事件处理函数的代表。索引指示器:允许象数组那样使用索引访问类中的数据成员。索引指示器:允许象数组那样使用索引访问类中的数据成员。重载操作符:采用重载操作符的方法定义类中特有的操作。重载操作符:采用重载操作符的方法定义类中特有的操作。构造函数和析构函数。构造函数和析构函数。103.2.2 3.2.2 类成员访问修

13、饰符类成员访问修饰符 访问修饰符有访问修饰符有4 4种种,用于指定类成员的可访问性:用于指定类成员的可访问性:PrivatePrivate:protectedprotected:publicpublic:Internal:Internal:内部成员只能在同一程序集中的文件中内部成员只能在同一程序集中的文件中才是可以访问的,一般是同一个应用才是可以访问的,一般是同一个应用(Application)(Application)或库或库(Library)(Library)。113.3 3.3 类的字段和属性类的字段和属性 一般把类或结构中定义的变量和常量叫一般把类或结构中定义的变量和常量叫字段。属性不

14、是字段,本质上是定义修改字字段。属性不是字段,本质上是定义修改字段的方法,由于属性和字段的紧密关系,把段的方法,由于属性和字段的紧密关系,把它们放到一起叙述。它们放到一起叙述。123.3.1 3.3.1 静态字段、实例字段、常量和只读字段静态字段、实例字段、常量和只读字段 见下例:见下例:public public class Testclass Testpublicpublic const int intMax=int.MaxValue;const int intMax=int.MaxValue;/常量必须赋初值常量必须赋初值public int x=0;public int x=0;/实例

15、字段,每个实例创建不同实例字段,每个实例创建不同x xpublic readonly int y=0;public readonly int y=0;/只读字段,每个实例创建不同只读字段,每个实例创建不同y ypublic static int cnt=0;public static int cnt=0;/静态字段静态字段,所有实例共用一个所有实例共用一个cntcntpublic Test(int x1,int y1)public Test(int x1,int y1)/构造函数构造函数 /intMax=0;/intMax=0;错误,在构造函数不能修改常量错误,在构造函数不能修改常量x=x1;

16、x=x1;/在构造函数允许修改实例字段在构造函数允许修改实例字段y=y1;y=y1;/在构造函数允许修改只读字段在构造函数允许修改只读字段cnt+;/cnt+;/每创建一个对象都调用构造函数,每创建一个对象都调用构造函数,/用此语句可以记录对象的个数用此语句可以记录对象的个数 13public void Modify(int x1,int y1)public void Modify(int x1,int y1)/intMax=0;/intMax=0;和和y=10;y=10;错误,不能修改常量和只读字段错误,不能修改常量和只读字段x=x1;x=x1;cnt=y1;cnt=y1;class Cla

17、ss1class Class1 static void Main(string args)static void Main(string args)Test T1=new Test(100,200);Test T1=new Test(100,200);T1.x=40;/T1.x=40;/引用实例字段方法:实例名引用实例字段方法:实例名.实例字段名实例字段名Tt=0;/Tt=0;/引用静态字段方法:类名引用静态字段方法:类名.静态字段名静态字段名int z=T1.y;int z=T1.y;/引用只读字段引用只读字段z=Test.intMax;z=Test.intMax;/引用常量引用常量 143

18、.3.2 3.3.2 属性属性 C#C#语言支持组件编程,组件也是类,组件用属语言支持组件编程,组件也是类,组件用属性、方法、事件描述。属性不是字段,但必然和类性、方法、事件描述。属性不是字段,但必然和类中的某个或某些字段相联系,属性定义了得到和修中的某个或某些字段相联系,属性定义了得到和修改相联系的字段的方法。改相联系的字段的方法。C#C#中的属性更充分地体现中的属性更充分地体现了对象的封装性:不直接操作类的数据内容,而是了对象的封装性:不直接操作类的数据内容,而是通过访问器进行访问,借助于通过访问器进行访问,借助于getget和和setset方法对属性方法对属性的值进行读写。访问属性值的语

19、法形式和访问一个的值进行读写。访问属性值的语法形式和访问一个变量基本一样,使访问属性就象访问变量一样方便,变量基本一样,使访问属性就象访问变量一样方便,符合习惯。在符合习惯。在类的基本概念一节中,定义一个描述类的基本概念一节中,定义一个描述个人情况的类个人情况的类PersonPerson,其中字段,其中字段namename和和ageage是私有是私有字段,记录姓名和年龄,外部通过公有方法字段,记录姓名和年龄,外部通过公有方法SetNameSetName和和SetAgeSetAge修改这两个私有字段。现在用属修改这两个私有字段。现在用属性来描述姓名和年龄。性来描述姓名和年龄。例子如下:例子如下:

20、15using System;using System;public class Personpublic class Person private string P_name=private string P_name=张三张三;/P_name;/P_name是私有字段是私有字段private int P_age=12;private int P_age=12;/P_age/P_age是私有字段是私有字段public void Display()/public void Display()/类的方法声明,显示类的方法声明,显示姓名和年龄姓名和年龄 Console.WriteLine(Cons

21、ole.WriteLine(“姓名姓名:0,:0,年龄:年龄:11”,P_name,P_age);P_name,P_age);public string Name public string Name/定义属性定义属性NameName getgetreturn P_name;return P_name;setsetP_name=value;P_name=value;public int Age public int Age/定义属性定义属性AgeAge getgetreturn P_age;return P_age;setsetP_age=value;P_age=value;16public

22、class Testpublic class Test public static void Main()public static void Main()Person OnePerson=new Person();Person OnePerson=new Person();OnePerson.Name=OnePerson.Name=田七田七;/;/通过通过setset方法修改变量方法修改变量P_NameP_Namestring s=OnePerson.Name;string s=OnePerson.Name;/通过通过getget方法得到变量方法得到变量P_NameP_Name值值/下句错误

23、下句错误TestTest不是不是PersonPerson派生类,不能修改派生类,不能修改AgeAge属性属性/OnePerson.Age=20;/OnePerson.Age=20;int x=OnePerson.Age;/int x=OnePerson.Age;/通过定义属性,既保证了姓名通过定义属性,既保证了姓名 /和年龄按指定方法修改和年龄按指定方法修改OnePerson.Display();/OnePerson.Display();/语法形式和修改、语法形式和修改、/得到一个变量基本一致,符合习惯得到一个变量基本一致,符合习惯 只有只有setset访问器的属性值只能进行设置而不能读出,只

24、有访问器的属性值只能进行设置而不能读出,只有getget访问器的属性值是只读的,不能改写,同时具有访问器的属性值是只读的,不能改写,同时具有setset和和getget访问器表明属性值的读写都是允许的。访问器表明属性值的读写都是允许的。173.4 类的方法类的方法 3.4.1 方法的声明方法的声明 方法的声明格式如下方法的声明格式如下:方法修饰符方法修饰符 返回类型返回类型 方法名方法名(形参列表形参列表)方法体方法体 3.4.2 3.4.2 方法中参数的传递方法中参数的传递值参数,不含任何修饰符值参数,不含任何修饰符(值类型值类型、引用类型引用类型不同不同)引用参数,以引用参数,以refre

25、f修饰符声明修饰符声明(主要用于主要用于值类型值类型)输出参数,以输出参数,以outout修饰符声明修饰符声明(主要用于主要用于值类型值类型)using System;using System;class gpublic int a=0;/class gpublic int a=0;/类定义类定义 18class Class1class Class1 public static void F1(ref char i)public static void F1(ref char i)/引用参数引用参数 i=b;i=b;public static void F2(char i)public sta

26、tic void F2(char i)/值参数,值参数,形形参类型为值类型参类型为值类型 i=d;i=d;public static void F3(out char i)public static void F3(out char i)/输出参数输出参数 i=e;i=e;public static void F4(string s)public static void F4(string s)/值参数值参数形形参类型为字符串参类型为字符串 s=xyz;s=xyz;/虽然字符串为引用类型,参数传递方式和值类型相同虽然字符串为引用类型,参数传递方式和值类型相同public static void

27、 F5(g gg)public static void F5(g gg)/值参数,值参数,形形参类型为引用类型参类型为引用类型 gg.a=20;gg.a=20;public static void F6(ref string s)public static void F6(ref string s)s=s=“xyzxyz”;/引用参数,引用参数,形形参类型为字符串参类型为字符串static void Main(string args)static void Main(string args)char a=c;char a=c;string s1=abc;string s1=abc;19F2(a

28、);F2(a);/值参数,不能修改外部的值参数,不能修改外部的a aConsole.WriteLine(a);Console.WriteLine(a);/因因a a未被修改,显示未被修改,显示c cF1(ref a);F1(ref a);/引用参数引用参数,函数修改外部的函数修改外部的a a的值的值Console.WriteLine(a);Console.WriteLine(a);/a/a被修改为被修改为b b,显示,显示b bChar j;Char j;F3(out j);F3(out j);/输出参数输出参数,结果输出到外部变量,结果输出到外部变量j jConsole.WriteLine(

29、j);Console.WriteLine(j);/显示显示e eF4(s1);/F4(s1);/值参数,参数类型是字符串,值参数,参数类型是字符串,s1s1为字符串引用变量为字符串引用变量Console.WriteLine(s1);/Console.WriteLine(s1);/显示:显示:abc,abc,字符串字符串s1s1不被修改不被修改g g1=new g();g g1=new g();F5(g1);F5(g1);/值参数,但实参是一个类引用类型变量值参数,但实参是一个类引用类型变量Console.WriteLine(g1.a.ToString();Console.WriteLine(g

30、1.a.ToString();/显示显示:20:20修改对象数据修改对象数据F6(ref s1);F6(ref s1);/引用参数,参数类型是字符串,引用参数,参数类型是字符串,s1s1为字符串引用变量为字符串引用变量Console.WriteLine(s1);/Console.WriteLine(s1);/显示:显示:xyzxyz,字符串,字符串s1s1被修改被修改 20数组参数,以数组参数,以paramsparams修饰符声明,修饰符声明,数组参数使用数组参数使用paramsparams说明,如果形参表中包含了数组参数,那么说明,如果形参表中包含了数组参数,那么它必须是参数表中最后一个参数

31、,数组参数只允许它必须是参数表中最后一个参数,数组参数只允许是一维数组。是一维数组。using System;using System;class Class1class Class1 static void F(params int args)static void F(params int args)/数组参数数组参数 Console.Write(Console.Write(“数组包含数组包含00个元素个元素:”,args.Length);args.Length);foreach(int i in args)foreach(int i in args)Console.Write(0,i);

32、Console.Write(0,i);21 static void Main(string args)static void Main(string args)int a=1,2,3;int a=1,2,3;F(a);F(a);/实参为数组类引用变量实参为数组类引用变量a a F(10,20,30,40);F(10,20,30,40);/等价于等价于F(new int 10,20,30,40)F(new int 10,20,30,40)F(new int 60,70,80,90);/F(new int 60,70,80,90);/实参为数组类引用实参为数组类引用 F();F();/等价于等价于

33、F(new int);F(new int);F(new int);/F(new int);/实参为数组类引用,数组无元素实参为数组类引用,数组无元素 程序输出程序输出数组包含数组包含3 3个元素个元素:1 2 3:1 2 3数组包含数组包含4 4个元素个元素:10 20 30 40:10 20 30 40数组包含数组包含4 4个元素个元素:60,70,80,90:60,70,80,90数组包含数组包含0 0个元素个元素:数组包含数组包含0 0个元素个元素:22方法的参数为数组时也可以不使用方法的参数为数组时也可以不使用paramsparams,此种方法可以使,此种方法可以使用一维或多维数组,见

34、下例:用一维或多维数组,见下例:using System;using System;class Class1class Class1 static void F(int,args)/static void F(int,args)/值参数类型为数组类引用变量值参数类型为数组类引用变量 Console.Write(Console.Write(数组包含数组包含00个元素个元素:,args.Length);:,args.Length);foreach(int i in args)foreach(int i in args)Console.Write(0,i);Console.Write(0,i);st

35、atic void Main(string args)static void Main(string args)int,a=1,2,3,4,5,6;int,a=1,2,3,4,5,6;F(a);F(a);/实参为数组类引用变量实参为数组类引用变量a a /F(10,20,30,40);F();F(new int,);/F(10,20,30,40);F();F(new int,);这两种格式不能使用这两种格式不能使用F(new int,60,70,80,90);/F(new int,60,70,80,90);/实参为数组类引用实参为数组类引用 233.4.3 3.4.3 静态方法和实例方法静态方

36、法和实例方法 用修饰符用修饰符staticstatic声明的方法为静态方法声明的方法为静态方法 不管类生成或未生成对象,类的静态方法都可以被不管类生成或未生成对象,类的静态方法都可以被使用,使用格式为:类名使用,使用格式为:类名.静态方法名。静态方法静态方法名。静态方法只能使用该静态方法所在类的静态数据成员和静态只能使用该静态方法所在类的静态数据成员和静态方法。方法。这是因为使用静态方法时,该静态方法所在这是因为使用静态方法时,该静态方法所在类可能还没有对象类可能还没有对象不用修饰符不用修饰符staticstatic声明的方法为实例方法声明的方法为实例方法 在类创建对象后,实例方法才能被使用,

37、使用格式在类创建对象后,实例方法才能被使用,使用格式为:对象名为:对象名.实例方法名。实例方法可以使用该方实例方法名。实例方法可以使用该方法所在类的所有静态成员和实例成员。例子如下:法所在类的所有静态成员和实例成员。例子如下:24using System;using System;public class UseMethodpublic class UseMethod private static int x=0;/private static int x=0;/静态字段静态字段private int y=1;/private int y=1;/实例字段实例字段public static vo

38、id StaticMethod()/public static void StaticMethod()/静态方法静态方法 x=10;x=10;/正确,静态方法访问静态数据成员正确,静态方法访问静态数据成员/y=20;/y=20;错误,静态方法不能访问实例数据成员错误,静态方法不能访问实例数据成员 public void NoStaticMethod()/public void NoStaticMethod()/实例方法实例方法 x=10;x=10;/正确,实例方法访问静态数据成员正确,实例方法访问静态数据成员y=20;y=20;/正确,实例方法访问实例数据成员正确,实例方法访问实例数据成员 2

39、5public class public class Class1Class1 public static void Main()public static void Main()UseMethod m=new UseMethod();UseMethod m=new UseMethod();/使用静态方法使用静态方法格式为:类名格式为:类名.静静态方法名态方法名UseMethod.StaticMethod();UseMethod.StaticMethod();/使用实例方法格式使用实例方法格式为:对象名为:对象名.实例方法名实例方法名m.NoStaticMethod();m.NoStaticM

40、ethod();263.4.4 3.4.4 操作符重载操作符重载 using System;using System;class Complexclass Complex/复数类定义复数类定义 private double Real;private double Real;/复数实部复数实部private double Imag;private double Imag;/复数虚部复数虚部public Complex(double x,double y)public Complex(double x,double y)/构造函数构造函数 Real=x;Real=x;Imag=y;Imag=y;s

41、tatic public Complex operator-(Complex a)static public Complex operator-(Complex a)return(new Complex(-a.Real,-a.Imag);return(new Complex(-a.Real,-a.Imag);/重载一元操作符重载一元操作符 static public Complex operator+(Complex a,Complex b)static public Complex operator+(Complex a,Complex b)return(new Complex(a.Real

42、+b.Real,a.Imag+b.Imag);return(new Complex(a.Real+b.Real,a.Imag+b.Imag);public void Display()public void Display()Console.WriteLine(0+(1)j,Real,Imag);Console.WriteLine(0+(1)j,Real,Imag);27class Class1class Class1 static void Main(string args)static void Main(string args)Complex x=new Complex(1.0,2.0)

43、;Complex x=new Complex(1.0,2.0);Complex y=new Complex(3.0,4.0);Complex y=new Complex(3.0,4.0);Complex z=new Complex(5.0,7.0);Complex z=new Complex(5.0,7.0);x.Display();x.Display();/显示显示:1+(2)j:1+(2)j y.Display();y.Display();/显示显示:3+(4)j:3+(4)j z.Display();z.Display();/显示显示:5+(7)j:5+(7)j z=-x;z=-x;/等

44、价于等价于z=opeator-(x)z=opeator-(x)z.Display();z.Display();/显示:显示:-1+(-2)j-1+(-2)j z=x+y;z=x+y;/即即z=opeator+(x,y)z=opeator+(x,y)z.Display();z.Display();/显示:显示:4+(6)j4+(6)j 283.4.5 this关键字关键字 每每个个类类都都可可以以有有多多个个对对象象,例例如如定定义义PersonPerson类类的的两两个个对象:对象:Person P1=new Person(Person P1=new Person(李四李四,30);,30);

45、Person P2=new Person(Person P2=new Person(张三张三,40);,40);因此因此P1.P1.Display()Display()应应显示显示李四信息李四信息,P2.P2.Display()Display()应应显示显示张三信息张三信息,但无论创建多少个对象,只有一,但无论创建多少个对象,只有一个方法个方法Display()Display(),该方法,该方法是如何知道是如何知道显示哪个对显示哪个对象的信息的呢象的信息的呢?C#C#语言用引用变量语言用引用变量thisthis记录调用方记录调用方法法Display()Display()的对象,当某个对象调用方

46、法的对象,当某个对象调用方法DisplayDisplay()()时,时,thisthis便引用该对象便引用该对象(记录该对象的地址记录该对象的地址)。293.5 3.5 类的多态性类的多态性 C#C#支持两种类型的多态性支持两种类型的多态性编译时的多态性编译时的多态性编译时的多态性是通过方法重载来实现的。编译时的多态性是通过方法重载来实现的。运行时的多态性运行时的多态性 是在系统运行时,不同对象调用一个名字相同,参是在系统运行时,不同对象调用一个名字相同,参数的类型及个数完全一样的方法,会完成不同的操数的类型及个数完全一样的方法,会完成不同的操作。作。C#C#运行时的多态性通过虚方法实现。在类

47、的方运行时的多态性通过虚方法实现。在类的方法声明前加上了法声明前加上了virtualvirtual修饰符,被称之为虚方法,修饰符,被称之为虚方法,反之为非虚方法。反之为非虚方法。30using System;using System;class Aclass A public void F()public void F()/非虚非虚方法方法 Console.Write(A.F);Console.Write(A.F);public virtual void G()public virtual void G()/虚虚方法方法 Console.Write(A.G);Console.Write(A.G

48、);class B:Aclass B:A/A/A类为类为B B类的基类类的基类 new public void F()new public void F()/隐藏基类的同名非虚隐藏基类的同名非虚方法方法F F注意使用注意使用newnew Console.Write(B.F);Console.Write(B.F);public override void G()public override void G()/隐藏基类同名虚隐藏基类同名虚方法方法G G使用使用overrideoverride Console.Write(B.G);Console.Write(B.G);31class Testcl

49、ass Test static void F2(A aA)static void F2(A aA)/注意,参数为注意,参数为A A类引用变量类引用变量 aA.G();aA.G();static void Main()static void Main()B b=new B();B b=new B();A a1=new A();A a1=new A();A a2=b;A a2=b;/允许基类引用变量引用派生类对象允许基类引用变量引用派生类对象a2a2引用派生类引用派生类B B对象对象b b a1.F();a1.F();/调用基类调用基类A A的非虚方法的非虚方法F(),F(),显示显示A.FA.F

50、 a2.F();a2.F();/F()/F()为非虚方法,调用基类为非虚方法,调用基类A A的的F(),F(),显示显示A.FA.F b.F();b.F();/F()/F()为非虚方法,调用派生类为非虚方法,调用派生类B B的的F(),F(),显示显示B.FB.F a1.G();a1.G();/G/G为虚方法为虚方法,因因a1a1引用基类引用基类A A对象对象,调用基类调用基类A A的的G G,显示,显示A.GA.G a2.G();a2.G();/G/G为虚方法为虚方法,a2,a2引用派生类引用派生类B B对象对象,调用派生类调用派生类B B的的G,G,显示显示B.GB.G F2(b);F2(

展开阅读全文
部分上传会员的收益排行 01、路***(¥15400+),02、曲****(¥15300+),
03、wei****016(¥13200+),04、大***流(¥12600+),
05、Fis****915(¥4200+),06、h****i(¥4100+),
07、Q**(¥3400+),08、自******点(¥2400+),
09、h*****x(¥1400+),10、c****e(¥1100+),
11、be*****ha(¥800+),12、13********8(¥800+)。
相似文档                                   自信AI助手自信AI助手
搜索标签

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服