1、面向过程----->面向对象
- 面向过程就是我们一般人的想法,要办成一件事要先干什么,然后干什么,最后干什么。这样不可避免的每个人在干同一件事的时候因为自身的差异而使用不同的方法,若映射到代码中,则表现为对于不同的主体,每个运行的程序都要重写。
- 面向对象:以被改变的事物为对象,则不管主体的差异,以结果论。不管过程如何,调用这个方法后能实现的功能是相同的,即结果相同。则提高了程序的通用性。
- 我们在代码中描述一个对象,是通过描述这个对象的属性和方法。类比的现实,就是在描述一个人的特征(身高),和行为(吃饭)。
- 对象必须是看得见摸得着的
- 三个特征:封装、继承、多态。
2、类
1. 类是将具有相似属性和方法的一些对象进一步封装获得的一个抽象的概念。
2. 对象是根据类创建出来的:类就是一个盖大楼的图纸,对象就是盖出来的大楼。
3. 比如:张三老师,李四同学,王五爸爸,这三个人都属于“人”类。
4. 需要在项目中另外添加一个类,别忘了加public
- 语法:
[public] class 类名
{
字段;
属性;
方法;
}- 举例:
public string _name;
public int _age;
public char _gender;
public void CHLSS()
{
Console.WriteLine("我叫{0},我今年{1}岁了,我是{2}生,我可以吃喝拉撒睡。", this._name, this._age, this._gender);
} this.关键字的作用见后文。
5. 类的实例化:
创建类的对象的过程。在main函数中使用关键字 new。例子:
Person sunQuan = new Person();
sunQuan._name = "孙全";
sunQuan._age = 23;
sunQuan._gender = '男';
sunQuan.CHLSS();6. 类不占内存,对象占内存
7. 属性:
- 作用:保护字段,对字段的赋值和取值进行限定。
- 本质就是两个方法,
get和set,一个在取值的时候调用,一个在赋值的时候调用。因此,在赋值和取值的时候,虽然使用的是属性,实际上还是存在字段中,属性不存值。因此在类中字段应被保护起来。例子:
private string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
private int _age;
public int Age
{
get { return _age; }
set { _age = value; }
}
private char _gender;
public char Gender
{
get { return _gender; }
set { _gender = value; }
}
public void CHLSS()
{
Console.WriteLine("我叫{0},我今年{1}岁了,我是{2}生,我可以吃喝拉撒睡。", this.Name, this.Age, this.Gender); Person sunQuan = new Person();
sunQuan.Name = "孙全";
sunQuan.Age = 23;
sunQuan.Gender = '男';
sunQuan.CHLSS();
Console.ReadLine();- Field 字段;Method 方法;Property 属性;
- 限定字段的方法
对set进行限定,例子:
public int Age
{
get { return _age; }
set
{
if (value < 0 || value > 100)
{
value = 0;
}
_age = value;
}
}对get进行限定,例子:
public char Gender
{
get
{
if (_gender != '男' && _gender != '女')
{
return _gender = '空';
}
return _gender;
}
set { _gender = value; }
}- 既有get()又有set()我们称之为可读可写属性;只有get()为只读属性;只有set()为只写属性。
8. 对象的初始化:
当我们创建好一个类的对象后,需要给这个对象的每个属性去赋值。这个过程就是对象的初始化。
3、访问修饰符
- public:公开的公共的,在哪都能访问
- private:私有的,只能在当前类的内部进行访问
- 类中的对象,如果没有标明访问修饰符,默认是private
4、静态和非静态
- 在非静态类中,既可以有实例成员(非静态),也可以有静态成员;而静态类中只能有静态成员。
- 在调用实例成员的时候,需要使用
对象名.实例成员();
在调用静态成员的时候,需要使用类名.静态成员();
因此,静态类不能new,也就是不能实例化。原因在于,调用静态类的时候使用的是类名,而不是对象名。 - 总结:静态成员必须用类名去调用,是实例成员使用对象名调用
静态方法中,只能访问静态成员,不允许访问实例成员;实例方法中都可以使用。 - 使用:
1)如果你想要你的类当做一个“工具类”去使用,这个时候可以考虑将其写成静态类。
2)静态类在整个项目中资源共享 - 只有在程序全部结束之后,静态类才会释放资源。因此应尽量少写静态类。
5、构造函数
- 作用:帮助我们初始化对象(给对象的每个属性依次的赋值)
- 构造函数是一个特殊的方法:
1)构造函数没有返回值,连void也不能写。
2)构造函数的名称必须跟类名一样。 - 创建对象的时候会执行构造函数
- 举例:
public Student(string name, int age, char gender, int chinese, int math, int english)
{
this.Name = name;
this.Age = age;
this.Gender = gender;
this.Chinese = chinese;
this.Math = math;
this.English = english;
}
public Student(string name, int age, char gender):this(name, age, gender, 0, 0, 0)
{
}- 构造函数可以重载
- 新建的类中会有一个默认的无参数的构造函数,当我写一个新的构造函数之后,不管是不是无参数的,都会替代那个默认的构造函数。如果需要指定的无参构造函数,则需要自己来写(用处是可以使用重载的方法,再加一个无参的)。
6、new关键字
Student zsStudent = new Student("张三", 18, '男', 100, 99, 100);在上述代码中,new帮助我们做了三件事:
- 在内存中开辟了一块空间
- 在开辟的空间中创建对象
- 调用对象的构造函数进行初始化对象
7、this关键字
- 代表当前类的对象
- 在类当中显式的调用本类的构造函数,举例:
public Student(string name, int age, char gender, int chinese, int math, int english)
{
this.Name = name;
this.Age = age;
this.Gender = gender;
this.Chinese = chinese;
this.Math = math;
this.English = english;
}
public Student(string name,int chinese,int math,int english):this(name,0,'c',chinese,math,english)
{
}- 在输出属性的时候,为了和局部变量区分,最好加上this.
8、析构函数
- 当程序结束时,析构函数执行
- 作用:帮助我们释放资源
- 举例:
~Student()
{
Console.WriteLine("我是析构函数");
}
评论