第4章 面向对象程序设计入门

4.1 面向对象的基本概念

4.1.1 对象

=+()

4.1.2 事件与方法

事件
又称消息,表示一个对象向另一个对象发出的服务请求。
方法
表示一个对象能完成的服务或执行的操作功能。

在面向对象中的系统就是依靠时间来驱动其运转的,新的事件一旦发生,系统中的相关对象的操作开始执行,结果是系统的状态就会发生改变。

4.1.3 类与对象

4.1.4 抽象、封装、继承与多态

abstraction, encapsulation and information hiding, ,polymorphism

多态性是指在基类中定义的数学或方法被派生类继承后,可以表现出不同的行为特征,对同一消息会做出不同的响应。

为了实现多态性,通常需要在派生类中更改从基类中继承来的方法。这种为了替换积累的部分内容而在派生类中重新定义的方法,称为覆盖。这样一来,不同的对象可以响应同名的消息(方法)来完成特定的功能,带其具体的实现却可以不同。

4.2 类的定义与使用

4.2.1 类的声明和实例化

1. 类的声明
2. 类的实例

4.2.2 类的可访问性

声明 含义
public
internal 只允许当前程序集内部使用
protected 只允许该类及其派生类使用
private
protected internal 结合之

命名空间不允许使用访问修饰符。

4.2.3 值类型与引用类型

  1. 值类型

  2. 引用类型

  3. 装箱和拆箱

引用类型也允许类型转换

装箱[隐式转换]

int i = 100;
object x = i;

拆箱[必须是显式转换]

int i = 100;
int k= (int)x;

4.3 类的成员及其定义

数据成员 其他
常量,字段,属性 方法,构造函数,索引器,事件

4.3.1 类的常量与字段成员

1. 常量

符号变量,编译时即可确定值

public const double pi = 3.14;

2. 字段
字段表示累的成员变量,字段的值代表一个对象的数据状态。 换一种新说法而已

需要注意
1. 字段通过readonly关键字可设置为只读。
2. 只读字段运行时确定值;

常量和字段描述了类的数据信息

4.3.2 类的属性成员

限制对字段的读写操作,或验证数据的正确性和一致性。

get, set 访问器

public double R 
{
    get
    {
        return r;
    }

    set{
        if(value <= 0)
            r = 0;
        else
        r = value;
    }
}

4.3.3 类的方法成员

1. 方法的声明

修饰符包括 publicprotectedprivateinternal

2. 方法的调用

  • 同一类中直接调用方法
  • 在类外部通过实例调用,静态方法通过类名调用

4.3.4 类的构造函数

默认构造函数
不包含任何参数和语句的构造函数,系统为数据成员初始化为各自的默认值

但C#允许重新定义默认构造函数

4.4 方法的参数传递

4.4.1 按值传参

注意
stringobject 虽然是引用型数据,但是从表现形式上来看,其具有按值传参的效果。

4.4.2 按引用传参

当值类型和 string 类型参数要按引用传参是,可以通过 ref 关键字来声明引用参数,无论是形参还是实参,只要希望传递数据的引用,就必须添加 ref 关键字。

// 声明
public string Swap(ref int x, ref int y)

// 调用
x.Swap(ref a, ref b)

4.4.3 输出参数

定义
输出参数不需要对实参进行初始化,它专门用于把方法中的数据通过形参返回给实参,但不会将实参的值传递给形参。
// 声明
public void SplitPath(string path, out string dir, out string filename)

// 调用
string dir, file;
a.Split(path, out dir, out file)

通过out关键字声输出参数

总结
ref, out 声明时需要有类型标识,调用时只需要变量名就可以了。它们都是针对普通变量。

4.4.4 引用类型的参数

引用类型参数总是按引用传递的,所以引用类型参数传递不需要使用refout关键字(string 除外)。引用类型参数的传递,实际上是将实参变量对数据的引用复制给了形参变量,所以形参变量与实参变量共同指向同一个内存区域。

4.4.5 数组型参数

数组也是引用类型参数,把数组作为参数传递时,也是引用传参。但把数组作为参数,有两种使用方式:一种是在形参数组前不添加params修饰符,另一种是在形参数组前添加params修饰符。不添加params修饰符时,所对应的实参必须是一个数组名。添加params修饰符时,所对应的实参可以是数组名,也可以是数组元素值得列表,此时,系统将自动把各种元素值组织到形参数组中。

// 声明
int Max(int[] a)
{
}

// 调用 
int n = Max(x);
// 声明 
int Max2(params int[] a)
{
}

// 调用 
int n = Max2(1, 2, 3, 4, 5);

4.5 方法的重载

4.5.1 方法的重载

4.5.2 构造函数的重载

public Student(string name):this(name, 20);

4.6 对象的生命周期

4.6.1 对象的生命周期

  1. 使用new运算符创建对象并要求获得内存;
  2. 自动调用构造函数完成对对象的初始化;
  3. 使用对象;
  4. 释放对象所占用的资源,如关闭磁盘文件、网络连接和数据库服务器;
  5. 释放对象回收内存(由垃圾回收器完成)。

4.6.2 析构函数

~fun()
{ }

无法继承或重载析构函数!

不推荐使用,性能较差。

你可能感兴趣的:(第4章 面向对象程序设计入门)