在前面的章节里我们学习了.NET和C#的基础和C#编程基础,相信大家基本上已经熟练掌握了,而本章我们将学习新的内容——面向对象编程基础。
(一)什么是面向对象
面向对象其实就是一种程序设计思想,面向对象也叫OOP,是一种基于面向过程的程序开发思想。面向对象的好处在与:1.可以多人合作且方便;2.减少代码的冗余,灵活性高;3.代码的可用性发挥到极致;4.可扩展性强。
(二)面向对象和面向程序的区别
面向过程:编程思路集中的是过程上。
面向对象:编程思路集中在参与的对象上。
例如我们去吃饭:
面向过程:点菜——炒菜——上菜——吃饭——结账
面向对象:客人,服务员,厨师
(三)对象、类、实例化
在面向对象编程里面,最常见的概念就是对象、类和实例化,下面我将分别进行介绍。
对象是具体存在的事物,比如人类,书桌,动物,车等等,而对象又由两部分组成。通常都会把对象划分为两个部分,即静态部分和动态部分。静态部分顾名思义就是不能动的那部分,这个部分也被称为“属性”,任何的对象都具备自身属性,比如人的高矮胖瘦,性别年龄等。而具有这些属性的人会执行哪些动作也是我们应该探讨的部分,这个人会哭泣、说话和微笑等是这个人所具备的行为(动态部分)。
例
步骤。
(1)可以抽象出一个对象,这里抽象的对象是小狗。
(2)识别这个对象的属性。对象具备的属性都是静态属性如小狗有一双脚,一个脑袋等。
(3)识别这个对象的动态行为,即这只小狗可以进行的动作,如叫,吃东西等(4)识别出这些对象的属性和行为后,这个对象就被定义完成。
究其本质,所有的小狗都是具有以上的属性和行为的,可以将这些属性和行为封装起来以描述小狗这类动物。因此,类实际上就是封装对象属性和行为的载体,对象则是类抽象出的一个实例,而根据类创建对象的过程就是一个实例化的过程。
简单来说就是:(1)对象是具体存在的事物,对象由属性(变量)和方法(函数)组成;(2)类是具有相同属性和行为的一组对象的集合;(3)在开发的时候我们应该先写类,然后通过类来创建对象,在通过对象和调用方法和属性;(4)一个类可以创建多个对象。
(四)面向对象程序设计语言的三大原则
面向对象程序设计具有封装、继承和多态三大基本原则,分别如下:
1、封装
封装是面向对象编程的核心思想,将对象的属性和行为封装起来,而将对象的属性和行为封装起来的载体就是类,类通常对客户隐藏其实现细节。
2、继承
当处理一个问题时,可以将一些有用的类保留下来,在遇到同样问题时拿来复用,这就是继承的基本思想。继承性主要是利用特定对象之间的共用属性。子类继承父类,子类可以直接访问父类。
3、多态
多态的发生必须有继承关系,多态是指父类对象拥有子类的形态,并且可以表现出子类的特性。
(五)类的相关知识
1、类的声明
类是使用class关键字来声明,语法如下:
类修饰符 class 类名
{
}
以汽车为例声明一个类,代码如下:
public class Car
{
public int number;//编号
public int color;//颜色
public string brand;//厂家
}
常用的几个类修饰符
New:仅允许在嵌套类声明时使用,表明类中隐藏了由基类中继承而来的、与基类中同名的成员。
Public:不限制对该类的访问。
Protected:只能从其所在类和所在类的子类(派生类)进行访问。
Internal:只有其所在类才能访问。
Private:只能访问此类。
Abstract:抽象类,不允许建立类的实例且必须有重写。
Sealed:密封类,不允许被继承且不能重写。
2、类的成员
类的定义包括类头和类体,其中,类头就是使用class定义的类名,而类体是用一对大括号{}括起来的,在类体中主要定义类的成员。类的成员包括字段、属性、方法、构造函数、事件、索引等。(1)其中字段就是程序开发中常见的常量或者变量,它是类的一个构成部分,它使得类和结构可以封装成字段。(2)枚举:是值类型数据,主要用于声明一组具有相同性质的常量。(3)属性:是对现实实体特征的抽象,提供对类或对象的访问;属性根据get和set访问器可以分为可读可写属性(包含get和set访问器)、只读属性(只包含get访问器)和只写属性(只包含set访问器)
private int age; //定义字段
public int Age //定义属性
{
get //设置get访问器
{
return age; //返回age
Console.WriteLine(age);//输出
}
set //设置set访问器
{
if(vaule > 0 && value < 130) //满足要求就将值赋给字段
{
age=value;
}
else
{
Console.WriteLine("输入数据不合理!");
}
}
}
3、构造函数和析构函数
(1)构造函数
构造函数是在创建给定类型的对象时执行的类方法,构造函数具有与类相同的名称,它通常初始化新对象的数据成员。不带参数的构造函数称为“默认构造函数”。无论何时,只要使用new运算符创建对象,并且不为new提供任何参数,就会调用默认构造函数;另外,用户也可以自己自定义构造函数,并在构造函数中设置参数。
class Program
{
public int x = 3; //定义变量
public int y = 5;
public int z = 0;
public Program()
{
z = x + y;
}
static void Main(string[] args)
{
Console. WriteLine(“{0}+{1}={2}”,23,34,Program.z);
Console.ReadLine();
}
}
(2)析构函数
以类名加~来命名的。
(六)对象的创建和使用
1、对象的创建
在C#中使用new操作符调用构造函数来创建对象
例 Test test=new Test(“a”)
参数说明
参数 | 说明 |
Test | 类名 |
test | 创建Test类对象 |
new | 创建对象操作符 |
a | 构造函数的参数 |
2、访问对象的属性和行为
当用户使用new操作符创建一个对象后,可以使用“对象.类成员”来获取对象的属性和行为。
3、对象的引用
对象的引用有两种:(1)类名 对象引用名称;(2)引用与对象关联:类名 对象名=new 类名();
4、对象的销毁
C#会自动销毁
(七)this关键字
先看下列代码,我将从这段代码中来讲解this的作用。
private void setName(String name) //定义一个setName方法
{
This.name=name; //将参数值赋予类中的成员变量
}
在C#中可以使用this关键字来代表本类对象的引用,this关键字被隐式地用于引用对象的成员变量和方法。如上述代码中,this.name指某个类中的成员变量,而this.name=name语句中的第二个name则指的是形参name。实际上setName方法实现的功能就是将形参name的值赋予成员变量name。
This可以调用成员变量和成员方法,但C#中最常用的调用方法是使用“对象.成员变量”或者“对象.成员方法”进行调用。
(八)方法
1、方法的声明
语法格式:
修饰符 返回值类型 方法名(参数列表)
{
//方法的具体实现;
}
修饰符可以是private(默认)、public、protected和internal这4个中的任意一个。返回值类型指定了方法返回数据的类型,可以是数据类型,如果不需要返回一个值,则使用void关键字。参数列表是用逗号分隔的类型、标识符,如果方法中没有参数,则为空。
2、方法的参数
调用方法时可以给该方法传递一个或多个值,传递给方法的值叫作实参,在方法内部,接收实参的变量叫作形参,形参紧跟着方法名的括号中声明,形参的声明语法与变量的声明语法语言。形参只能在括号内部有效。参数可以为值参数、ref参数、out参数和params参数。
(1)值参数
值参数就是在声明时不加修饰的参数,它表明实参与形参之间按值传递,且形参的改变不会影响实参。
(2)ref参数
该参数使形参按引用传递,在方法中对形参所做的任何更改都将反映在实参上,即形参的改变会影响实参。
(3)out参数
out参数用来定义输出函数,它会导致参数通过引用来传递,这与ref参数类似,不同之处在于:ref要求变量必须在传递之前进行赋值,而out定义的参数,无须进行赋值即可使用。
(4)params参数
声明方法时,如果有多个相同数据类型,可以定义为params参数。Params参数是一个一维数组,主要用来指定在参数数目可变时所采用的方法参数。
(九)静态方法和实例方法
静态(static)方法:不对特定实例进行操作,在静态方法中使用this会导致编译错误,调用静态方法时,使用类名直接调用。
class Program
{
public static int Add(int x, int y ) //定义静态方法实现整形数相加
{
return x+y;
}
static void Main(string[] args)
{
Console. WriteLine(“{0}+{1}={2}”,23,34,Program.Add(23,24));
Console.ReadLine();
}
}
运行结果为:
23+34=57
实例方法:是对类的某个给定的实例进行操作,使用实例方法时,需要使用类的对象调用,而且可以用this来访问该方法。
class Program
{
public int Add(int x, int y ) //定义实例方法实现整形数相加
{
return x+y;
}
static void Main(string[] args)
{
Console. WriteLine(“{0}+{1}={2}”,23,34,Program.Add(23,24));
Console.ReadLine();
}
}
运行结果为:
23+34=57
(十)方法的重载
方法的重载是指方法名相同,但参数的数据类型、个数或顺序不同的方法。主要类中由两个及以上的同名方法,使用的参数类型、个数或顺序不同,调用时,编译器就可判断在哪种情况下调用哪种方法。
总结:
1、 类的概念是什么?类是具有相同特征和行为的一类事物的统称。
2、 对象的概念是什么?对象是现实生活中具有唯一标识的实体。
3、 类与对象的关系是什么?对象是类的实例,类是对象的抽象。
4、 类的关键字是 class,假设目前有一个Student类,请问如何创建这个类的对象?Student stu=new Student()。
5、 通过什么方式调用类中的成员?对象名.成员名 对象名.方法名()。
6、 OOP指的是什么,有什么优点?其三大特征是?面向对象编程,优点:易维护、易扩展、代码重用、灵活性好;特征:封装、继承、多态。
7、 类中的特征使用 字段 来描述,类的行为使用方法来描述。
8、 属性的优点是什么?保证字段读写操作的安全性和灵活性。
9、 属性中有哪几个访问器,请分别说明其作用 get{//只读} set{//只写}。
10、 方法重载的特征是什么?在同一个类中,方法名相同,参数个数或参数类型不同。
11、 构造函数的特征是什么?方法名与类名相同,无返回值类型。
12、 构造函数的作用是什么?在使用new关键字创建对象时给对象的成员赋初始值。
13、 构造函数的什么时候被调用?使用new关键字创建对象时。
14、 集合的主要特性有哪些?动态改变大小、可存储任意类型的对象、提供一系列操作集合中对象的方法。
15、举常用的5个常用的值类型和3个常用的引用类型?值类型:int、double、float、bool、enum、datetime;引用类型:string、类、数组、接口