一、为什么需要面向对象:
在面向对象出现之前,结构化程序设计是程序设计的主流,被称为”面向过程“的程序设计。
面向过程的开发方法,通常会存在以下问题:
1、软件复用性差
2、软件可维护性差
3、软件灵活性差
面向对象编程思想中的对象,是一种具有状态(属性)和行为(方法)的数据结构,用于描述现实世界的某个事物,将现实世界的事物模型化。
二、对象与类的关系:
类:对事物的一种抽象定义;
对象:客观存在的具体事物。
2.1、创建类和对象:
声明类:class className //<类名>
{
//Fields<字段> 存储数据
//Properties<属性> 保护字段,对字段的取值和设值进行限定,属性的本质就是两个方法
//Methods<方法> 描述对象的行为
//构造函数 初始化对象(给对象的属性依次赋值)
//类中的成员,如果不加访问修饰符,默认为Private
}
创建对象:className Object=new Constructor(参数列表);
类名 对象名 构造方法()
类是不占内存的,而对象是占内存的。在对象被创建时,会自动调用构造函数初始化对象;
2.2、字段与属性:
1、字段:类的成员,用于描述一类事物的某个特征的变量。
【举例】:Employee类中具有很多的特征(如姓名、年龄等),在定义类时即可用两个字段分别存储员工的姓名和年龄。
class Employee //声明类
{
public String employeeName;//员工的姓名字段
public int emlioyeeAge;//员工的年龄字段
}
Employee employee=new Employee();//创建对象(实例化对象相当于实实在在存在的一个人,类只是抽象的定义一个人的类)
employee.employeeAge=20;//通过对象使用字段,给对象赋值年龄。
2、属性:对字段的封装,用于阻止非法数据的输入,从而保护内部数据的安全。
【封装】:隐藏内部实现、对外提供公共操作的方式。
对象就是封装了数据和操作这些数据的代码的逻辑实体。
在一个对象内部,某些代码和数据不能被外界访问,对象通过这种方式对内部数据提供不同级别的保护,用于防止程序中的隐藏部分由于意外而被改变或被错误操作。
【访问修饰符】:从上到下,私有程度逐渐降低
private:只能在本类中使用
protected:在本类中及其子类中可以使用
internal:同一命名空间(程序集)中的类可以使用
public:所有类均可使用
【举例】:Employee类中具有很多的特征(如姓名、年龄等),在定义类时即可用两个字段分别存储员工的姓名和年龄。
public enum Gender
{
man,
woman
}
class Employee//声明员工类
{
private String employeeName;//员工的姓名字段
public String EmployeeName
{
get { return employeeName; }
set { employeeName = value; }
}
private Gender gender;
public Gender Gender
{
get
{
//在Get方法里对非法值进行限定
if (gender != Gender.man && gender != Gender.woman)
{
gender = Gender.man;
}
return gender;
}
set { gender = value; }
}
private int employeeAge;//员工的年龄字段
public int EmployeeAge
{
get { return employeeAge; }
set
{
//在Set方法里对非法值进行限定
if (value <= 0 || value > 100)
{
employeeAge = 18;
Console.WriteLine("年龄设置错误!");
}
else
{
employeeAge = value;
}
}
}
/// <summary>
///
/// </summary>
public Employee(string name, Gender gender, int age)
{
this.EmployeeName = employeeName;
//在构造函数里对非法值进行限定
if (gender != Gender.man && gender != Gender.woman)
{
gender = Gender.man;
}
this.Gender = gender;
this.EmployeeAge = employeeAge;
}
}
Employee employee=new Employee();//创建对象(实例化对象相当于实实在在存在的一个人,类只是抽象的定义一个人的类)
employee.employeeAge=20;//设值,自动调用属性EmployeeAge中的set访问器
Console.WriteLine("该员工的年龄是:{0}",employee.EmployeeAge);//取值,自动调用属性EmployeeAge中的get访问器
2.3、方法:(实例方法)面向对象程序设计中,对象可以执行的操作被称为方法。
1、方法的定义和调用:
【语法】:访问修饰符 返回值类型 方法名(参数列表)
{
方法体;
}
【注意】:参数列表可以为空,但括号不能省略;存在多个参数时,需要使用逗号分隔。
返回值类型可以是c#中的任意类型;也可以没有返回值,若没有返回值则必须使用Void.
方法体中无论有多少行代码都必须使用括号将其括起来。
【调用】:
a、同一类中的方法直接通过方法名进行调用;
b、同一命名空间不同类中的方法调用方式如下:
⑴、创建对象;//类名 对象名=new 构造方法();
⑵、通过对象名.方法名进行调用。//对象名.方法名();
c、不同命名空间中的方法调用方式如下:
⑴、导入命名空间;//using 命名空间
⑵、创建对象;
⑶、通过对象名.方法名进行调用。
2、构造方法:类被实例化时首先执行的一种特殊方法,用于完成对象属性的初始化操作。(在创建对象的同时将属性初始化)
【注意】:一个类中若没有定义任何构造方法,则运行环境会提供一个无参的构造方法。
【分为】:无参的构造方法和有参的构造方法。
//构造函数,函数名与类名相同
//构造函数没有返回值,连Void都不用
【语法】:访问类名(参数列表)
{
语句块;
}
【举例】:class Employee
{
public Employee(String employeeName,int employeeAge)//创建一个有参的构造函数
{
EmployeeName=employeeName;
EmployeeAge=employeeAge;
}
}
//创建对象
Employee employee=new Employee("Jack",20);
3、静态方法:(类方法)通过satic关键字修饰的方法
【语法】:访问修饰符 static 返回值类型 方法名(参数列表)
{
方法体;
}
静态和非静态的区别
1)、在非静态类中,既可以有实例成员,也可以有静态成员。
2)、在调用实例成员的时候,需要使用对象名.实例成员;
在调用静态成员的时候,需要使用类名.静态成员名;
总结:静态成员必须使用类名去调用,而实例成员使用对象名调用。
静态函数中,只能访问静态成员,不允许访问实例成员。
实例函数中,既可以使用静态成员,也可以使用实例成员。
静态类中只允许有静态成员,不允许出现实例成员。