第四天
在程序中实现多态时(前提: 继承), 需要使用父类的实例时, 使用虚方法, 反之抽象类(同一系列)而当不同系列具有相同功能的时候, 此时实现多态就要用到接口----抽象共同功能.
面向对象的核心: 一个思想(实现多态) 一种方式(继承) 三个方针 (虚方法. 抽象类, 接口)
延伸: 面向接口, 面向抽象核心-------方法, 功能也是对象
显示实现接口后,被实现的方法变成了私有的private, 访问不到了,通过接口就能显示了;
向上转型: 尽量让代码更加抽象; 能用父类表示的就不用子类
枚举:
1.一般枚举都是互相排斥的, 同时只能有一个值
2.枚举中的每个值都有一个对应的数值来表示;
2.1 默认数值为整型,默认从0开始, 依次递增,可以手动设置每个枚举对应的整数;
3.枚举在编译完成后就已经用对应的数值常量来表示了
将字符串转换成枚举类型: 字符串必须是枚举中已经定义过的
定义枚举时在后面加个 : byte 可以指定枚举中的数字类型只能是byte类型 范围在0--255之间;
为枚举赋值:
定义枚举:
[flags]标志枚举, 加上这个特性后枚举类型 ,tostring() 返回的就是文字形式,不是数字了
结构体
结构与类的最大区别:
结构是值类型;
类是引用类型;
一种值类型,不具有面向对象的特征,通常用来封装小型相关变量,
结构是不能继承的,但可以实现接口;
如果需要面向对象的特性, 如果存储的数据量大 使用类
如果存储的数据量小, 不需要面向对象特性则使用结构
鼠标指向地方的坐标显示在窗口的标题中
×只有在内存中存储的有交集的类型之间才能进行显示类型转换
字符串的转换
用tryparse进行判断转换,成功则返回正确的值, 错误就返回0;
Convert可以吧任意类型转换为任意类型,只要格式正确;
使用某种类型时, 一定要使用符合CLS的类型,CLS为公共语言;
数组, 字符串, 类 ,接口 为引用类型;
所有的引用类型都继承自object ;
所有的值类型都继承自system. ValueType 而它又继承自object
数值类型, bool 结构, 枚举 等 值类型赋值就是一种拷贝;
对于值类型来说: 栈中存储的就是直接使用的数据,
对于应用类型来说: 栈中存储的是堆中对象的地址;
参数初读的时候:
1.值传递, 传递的是栈中保存的数据;
2.引用传递, 传递的是栈中本身的地址;
程序异常现象:
1.语法错误, 一般编译器会帮我们解决;
2.逻辑错误, 编译没有问题,结果不对,写错;
3.在运行时发生的错误,叫异常, 异常一般会导致程序崩溃 //空指针异常, 未将对象引用设置到对象的实例
4.报异常:试图除以零. 除数不能为0;
5.输入字符串的格式不正确,
处理异常:
把可能发生异常的代码用Try块, 包围起来;
在try--catch语句块后面加上finally{}程序无论是否发生异常都会执行{}中的代码; 所以一般会将释放资源的代码放在这里,这样会保证一定能被执行; 就算是在try中有return,也会被执行,
1.参数是:exception,表示可以捕获所有异常,并指出异常
Catch(Exception ex)
{
Console.writeline(“异常 {0}”, ex.message);
}
2.表示只能捕获空指针异常,只能单独捕获指定的异常;
2.1 其实就是对不同的异常分别捕获,可以对不同的异常单独处理;
Catch (nullreferenceException ex)
Catch (dividebyzeroException ex)
想要使用多个捕获异常的语句, 先写单独的异常处理语句, 再写exception语句
Exception 是所有异常类的基类,祖宗类,
Throw 手动抛出异常;
尽量避免抛出异常;
,
函数返回值:
1.params 可变参数 ,如果不为可变参数传值,则可变参数的数组是一个产度为0的数组, 但是, 不是null ; 当一个方法中有多个参数时, 并且还包含可变参数时, 可变参数只能放在最后面; 可以一个一个传值, 也可以将数组传过去;
2.Ref .在参数传入之前必须先声明 并赋值 ,
3.Out 参数, 在方法中必须赋值, 当一个方法同时要返回多个参数时,可以考虑使用out参数;
因为out参数在方法中必须赋值, 所以调用者方 的传递者可以不赋值,
即便在传递out参数时,赋值也不能用,
out 让函数可以输出多个值
1.在方法中必须为out参数赋值
2.out参数的变量在传递之前不需要赋值,即使赋值了也不能在方法中使用。(赋值没意义)
ref
参数在传递之前必须赋值
在方法中可以不为ref参数赋值,可以直接使用。
ref应用场景内部对外部的值进行改变,out则是内部为外部变量赋值,out一般用在函数有多个返回值的场所。