面向对象编程基础.pptx
,第11讲 面向对象编程基础(2),主讲:吕震宇,本讲内容,主要内容值类型与引用类型继承与多态虚方法与方法覆写重点继承与多态虚方法与方法覆写难点多态的本质,一、值类型与引用类型,值类型与引用类型,值类型直接盛放自身数据每个变量都有自身值的一份拷贝对一个值的修改不会影响另外一个值引用类型通过存储参照(对象指针)存放数据多个变量可能指向同一个对象对一个引用对象的修改可能会影响到另外一个,值类型,堆栈,0,10,堆,b,a,int a=10;,int b;,b=a;,b=9;,程序代码,10,9,引用类型,堆栈,堆,b,a,Car a=new Car();,Car b;,b=a;,b.Speed=150;,程序代码,class Car public int Speed=60;public void Drive();,Car at 00A0Speed=60,Car at 00A0Speed=150,a.Speed 现在也变为150,null,00A0,00A0,什么是 this?,堆栈,堆,a,Car a=new Car();,a.Drive();,程序代码,class Car public int Speed=60;public void Drive()Speed+;,Car at 00A0,Speed:60,等价于:Drive(Car this)this.Speed+;,等价于:Drive(a)a.Speed+;,Speed:61,00A0,值类型与引用类型,类型,值类型,引用类型,内置值类型,枚举,结构,数组,对象,接口,Int32Int64StringDouble,enum,struct,Array,object,interface,Account,Account a1=new Account();a1.ID=001;a1.Owner=Tom“;,类,对象,Interest=7%,a1,class Account public string ID;public string Owner;private double balance;private static double interest=0.07;public void ShowBalance()Console.WriteLine(“Balance is 0,balance);public static double GetInterest()return interest;,double GetInterest(),void ShowBalance(),多个实例共享一个型,但各自存储自己的属性,堆,ID,Owner,Balance,Tom,12.56,堆栈,00A0,a1,Account,Interest=7%,static double GetInterest(),void ShowBalance(),001,VMT,Account,Interest=0.7,GetInterest(),ShowBalance(),GetInterest()的具体实现,ShowBalance()的具体实现,型(类),值(对象),00B0,a2,二、继承与多态概况,请开“马自达车”!,请开“奔驰车”!,请开“Volvo车”!,有病!,“C”先生,从“有病”说起,病从何来?简单的事复杂化了只要说“开车”就行病因是什么?“函数名”是用于区分子程序的标识因为函数不能重名,所以不能直接“开车”注:可以通过指向函数的指针解决问题,#includevoid PrintHelp();void DriveVolvo();void DriveBenz();void DriveMazda();main(int argc,char*argvs)if(argc 2)PrintHelp();return;if(strcmp(argvs1,V)=0)DriveVolvo();else if(strcmp(argvs1,B)=0)DriveBenz();else if(strcmp(argvs1,M)=0)DriveMazda();else PrintHelp();,getch();void PrintHelp()printf(Please input a correct car type.(V,B,M);void DriveVolvo()printf(Driving Volvo);void DriveBenz()printf(Driving Benz);void DriveMazda()printf(Driving Mazda);,解决办法,以不变应万变方法的重载(Overload)方法的覆写(Override)方法重载同一类中允许重名方法只要方法的“签名”不同即可方法覆写存在于多个存在“继承”关系的类同一方法名实现“多态”,什么是“继承”,继承指类间的“Is a kind of”关系描述类与类之间的关系子类是父类的专门化,这不是面向对象的继承,机动车,轿车,卡车,灯,灯泡,管灯,轿车 Is a kind of 机动车卡车 Is a kind of 机动车,灯泡 Is a kind of 灯管灯 Is a kind of 灯,因为:机动车可以开并且所以:轿车可以开、卡车可以开,因为:灯可以开并且所以:灯泡可以开、管灯可以开,开车();,开车();,开车();,开灯();,开灯();,开灯();,类的继承关系,继承与类的层级关系,单继承与多继承,单继承:只能有一个父类C#语言是单继承语言多继承:从多个父类继承,“继承”关系的代码实现,语法,class Base class Derived:Base,继承(续),关于继承的几个要点凡是父类有的,子类一定有公有字段、方法私有字段、方法非静态字段、方法静态字段、方法子类“共享”父类静态字段修改子类“继承”下来的父类静态字段,将导致父类静态字段的值发生变化。,using System;public class Base public int a=10;public class Derived:Basepublic class Client public static void Main()Derived d=new Derived();Console.WriteLine(d.a);,结论子类继承非静态字段,10请按任意键继续.,using System;public class Base public static int a=10;public class Derived:Basepublic class Client public static void Main()Derived.a=15;Console.WriteLine(Base.a);,结论子类继承静态字段修改子类继承来的静态字段值,将导致父类该静态字段值的改变,15请按任意键继续.,using System;public class Base public void SayHello()Console.WriteLine(Hello!);public class Derived:Basepublic class Client public static void Main()Derived d=new Derived();d.SayHello();,Hello!请按任意键继续.,结论子类继承非静态方法,using System;public class Base public static void SayHello()Console.WriteLine(Hello!);public class Derived:Basepublic class Client public static void Main()Derived.SayHello();,Hello!请按任意键继续.,结论子类继承静态方法,using System;public class Base private int a=10;public void ShowA()Console.WriteLine(a);public class Derived:Basepublic class Client public static void Main()Derived d=new Derived();d.ShowA();,10请按任意键继续.,结论子类继承私有字段可以通过公有方法检测到该私有字段的存在,继承(续),思考凡是父类有的方法,子类一定有凡是父类可以做的事,子类一定可以做设计模式思想李氏代换原则子类可以替换父类但父类不一定可以替换子类,多态(PolyMorphism),通俗的解释一个方法的执行结果可能这样,也可能那样究竟这样还是那样?不知道!多态特点方法的执行结果可能有“多种形态”将这样的方法称为“虚方法”虚方法可以被子类“覆写”,“多态”案例,public class Car public virtual void Drive()Console.WriteLine(Driving Car);public class Volvo:Car public override void Drive()Console.WriteLine(Driving Volvo);public class Benz:Car public override void Drive()Console.WriteLine(Driving Benz);public class Mazda:Car public override void Drive()Console.WriteLine(Driving Mazda);,“多态”案例(续),public class Client public static void Main(string argvs)static void DriveCar(Car c)c.Drive();,DriveCar(new Volvo();DriveCar(new Benz();DriveCar(new Mazda();,执行结果是什么?,Driving VolvoDriving BenzDriving Mazda请按任意键继续.,?,因为:Volvo is Car所以:Volvo can Drive因此:Drive Volvo as Car,多态特点,不知道某段代码的执行结果是什么方法名由父类决定方法的实现由子类决定多伴随“虚方法”和“覆写”,public class Car public virtual void Drive()Console.WriteLine(Driving Car);public class Volvo:Car public override void Drive()Console.WriteLine(Driving Volvo);,以不变应万变,面向对象三要素,继承Inheritance封装Encapsulation多态Polymorphism,面向对象学习顺序,封 装,继 承,多 态,虚方法,方法覆写,公有方法,私有方法,静态方法,实例方法,面向对象应用,小结,值类型直接盛放数据,对一个值的修改不会影响另外一个值引用类型存储地址(对象指针),对一个引用对象的修改可能会影响到另外一个继承描述 Is a kind of 的关系,C#是单继承凡是父类有的,子类一定有李氏代换原则,小结(续),多态以不变应万变方法名由父类决定方法的实现由子类决定,