第3章 面向对象的编程基础
目前流行的各类应用软件,从本质上来说,都是计算机对现实世界的模拟。现实世界中的实体对象,在软件系统中,均表现为需要处理的数据。在面向对象的系统中,这是通过类和对象来表示的。
在面向对象概念中,类是封装数据的基本单位。类是一组具有相同数据结构和相同操作的对象的集合,用来定义对象可执行的操作,比如方法、事件、属性等。类的实例是对象,可以通过调用对象的属性、方法、事件,来访问对象的功能。
类和对象的区别可以用现实生活中的例子来说明。如果把汽车看成是一个类的话,则生活中的每一辆汽车都是一个对象,也可以说是类的一个实例。
3.1.1 类的组织
与类有关的一些基本概念有:类的声明、对象的生存周期、字段和局部变量、静态成员与实例成员以及访问修饰符等。
1. 类的声明
在C#中使用class定义类,声明类的形式为:
[附加声明] [访问修饰符] class 类名称[:[基类] [,接口序列]]
{
[字段声明]
[构造函数]
[方法]
[事件]
}
其中,[ ]中的内容为可选项,冒号(:)后面表示被继承的类或者接口。
当一个类从另一个类继承时,被继承的类叫做基类。注意,在C#中,基类只能有一个。但是一个类可以继承自多个接口,当接口序列多于一项时,各项之间用逗号分开。如果既有基类又有接口,则要把基类放在冒号后面的第一项,然后才是接口名。
例3-1说明如何声明类、字段、构造函数和方法,同时说明如何实例化对象以及如何输出实例数据。例中声明了两个类,一个是Child类,另一个是包含Main方法的Program类。
【例3-1】声明类、字段、构造函数和方法。
using System;
using System.Collections.Generic;
using System.Text;
namespace StatementExample
{
public class Child
{
private int age;
private string name;
// 不带参数的构造函数
public Child()
{
name = "none";
}
// 带参数的构造函数
public Child(string name, int age)
{
this.name = name;
this.age = age;
}
// 输出方法
public void PrintChild()
{
Console.WriteLine("{0}, {1} years old.", name, age);
}
}
public class Program
{
public static void Main()
{
//使用new关键字创建对象,new后是调用的构造函数
Child child1 = new Child("Zhang San", 11);
Child child2 = new Child("Li Si", 10);
Child child3 = new Child();
// 显示结果
Console.Write("Child #1: ");
child1.PrintChild();
Console.Write("Child #2: ");
child2.PrintChild();
Console.Write("Child #3: ");
child3.PrintChild();
Console.ReadLine();
}
}
}
输出结果:
Child #1: Zhang San, 11 years old.
Child #2: Li Si, 10 years old.
Child #3: none, 0 years old.
对象的生存周期并不是其所在的区域决定的,它包含以下特性:
1) 对象在被创建时分配内存,创建对象实际上做了两个方面的工作:使用new保留字要求系统分配内存;使用构造函数初始化数据。
2) 和Java相似,C#也是采用垃圾回收机制自动销毁对象,即在适当的时候自动启动回收机制,然后检测没有被引用的对象并将其销毁。实际上,销毁对象也是做了两个方面的工作:释放占用的内存;将分配给对象的内存归还给堆(Heap)。