面向对象程序设计
5.1 面向对象程序设计概述
-
类和对象
类是对象的抽象,对象是类的具体 -
属性,方法和事件
属性是对象的特征,
方法:类比函数,用于实现各种功能,
事件是是对象能够识别和响应的某些操作 -
封装:就是将一些数据和操作封装起来形成类
封装具有隐蔽性,能够保护数据,被封装的数据和方法只有通过公共接口才能被外界访问 -
继承:从基类中继承,扩展了新的属性和方法,成为基类的派生类,原来的类就是这个其派生类的基类
-
重载和重写
重载:方法名相同,参数类型或参数个数不同就会有不同的具体实现形式
重写:方法名相同,参数个数和参数类型相同,但是实现形式不同
在基类中定义可以重写的方法(Overrideable)的方法,在派生类中利用覆盖(Override)可以对基类中已声明的可重写的方法重新实现 -
面向对象的优点
维护简单:类是独立的
可扩充性:
代码重用
多态性:一个接口,多个方法
5.2 类
-
类的声明
**public class Person**
public(公有类):修饰符,其他还有:protected(保护类,只能从类的内部和其派生类访问),internal,private,abstract(抽象类,不允许创建类的对象),sealed(密封类,不能派生)
-
类的成员:数据成员和函数成员
数据成员:字段和常量
函数成员:属性,方法,委托,事件,索引器,运算符,构造函数,析构函数 -
字段:public int n;
若没有声明修饰符,默认为private -
常量字段:public const int n;——使用const修饰
-
只读字段:public readonly int n;——使用readonly修饰
创建对象必须有new
5.3 对象
-
创建类的对象
Person p = new Person();
p是属于对象引用变量
-
访问对象中的字段
P.pno; -
调用对象的方法
P.setdat(); -
类对象的内存空间分配方式
P:对象引用变量分配在栈空间中,对象实例分配在堆空间中
所以多个对象引用变量可以指向同一个实例
5.4 命名空间
using System
namespace myProj{}
using可以为命名空间中的类指定别名
eg.using myns = System.Math;
myns.Sin(0.5)就相当于System.Math.Sin(0.5);
命名空间可以嵌套
namespace N1
{
namespace N2
{
class A2{}
}
}
5.5 构造函数
在创建对象时自动执行的类方法
一般类会默认自带一个无参数的构造函数
若自己定义一个带参数的构造函数,那么要手工编写一个无参数的构造函数
可以有多个构造函数,但是所有构造函数的名称必须与类名相同,参数各不相同
构造函数不可被继承
构造函数不能像其他方法那样调用
声明类对象时,根据传递的参数类型或个数决定调用哪个构造函数
eg. public class Tpoint1
{
public Tpont1(); //没有返回类型,既不是返回值函数,也不是void函数
public Tpoint1(int x1,int y1)
{
x = x1;
y = y1;
}
}
- 析构函数——对象被销毁时执行的方法
- ~Tpoint1()
//前面加“~”
现在程序执行到最后都会自动销毁,就会执行这个析构函数
5.6 静态成员
静态:为了实现数据共享
- 静态字段
eg. static int f2;
//创建出来的对象实例中的f2储存的数据都是相同的且以最终变动后的 - 静态方法
eg.static public void add();
静态方法的使用是 类名.方法 - 静态构造函数
一个类只能有一个静态构造函数,且不带参数
静态构造函数不会被继承
在类的任何实例或任一静态成员被引用之前自动调用静态构造函数
所有的构造函数中静态构造函数最先执行
5.7 属性
- 属性的声明
eg.
public double Hours
{
get{return seconds/3600;}
set{second = value*3600;}
}
set 访问器可以当成一个方法,其总是拥有一个单独的,隐式的值参数value