C#面向对象基础01
1.类的基本概念
C#语言是一种现代、面向对象的语言。面向对象程序设计方法提出了一个全新的概念:类,它的主要思想是将数据(数据成员)及处理这些数据的相应方法(函数成员)封装到类中,类的实例则称为对象。这就是我们常说的封装性。
1.1类的基本概念
类可以认为是对结构的扩充,它和C中的结构最大的不同是:类中不但可以包括数据,还包括处理这些数据的函数。类是对数据和处理数据的方法(函数)的封装。类是对某一类具有相同特性和行为的事物的描述。例如,定义一个描述个人情况的类Person如下:
代码语言:javascript复制using System;
class Person//类的定义,class是保留字,表示定义一个类,Person是类名
{
private string name="张三";//类的数据成员声明
private int age=12;//private表示私有数据成员
public void Display()//类的方法(函数)声明,显示姓名和年龄
{
Console.WriteLine("姓名:{0},年龄:{1}",name,age);
}
public void SetName(string PersonName)//修改姓名的方法(函数)
{
name=PersonName;
}
public void SetAge(int PersonAge)
{
age=PersonAge;
}
}
Console.WriteLine(“姓名:{0},年龄:{1}”,name,age)的意义是将第二个参数变量name变为字符串填到{0}位置,将第三个参数变量age变为字符串填到{1}位置,将第一个参数表示的字符串在显示器上输出。 大家注意,这里我们实际定义了一个新的数据类型,为用户自己定义的数据类型,是对个人的特性和行为的描述,他的类型名为Person,和int,char等一样为一种数据类型。用定义新数据类型Person类的方法把数据和处理数据的函数封装起来。类的声明格式如下: 属性 类修饰符 class 类名{类体} 其中,关键字class、类名和类体是必须的,其它项是可选项。类修饰符包括new、public、protected、internal、private、abstract和sealed,这些类修饰符以后介绍。类体用于定义类的成员。
1.2 类成员的存取控制
一般希望类中一些数据不被随意修改,只能按指定方法修改,既隐蔽一些数据。同样一些函数也不希望被其它类程序调用,只能在类内部使用。如何解决这个问题呢?可用访问权限控制字,常用的访问权限控制字如下:private(私有),public(公有)。在数据成员或函数成员前增加访问权限控制字,可以指定该数据成员或函数成员的访问权限。 私有数据成员只能被类内部的函数使用和修改,私有函数成员只能被类内部的其它函数调用。类的公有函数成员可以被类的外部程序调用,类的公有数据成员可以被类的外部程序直接使用修改。公有函数实际是一个类和外部通讯的接口,外部函数通过调用公有函数,按照预先设定好的方法修改类的私有成员。对于上述例子,name和age是私有数据成员,只能通过公有函数SetName()和SetAge()修改,既它们只能按指定方法修改。 这里再一次解释一下封装,它有两个意义,第一是把数据和处理数据的方法同时定义在类中。第二是用访问权限控制字使数据隐蔽。
1.3 类的对象
Person类仅是一个用户新定义的数据类型,由它可以生成Person类的实例,C#语言叫对象。用如下方法声明类的对象:Person OnePerson=new Person();此语句的意义是建立Person类对象,返回对象地址赋值给Person类变量OnePerson。也可以分两步创建Person类的对象:Person OnePerson;OnePerson=new Person();OnePerson虽然存储的是Person类对象地址,但不是C中的指针,不能象指针那样可以进行加减运算,也不能转换为其它类型地址,它是引用型变量,只能引用(代表)Person对象,具体意义参见以后章节。和C、C 不同,C#只能用此种方法生成类对象。 在程序中,可以用OnePerson.方法名或OnePerson.数据成员名访问对象的成员。例如:OnePerson.Display(),公用数据成员也可以这样访问。注意,C#语言中不包括C 语言中的->符号。
1.4 类的构造函数和析构函数
在建立类的对象时,需做一些初始化工作,例如对数据成员初始化。这些可以用构造函数来完成。每当用new生成类的对象时,自动调用类的构造函数。 因此,可以把初始化的工作放到构造函数中完成。构造函数和类名相同,没有返回值。例如可以定义Person类的构造函数如下: public Person(string Name,int Age)//类的构造函数,函数名和类同名,无返回值。 { name=Name; age=Age; } 当用Person OnePerson=new Person(“张五”,20)语句生成Person类对象时,将自动调用以上构造函数。请注意如何把参数传递给构造函数。 变量和类的对象都有生命周期,生命周期结束,这些变量和对象就要被撤销。类的对象被撤销时,将自动调用析构函数。一些善后工作可放在析构函数中完成。析构函数的名字为类名,无返回类型,也无参数。Person类的析构函数为 Person()。C#中类析构函数不能显示地被调用,它是被垃圾收集器撤销不被使用的对象时自动调用的。 1.3.5 类的构造函数的重载 在C#语言中,同一个类中的函数,如果函数名相同,而参数类型或个数不同,认为是不同的函数,这叫函数重载。仅返回值不同,不能看作不同的函数。这样,可以在类定义中,定义多个构造函数,名字相同,参数类型或个数不同。根据生成类的对象方法不同,调用不同的构造函数。例如可以定义Person类没有参数的构造函数如下: public Person()//类的构造函数,函数名和类同名,无返回值。 { name=“张三”; age=12; } 用语句Person OnePerson=new Person(“李四”,30)生成对象时,将调用有参数的构造函数,而用语句Person OnePerson=new Person()生成对象时,调用无参数的构造函数。由于析构函数无参数,因此,析构函数不能重载。
1.5 使用Person类的完整的例子
下边用一个完整的例子说明Person类的使用:(VisualStudio.Net编译通过)
代码语言:javascript复制using System;
namespace e1//定义以下代码所属命名空间,意义见以后章节
{
class Person
{
private String name="张三";//类的数据成员声明
private int age=12;
public void Display()//类的方法(函数)声明,显示姓名和年龄
{
Console.WriteLine("姓名:{0},年龄:{1}",name,age);
}
public void SetName(string PersonName)//指定修改姓名的方法(函数)
{
name=PersonName;
}
public void SetAge(int PersonAge)//指定修改年龄的方法(函数)
{
age=PersonAge;
}
public Person(string Name,int Age)//构造函数,函数名和类同名,无返回值
{
name=Name;
age=Age;
}
public Person()//类的构造函数重载
{
name="田七";
age=12;
}
}
class Class1
{
static void Main(string[] args)
{
Person OnePerson=new Person("李四",30);//生成类的对象
OnePerson.Display();
//下句错误,在其它类(Class1类)中,不能直接修改Person类中的私有成员。
//OnePerson.name="王五";
//只能通过Person类中公有方法SetName修改Person类中的私有成员name。
OnePerson.SetName("王五");
OnePerson.SetAge(40);
OnePerson.Display();
OnePerson=new Person();
OnePerson.Display();
}
}
}
键入CTRL F5运行后,显示的效果是: 姓名: 李四,年龄:30 姓名: 王五,年龄:40 姓名: 田七,年龄:12
属性卡开头大写 字段开头小写