第三章 面向对象编程基础
类:
类也是一种数据类型,将类用作数据成员。类可以嵌套类, 类型嵌套。类的修饰符有:public private protected internal new abstract sealed.
封装:指的是建立类包,其中包含所需的所有的东西。
多态:指的是能够呈现多种形式的功能,即程序能够使用偿发送给它的东西进行工作。
继承:在一个类是另一个类的扩展时发生。
重用:创建类后,可以重复使用它来创建大量的对象。
类只是一种用于创建对象的定义,只是用于声明对象的。类本身,不能存储信息或执行例程。
类只是一种定义,它不存储任何东西,对象需要存储信息,需要为它预留内存,new 用于预留内存。
类成员:两种,数据成员和函数成员。
类的声明包括类头和类体,类头主要是类名的定义;类体主要是类成员的定义。
类成员的声明:
1、常数声明:用const修饰,不能用static来修饰,但是他和静态成员一样,不属于任何对象,必须由类来访问。
2、字段(变量)声明:修饰符有,new public private protected internal static readonly volatile。静态变量:同一个类声明的对象可以共享一个值。在同一个类的对象之间共享数据,可以使用 static 限定符.类中被声明的静态变量属于这个类,而不是实例化的各个对象。
静态数据成员的一种常见用途是用作计数器,每当某个对象执行某种操作时,使可以将所有对象的计数器加1。Readonly为只读字段,在声明的同时进行赋值,也可以通过类的实例构造函数或静态构造函数进行赋值。其它的情况下只能读不能写。3、构造函数声明:
(1)实例构造函数。
修饰符:public private protected internal extern。一般的构造函数是public类型的,如果是private类型的就不能被外部类实例化
标识符:即构造函数名,和class同名,不声明返回类型,如:public class Area
构造函数重载:可以有多个同名的构造函数,但参数的个数或类型不同
(2)静态构造函数
修饰符:static ,extern 如果是extern修饰,说明这是一个外部静态构造函数,和类同名且无参数。
作用:对静态字段进行初始化,不能对非静态成员进行初始化。
4、析构函数:释放对象时调用,(由系统自动调用)执行的顺序与构造函数相反,析构函数用~表示,有可能永远不会被调用。
5、方法(函数)声明:表示类中所进行的各种操作,方法名一般和实际的操作挂钩,已达到顾名思义的效果。如用 public sort()表示排序。
方法的参数传递:值传递(默认的情况下),引用参数(ref),输出参数(out),参数数组(数组本身就是引用)
静态方法:(static)只对静态成员操作,不访问实例字段
实例方法:可访问静态和实例字段。与特定对像关联,因此需要一个对象存在。
方法的重载与覆盖:方法因方法名,修饰符,参数数量和类型不同构成不同的签名方法。
6、属性声明:修饰符:new static virtual abstract override
属性存取器方法:get{} set{} ;
除此之外还有:事件声明,索引声明,运算符声明。在C#中,类的外面不能创建方法,不允许方法的参数的有默认值。
第四章 面向对象编程进阶
类的继承与多态:
继承:实现代码重用
多态:同一方法用不同的对象可以产生不同的结果,通过在基类中使用虚方法,在派生类中使用重载实现。
抽象类与抽象方法:
抽象类:不能被实例化,只能作为其他类的基类,用abstract修饰。如:public abstract class Shape
抽象方法:本身不需要实现,而是在派生类中重载实现。如:
public abstract double class GetArea(); //形状类,求面积本身就没有意义
但是以他为基类派生成circle类,再求面积就有意义:
Public override double GetArea();
密封类和密封方法:
密封类:不能被继承的类,用seal修饰
public virtual double class GetArea(); shape中的方法
Public seal override double GetArea();circle类中的方法
操作符重载:在类中定义操作符
操作符分为 一元操作符 只有一个参数 二元操作符 两个参数
类型转换:
System.Convert.ToString(a)
声明结构 struct 关键字,类和结构的区别如下:
结构 |
类 |
值类型 |
引用数据类型 |
可以不使用new关键字 |
必须使用new关键字 |
构造函数时,必须包含参数 |
有默认构造函数,没有任何参数 |
没有析构函数 |
有析构函数 |
没有abstract protected seal 修饰符 |
可用abstract protected seal 修饰 |
结构是隐式密封的!不能继承!
枚举:
枚举只能创建有限的几个值的变量,每周七天,
枚举名.值名
注意:默认的情况下,在枚举变量被声明时,其值被设置为0;
修改枚举的默认值;默认为0, 你可以改为1开始.
修改枚举的底层类型:
枚举的底层类型是int ,实际也可以包含其他的数值数据类型,枚举也是对象。存在一些可用于枚举的内置方法。
重载方法:
多态指的是即使提供不同的选项,也能得到相同的结果。重载是多态的形式之一;
重载函数:方法重载指的是创建多个名称相同的方法。其中的每个方法在某些方面具备只唯一性,编译器能够区别它们。
使用重载函数,应该保证它们最后执行的结果应该是类似的。不要实现其他的功能。
构造函数重载:
理解方法的特征标: 方法的特征标,由参数个数和类型构成。
int myint (int)
int myint(int[]) 数组做参数,将出错,这不是重载。
每个方法必须有独特的特征标;
接口:用来定义一种程序的协定,用interface定义,修饰符有:new public protected internal private 命名通常以I开头,如IpartA或IpartB
成员:方法,属性,索引器和事件,不能有变量成员,也不能在接口中实现接口成员,不能被实例化,接口成员默认是公共的,不加修饰符。接口必须要由类或结构来实现。
集合:
索引:为了能像数组一样访问的对象
采用 set 和get访问,如:
class MyClass
{
public string []data=new string [5];//索引器
public string this [int index] //构造函数
{
set {
data[index]=value;
};
get {
return data [index];
}
}
}
Class MyClient
{
public static void Main()
{
MyClass mc=new MyClass(); //调用索引器的set属性进行赋值
mc[0]="Atacji";
mc[1]="hidk";
mc[2]="Adfgi";
mc[3]="Adds";
mc[4]="ssdcji";
Console.WriteLine("{0},{1},{2},{3},{4}",mc[0],mc[1],mc[2],mc[3],mc[4],); //依次显示这几个数
}
}
委托与多播
预处理命令
组件与程序集
使用不同数目的参数:
public long Add(params int[] args) // 有了params关键字,编译器会生成一个动态的数组,参数数目是可以变化的。没有这个关键不可以写参数传入,这个参数是可以变化传入的! 可变参数是int类型
{
int ctr=0;
long total=0;
for(ctr=0;ctr<args.Lengh;ctr++)
{
total+=args[ctr];
}
return total;
}
class Test
{
static void Main()
{
long Total=0;
Total=AddEm.Add(1);
Total=AddEm.Add(1,2);
Total=AddEm.Add(1,2,3);
Total=AddEm.Add(1,2,3,4);
Total=AddEm.Add(1,4,5,22,5);
}
}
使用Params来指定多种数据类型:
public static void Print(params object[] args) //这个类型是 object 类型,可以接收任何类型传入的参数
print(100)
print(203.44) print()也可以调用,但不输出任何东西
print('c')
print("abc") 以上参数都可以传进去,object[]args 其实就是一个动态的数组,把参数放在数组里,然后再读取出来。
详谈 params
当值被传递给方法时,编译器首先查看是否有匹配的方法,如果有,就调用该方法,如果没有,就查看是否有包含参数 params 的方法,如果找到了,就使用它。编译器将这些值放到一个数组中,并并将该数组传递给方法 。 编译器会生成一个类型相同的数组,并作为参数传入方法。
Main方法和命令参数:
Main是一个特殊的方法,它总是先被调用,它也可以接收不同数目的参数,但不需要在Main方法中使用关键字,params .
之所以不用,是由于命令行参数将自动加入到一个字符串数组中。这基本上与params功能相同,由于命令行参数已被加入到一个数组中,因此不需要使用关键字params 。
声明Main方法时,如果期望传递参数,标准的做法是使用下面的格式,
public static int Main(string[] args ) 返回整型用int,返回其他类型则使用void ,参数列表,是名为args的字符串,可以将args改为任何名称,但几乎所有的C#程序员都使用args。
"捕获命令行参数";
c:/code/09> comand xxx 123 456 后面的都是命令行参数
作用域:
变量的寿命及其可访问性被称谓作用域,作用域有许多级别,最常用的是两个局部和全局。
全局作用域指的是整程序清单都可见,小范围内可用的变量是局部的!
最小的作用域,是代码块,简单的循环
区分类变量和局部变量;
类作用域限定符: public private
C#不允许在类的外面声明变量
不能用于创建对象的类:
静态方法和数据成员属于类,而不是各个对象。静态类,
私有构造函数;
加上private 可以禁止创建对象 ;
有公有的静态成员,限定符 private 构造函数,可以禁止创建对象,因为有公有静态成员可访问。
再谈名称空间:
给名称空间命名:
任何合法的标识符,必须由标准字符和下划线组成。 描述性名称
声明名称空间:
关键字 namespace 后跟空间名称 ,
名称空间也可以嵌套
using 和名称空间:
using 给名称空间取别名,其次 不必使用完全限定名,访问空间类型更为容易,避免使用全限定名称
使用using 提供别名,using aa=system aa就是sytem的别名
可以将Main()方法声明为私有的,但这样无法访问该方法,要运行程序, Main方法必须是公有的,如果不能在 Main方法所在的类的外面访问它,将无法运行程序。 无法运行程序。
处理异常:
异常是未被捕获的编程错误;
try发送错误命令,而catch 捕获try命令发送的异常。
catch (Exception e) catch 语句能够将异常作为一个参数接受。
给try 语句提供多人catch 语句,
理解异常的处理顺序:
总是先捕获具体的异常,后捕获通用的异常。
使用finally 添加最后执行的操作:
不管try语句中的代码是否成功执行,都需要执行一个代码块,finally 语句块的代码总是会执行。
System.IO名称空间包含了用于发送和接收(输入和输出)信息的例程。
try-catch-finally 语句可以嵌套。