一、多态(某种事物出现的多种形态)
- 函数具有多态性:重载、重写。
- 多态的前提:a.想让一个事物具备另一种事物的形态,要么继承,要么实现;b.一定要有覆盖。
- 多态的好处:提高了代码的扩展性,便于后期维护。
- 多态的弊端:前期写的代码无法使用后期特有的内容。
- 多态在代码中的体现:父类或接口的引用指向其子类对象。
class Program
{
static void Main(string[] args)
{
USB u = new Mouse();
//注意是父类= new 子类对象()。不是Mouse m=new USB();
Method(u);
u = new KeyBoard();
Method(u);
//Method(new KeyBoard());
//类型向上转化(向父类转换)(自动转换)
Console.ReadLine();
}
public static void Method(USB u)
{
if(u is Mouse )
{
u.print();
Mouse m = u as Mouse;
//类型向下转化(向子类转换)(强制类型转换)或者写成Mouse m=(Mouse)u,作用:调用子类特有功能
m.print();
m.Move();
}
if (u is KeyBoard)
{
u.print();
KeyBoard k = u as KeyBoard;
k.print();
k.Move();
}
}
}
class USB
{
public string name = "USB";
public void print()
{
Console.WriteLine(name+" Print");
}
}
class Mouse : USB
{
public new string name = "Mouse";
public new void print()
{
Console.WriteLine(name +" mouse_Print");
}
public void Move()
{
Console.WriteLine(name + " mouse_Move");
}
}
class KeyBoard : USB
{
public new void print()
{
Console.WriteLine(name+" KeyBoard_Print");
}
public void Move()
{
Console.WriteLine(name+" KeyBoard_Move");
}
}
结果为:
USB Print
Mouse mouse_Print
Mouse mouse_Move
USB Print
USB KeyBoard_Print
USB KeyBoard_Move
结论:
子类继承父类,运用new关键字时,对于变量来说:编译时,参考变量所属类型(看左边)中是否有调用的成员变量,有则通过,没有则报错;运行时,参考变量所属类型(看左边)中是否有调用的成员变量,有则运行该变量。对于函数来说,编译时,参考变量所属类型(看左边)中是否有调用的成员函数,有则通过,没有则报错;运行时,参考变量所属类型(看左边)中是否有调用的成员函数,有则运行该函数(
创建子类对象当父类型,eg:USB u = new Mouse();调用父类方法)
class Program
{
static void Main(string[] args)
{
USB u = new Mouse();
Method(u);
u = new KeyBoard();
Method(u);
Console.ReadLine();
}
public static void Method(USB u)
{
if(u is Mouse )
{
u.print();
Mouse m = u as Mouse;
m.print();
m.Move();
}
if (u is KeyBoard)
{
u.print();
KeyBoard k = u as KeyBoard;
k.print();
k.Move();
}
}
}
class USB
{
public string name = "USB";
public virtual void print()
{
Console.WriteLine(name+" Print");
}
}
class Mouse : USB
{
public new string name = "Mouse";
public override void print()
{
Console.WriteLine(name +" mouse_Print");
}
public void Move()
{
Console.WriteLine(name + " mouse_Move");
}
}
class KeyBoard : USB
{
public override void print()
{
Console.WriteLine(name+" KeyBoard_Print");
}
public void Move()
{
Console.WriteLine(name+" KeyBoard_Move");
}
}
结果为:
Mouse mouse_Print
Mouse mouse_Print
Mouse mouse_Move
USB KeyBoard_Print
USB KeyBoard_Print
USB KeyBoard_Move
结论:
子类继承父类,运用override关键字时,对于变量来说,只能用new 关键字。对于方法来说,参考这个对象(看右边)中是否有调用的方法,有则调用,没有则调用父类。(
创建子类对象当父类型,eg:USB u = new Mouse();调用子类方法)
二 、内存
- 内存的划分:寄存器(被CPU处理)、本地方法区、方法区、栈内存、堆内存
- 栈内存:存放局部变量,先进后出,更新速度快,会自动更新,出栈即弹栈,入栈即压栈
- null为引用数据类型
int[] arr=new int[6];
arr=null;//把arr引用的地址赋值为null
System.Console.WriteLine(arr[0]);//异常
- 常见异常:
a.NullreferenceException:空引用异常
b.IndexOutOfRangeException:索引越界异常
c.InvalidCastException:类型转换异常
- 如果一个实体(对象)没有其他变量引用其地址值时,就会变成垃圾。垃圾不会随时释放,没有具体的对象地址值,在C#中有一种很优秀的机制叫垃圾回收机制。垃圾回收机制回收垃圾是不定时的,完全随机。
class Program
{
static void Main(string[] args)
{
Car c1 = new Car();
Car c2 = new Car();
c1 = c2;
c1.num = 1;
c2.num = 2;
c2.color = "yellow";
c1.Run();
c2.Run();
Console.ReadLine();
}
}
class Car
{
public int num;
public string color;
public void Run()
{
Console.WriteLine(num + ".." + color);
}
}
结果为:2..yellow
2..yellow